Cisco
v++
srv6

VPPでSRv6を動かしてみた

  1. はじめに
  2. VPPってなに?
  3. VPP install編
  4. SRv6設定してみた
  5. おわりに

はじめに

この記事はシスコの同志による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の設定例は以下にあるのでガリガリ設定してみます。

VPP/Segment Routing for IPv6

完全に上記の例の通りにやってみます。

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も充実していないので、今後に期待というところでした。