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

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.