Cisco VIRL 上でパケットキャプチャしてみる
今のところ Cisco VIRL 環境の UI(VMMaestro)上ではパケットキャプチャが出来ません。但し、VIRL を動作させている Ubuntu ホストにログインしてパケットキャプチャすることは可能です。YouTube 上でも詳細な手順が公開されています。
今回は実際に Ubuntu ホスト上でのパケットキャプチャを試してみます。
virl-utils について
パケットキャプチャを実行するには概ね、以下の手順を踏む必要があります。
- キャプチャ対象となる tap デバイスを特定する
- 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 コマンドで確認出来ます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 | 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
|