読者です 読者をやめる 読者になる 読者になる

らくがきちょう

なんとなく

Cisco VIRL 上でパケットキャプチャしてみる

Cisco Network VIRL

今のところ Cisco VIRL 環境の UI(VMMaestro)上ではパケットキャプチャが出来ません。但し、VIRL を動作させている Ubuntu ホストにログインしてパケットキャプチャすることは可能です。YouTube 上でも詳細な手順が公開されています。

今回は実際に Ubuntu ホスト上でのパケットキャプチャを試してみます。

virl-utils について

パケットキャプチャを実行するには概ね、以下の手順を踏む必要があります。

  1. キャプチャ対象となる tap デバイスを特定する
  2. tcpdump でパケットをキャプチャする

tap デバイスを特定するには GitHub で公開されている virl-utils を使う方法があります。利用するには GitHub からソースコードをクローンします。

virl@virl:~$ git clone https://github.com/VIRL-Open/virl-utils
Cloning into 'virl-utils'...
remote: Counting objects: 123, done.
remote: Total 123 (delta 0), reused 0 (delta 0), pack-reused 123
Receiving objects: 100% (123/123), 40.52 KiB | 0 bytes/s, done.
Resolving deltas: 100% (52/52), done.
Checking connectivity... done.

しかし、現状の master ブランチからクローンした virl-utils ではエラーになってしまい、利用出来ませんでした…(時間のある時に原因追求してみます)。

テスト環境

Cisco VIRL のバージョンは 1.0.0 を使いました。ネットワーク構成は MikroTik の CHR を 2 台接続しただけの、シンプルな構成としました。各々のコンフィグは以下の通りです。

CHR-1 のコンフィグ

/system identity set name=CHR-1
/ip address add address=10.0.0.1/24 interface=ether2

CHR-2 のコンフィグ

/system identity set name=CHR-2
/ip address add address=10.0.0.2/24 interface=ether2

MAC アドレスの確認

VIRL 上でパケットキャプチャを実行するには tap デバイスを特定する必要があります。その際、該当仮想マシンMAC アドレスが分かっていると特定が簡単ですので、予め仮想マシンMAC アドレスを確認しておきます(CHR 同士を接続しているのは ether2 インターフェイスです)。CHR-1 の MAC アドレスは以下でした。

[admin@CHR-1] > /interface print
Flags: D - dynamic, X - disabled, R - running, S - slave
 #     NAME                                TYPE       ACTUAL-MTU L2MTU  MAX-L2MTU MAC-ADDRESS
 0  R  ether1                              ether            1500                  FA:16:3E:58:9B:BC
 1  R  ether2                              ether            1500                  FA:16:3E:60:80:3E

CHR-2 の MAC アドレスは以下でした。

[admin@CHR-2] > /interface print
Flags: D - dynamic, X - disabled, R - running, S - slave
 #     NAME                                TYPE       ACTUAL-MTU L2MTU  MAX-L2MTU MAC-ADDRESS
 0  R  ether1                              ether            1500                  FA:16:3E:59:D7:0A
 1  R  ether2                              ether            1500                  FA:16:3E:55:31:18

Virl 上で tap デバイスを特定する

ここからは VIRL へ SSH へログインして作業します。Neutron のポート一覧は neutron port-list コマンドで確認出来ます。

virl@virl:~$ neutron port-list
+--------------------------------------+--------------------------------------------------------------+-------------------+-------------------------------------------------------------------------------------+
| id                                   | name                                                         | mac_address       | fixed_ips                                                                           |
+--------------------------------------+--------------------------------------------------------------+-------------------+-------------------------------------------------------------------------------------+
| 0e61fa61-5fa6-4e11-96fe-b076146fc9f0 | </guest/endpoint>-<topology-s7oh6n>-<chr-1>-<chr-1-to-chr-2> | fa:16:3e:60:80:3e | {"subnet_id": "9ad27e65-fd52-46b4-bbe6-f6f1701c2e7e", "ip_address": "10.255.255.2"} |
| 1e37a456-a31b-4216-b76e-d4f51a2336da |                                                              | fa:16:3e:05:ce:7b | {"subnet_id": "d74d784d-9b1a-443f-90e2-2ba2e47c907d", "ip_address": "172.16.1.50"}  |
| 1f6f2d4d-d047-4431-bcfa-e31d65e5f0b4 |                                                              | fa:16:3e:bf:67:69 | {"subnet_id": "4d822318-0c70-464e-ae5c-cb39981dc86f", "ip_address": "10.255.0.1"}   |
| 5687eeb2-0bf3-4741-988d-d09e335185d2 | </guest/endpoint>-<topology-s7oh6n>-<~mgmt-lxc>-<flat>       | fa:16:3e:98:17:2a | {"subnet_id": "d74d784d-9b1a-443f-90e2-2ba2e47c907d", "ip_address": "172.16.1.87"}  |
| 8f3f91b4-4903-4753-8475-6d622d0a7bc9 | </guest/endpoint>-<topology-s7oh6n>-<~mgmt-lxc>-<~lxc-flat>  | fa:16:3e:d4:2b:2c | {"subnet_id": "d74d784d-9b1a-443f-90e2-2ba2e47c907d", "ip_address": "172.16.1.88"}  |
| 902e7b39-d9cc-4995-bec4-6639c5b4a0bb | </guest/endpoint>-<topology-s7oh6n>-<chr-2>-<chr-1-to-chr-2> | fa:16:3e:55:31:18 | {"subnet_id": "9ad27e65-fd52-46b4-bbe6-f6f1701c2e7e", "ip_address": "10.255.255.1"} |
| 9f6ee93d-ff32-4a04-9e13-15fd7cae7283 |                                                              | fa:16:3e:61:c4:29 | {"subnet_id": "4d822318-0c70-464e-ae5c-cb39981dc86f", "ip_address": "10.255.0.2"}   |
| a9397ff9-195d-412f-84c0-1bd45f869bc7 |                                                              | fa:16:3e:bd:41:3e | {"subnet_id": "05795491-ad4a-4e3c-a302-ed365c0733e3", "ip_address": "172.16.2.50"}  |
| aed1a7d2-6769-4fbc-9548-758560486ec2 |                                                              | fa:16:3e:a4:25:db | {"subnet_id": "7a9d79f3-fcff-4f78-b9dc-bc981ee407d6", "ip_address": "172.16.3.51"}  |
| b0ced4ad-88af-4e8f-ac51-b811828d560d |                                                              | fa:16:3e:91:78:24 | {"subnet_id": "597e2bea-4c56-4313-850a-1f1bf0224166", "ip_address": "10.254.0.2"}   |
| cea8f86a-8aef-4037-8c2d-4d73eee0c9a1 | </guest/endpoint>-<topology-s7oh6n>-<chr-2>-<flat>           | fa:16:3e:59:d7:0a | {"subnet_id": "d74d784d-9b1a-443f-90e2-2ba2e47c907d", "ip_address": "172.16.1.85"}  |
| d0252eaa-55f6-412e-90f1-5c3c4c017c26 |                                                              | fa:16:3e:cc:82:31 | {"subnet_id": "597e2bea-4c56-4313-850a-1f1bf0224166", "ip_address": "10.254.0.1"}   |
| d3115811-a89f-4855-92b6-fe6053899cfb |                                                              | fa:16:3e:0a:76:56 | {"subnet_id": "7a9d79f3-fcff-4f78-b9dc-bc981ee407d6", "ip_address": "172.16.3.50"}  |
| f26c1672-6cba-40df-82b6-9c2b76083351 | </guest/endpoint>-<topology-s7oh6n>-<chr-1>-<flat>           | fa:16:3e:58:9b:bc | {"subnet_id": "d74d784d-9b1a-443f-90e2-2ba2e47c907d", "ip_address": "172.16.1.86"}  |
+--------------------------------------+--------------------------------------------------------------+-------------------+-------------------------------------------------------------------------------------+

事前に確認してある CHR-1 ether2 の MAC アドレスは「FA:16:3E:60:80:3E」でした。Neutron のポート一覧から、この MAC アドレスを grep して検索します。

virl@virl:~$ neutron port-list | grep -i FA:16:3E:60:80:3E
| 0e61fa61-5fa6-4e11-96fe-b076146fc9f0 | </guest/endpoint>-<topology-s7oh6n>-<chr-1>-<chr-1-to-chr-2> | fa:16:3e:60:80:3e | {"subnet_id": "9ad27e65-fd52-46b4-bbe6-f6f1701c2e7e", "ip_address": "10.255.255.2"} |

次の作業では表示されたポートの ID「0e61fa61-5fa6-4e11-96fe-b076146fc9f0」の先頭部分である「0e61fa61-5f」部分が必要になります。この ID 先頭部分に「tap」という文字列を付与した「tap0e61fa61-5f」というインターフェイスを表示してみます。

virl@virl:~$ ifconfig tap0e61fa61-5f
tap0e61fa61-5f Link encap:Ethernet  HWaddr fe:16:3e:60:80:3e
          UP BROADCAST RUNNING MULTICAST  MTU:1550  Metric:1
          RX packets:35 errors:0 dropped:0 overruns:0 frame:0
          TX packets:37 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:500
          RX bytes:3767 (3.7 KB)  TX bytes:3999 (3.9 KB)

これが CHR-1 と CHR-2 を接続する部分を意味する tap デバイスになります。

VIRL 上でパケットをキャプチャしてみる

後は VIRL 上で tcpdump を使い、tap デバイスを指定してパケットをキャプチャするだけです。具体的には以下のようなコマンドを実行します。「キャプチャ結果をファイルに保存して後から WireShark 等で確認したい」「プロトコルやアドレスでフィルタしたい」場合等は tcpdump のオプションを調整します。

sudo tcpdump -vvni tap0e61fa61-5f

VIRL 上で tcpdump を実行した状態で CHR-1 から CHR-2 へ Ping を実行します。

[admin@CHR-1] > ping 10.0.0.2 count=1
  SEQ HOST                                     SIZE TTL TIME  STATUS
    0 10.0.0.2                                   56  64 0ms
    sent=1 received=1 packet-loss=0% min-rtt=0ms avg-rtt=0ms max-rtt=0ms

実際のキャプチャ結果は以下の通りです。

virl@virl:~$ sudo tcpdump -vvni tap0e61fa61-5f
tcpdump: WARNING: tap0e61fa61-5f: no IPv4 address assigned
tcpdump: listening on tap0e61fa61-5f, link-type EN10MB (Ethernet), capture size 65535 bytes
16:12:06.660240 IP (tos 0x0, ttl 255, id 1139, offset 0, flags [none], proto ICMP (1), length 56)
    10.0.0.1 > 10.0.0.2: ICMP echo request, id 6145, seq 0, length 36
16:12:06.660531 IP (tos 0x0, ttl 64, id 5152, offset 0, flags [none], proto ICMP (1), length 56)
    10.0.0.2 > 10.0.0.1: ICMP echo reply, id 6145, seq 0, length 36
^C
2 packets captured
2 packets received by filter
0 packets dropped by kernel