- はじめに
- VPPってなに?
- VPP install編
- SRv6設定してみた
- おわりに
はじめに
この記事はシスコの同志によるCisco Systems Japan Advent Calendar 2017の14日目です。
今年一年間Segment Routingばかりやっていたので、最後にSRv6を動かしてみたいと思います。
Segment Routing自体の説明はこちらをご参照ください。
Segment Routingチュートリアル
現時点でSRv6が動くのは製品含めてほとんどないため、Open sourceのSoftwareであるVPP(Vector Packet Processing)を使ってみました。
VPPってなに?
VPPとはFD.ioプロジェクトで管理しているOpen sourceの仮想スイッチ&ルータです。
世界で一番最初にSRv6を実装したルータじゃないかなと思います。
とにかく色んな機能をサポートしているので、色々遊べると思います。
https://wiki.fd.io/view/VPP/Features
VPP install編
まずInstallから、Ubuntu/Centos等のためにAptもYumも用意されていますが、とりあえずUbuntu16.04でやってみることにしました。
以下のリンク通りに進めようと思いましたが、最新Versionだとはまってしまい、うまくいきませんでした。
Adventカレンダーなので14日に投稿すべくとりあえず稼働実績があるstable.1609でやってみることにします。
以下の手順でさくさくと進めてみます。
FD.io: VPP/Installing VPP binaries from packages
tkamata@tkamata-ubuntu:~$ export UBUNTU="xenial"
tkamata@tkamata-ubuntu:~$ export RELEASE=".stable.1609"
tkamata@tkamata-ubuntu:~$ sudo rm /etc/apt/sources.list.d/99fd.io.list
tkamata@tkamata-ubuntu:~$ echo "deb [trusted=yes] https://nexus.fd.io/content/repositories/fd.io$RELEASE.ubuntu.$UBUNTU.main/ ./" | sudo tee -a /etc/apt/sources.list.d/99fd.io.list
tkamata@tkamata-ubuntu:~$ sudo apt-get update
tkamata@tkamata-ubuntu:~$ sudo apt-get install vpp vpp-plugins
Installがちゃんと成功していると以下のコマンドで起動確認が可能
tkamata@tkamata-ubuntu:~$ sudo service vpp status
* vpp.service - vector packet processing engine
Loaded: loaded (/lib/systemd/system/vpp.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2017-12-13 06:35:44 PST; 1min 28s ago
Process: 922 ExecStartPre=/sbin/modprobe uio_pci_generic (code=exited, status=0/SUCCESS)
Process: 910 ExecStartPre=/bin/rm -f /dev/shm/db /dev/shm/global_vm /dev/shm/vpe-api (code=exited, status=0/SUCCESS)
Main PID: 943 (vpp_main)
CGroup: /system.slice/vpp.service
`-943 /usr/bin/vpp -c /etc/vpp/startup.conf
Dec 13 06:35:45 tkamata-ubuntu vpp[943]: vl_msg_api_config:670: BUG: multiple registrations of 'vl_api_memif_details_t_handler'
Dec 13 06:35:45 tkamata-ubuntu vpp[943]: load_one_plugin:63: Loaded plugin: /usr/lib/vpp_api_test_plugins/memif_test_plugin.so
Dec 13 06:35:45 tkamata-ubuntu vpp[943]: load_one_plugin:63: Loaded plugin: /usr/lib/vpp_api_test_plugins/ioam_pot_test_plugin.so
Dec 13 06:35:45 tkamata-ubuntu vpp[943]: vlib_pci_bind_to_uio: Skipping PCI device 0000:00:03.0 as host interface ens160 is up
Dec 13 06:35:49 tkamata-ubuntu vpp[943]: linux_epoll_file_update:102: epoll_ctl: Operation not permitted (errno 1)
Dec 13 06:35:49 tkamata-ubuntu vpp[943]: linux_epoll_file_update:102: epoll_ctl: Operation not permitted (errno 1)
Dec 13 06:35:49 tkamata-ubuntu vpp[943]: 0: dpdk_ipsec_process:239: not enough Cryptodevs, default to OpenSSL IPsec
Dec 13 06:35:49 localhost vpp[943]: 0: dpdk_lib_init:182: DPDK drivers found no ports...
sudo vppctl
コマンドでVPPのコマンドを実施可能(VPPにTelnetもできます)
tkamata@tkamata-ubuntu:~$ sudo vppctl show int
Name Idx State Counter Count
local0 0 down
VPPの設定は基本的には以下のStartup.confに記載されています
tkamata@tkamata-ubuntu:~$ cat /etc/vpp/startup.conf
unix {
nodaemon
log /tmp/vpp.log
full-coredump
}
api-trace {
on
}
api-segment {
gid vpp
}
17点台では本当は上記設定だけでFlushしてあるIFを自動でvppに追加してくれるはずですが、追加できずハマってしまったので、16点台で手動でPCI IDを追加します。
まずPCI IDを確認します。
tkamata@tkamata-ubuntu:~$ sudo lshw -class network -businfo
Bus info Device Class Description
====================================================
pci@0000:02:01.0 eth32 network 82545EM Gigabit Ethernet Controller (Copper)
pci@0000:03:00.0 eth160 network VMXNET3 Ethernet Controller
次に/etc/vpp/startup.confに以下を追記します。
dpdk {
socket-mem 2048
dev 0000:02:01.0
}
ens 32のIF設定を初期化してからVPPをRestartするとVPPでIFが認識されるのでIP addressを設定してみます。
tkamata@tkamata-ubuntu:~$ sudo ifconfig ens32 down
tkamata@tkamata-ubuntu:~$ sudo ip addr flush dev ens32
tkamata@tkamata-ubuntu:~$ sudo service vpp stop
tkamata@tkamata-ubuntu:~$ sudo service vpp start
tkamata@tkamata-ubuntu:~$ sudo vppctl show int
Name Idx State Counter Count
GigabitEthernet2/0/0 1 down
local0 0 down
tkamata@tkamata-ubuntu:~$ sudo vppctl set int ip address GigabitEthernet2/0/0 192.168.1.1/24
tkamata@tkamata-ubuntu:~$ sudo vppctl set int state GigabitEthernet2/0/0 up
tkamata@tkamata-ubuntu:~$ sudo vppctl show int
Name Idx State Counter Count
GigabitEthernet2/0/0 1 up
local0 0 down
tkamata@tkamata-ubuntu:~$ sudo vppctl show int addr
GigabitEthernet2/0/0 (up):
192.168.1.1/24
local0 (dn):
上記の要領で複数台設定してみれば疎通が確認できます。
SRv6設定してみた
SRv6の設定例は以下にあるのでガリガリ設定してみます。
完全に上記の例の通りにやってみます。
tkamata@tkamata-ubuntu:~$ vppctl set sr encaps source addr C1::
tkamata@tkamata-ubuntu:~$ vppctl sr policy add bsid C1::999:1 next C2:: encap
tkamata@tkamata-ubuntu:~$ vppctl sr steer l3 B::/112 via sr policy bsid C1::999:1
tkamata@tkamata-ubuntu:~$ vppctl show sr pol
SR policies:
[0].- BSID: c1::999:1
Behavior: Encapsulation
Type: Default
FIB table: 0
Segment Lists:
[0].- < c2::, c4::6 > weight: 1
-----------
tkamata@tkamata-ubuntu:~$ vppctl show sr steering policies
SR steering policies:
Traffic SR policy BSID
L3 b::/112 c1::999:1
tkamata@tkamata-ubuntu4:~$ vppctl show sr localsid
SRv6 - My LocalSID Table:
=========================
Address: c4::6
Behavior: DX6 (Endpoint with decapsulation and IPv6 cross-connect)
Iface: GigabitEthernet2/0/0
Next hop: b:c5::b
Good traffic: [0 packets : 0 bytes]
Bad traffic: [0 packets : 0 bytes]
--------------------
パケット通ってないっす。。けどなんかちゃんと動きそうな出力でした。
上記以外ちゃんとしたManualないので、ここで一度諦め。
次回新しいイメージでリトライしてみます。
終わりに
とりあえずSRv6にトライしてみましたが、ここまで来るのになぜか突然VPPが落ちること複数回とまだまだVPPが不安定でManualも充実していないので、今後に期待というところでした。