Mininet本家にあるMininet Walkthroughをやってみた記録。
インフラ勉強会で行われていたサーバーネットワーキング講座で知ったのがきっかけ。
視聴方法のdiscordのチャンネルにあるリンクから辿れる場所に、録画されたものが一週間だけ残っているらしい。
なお、私個人はアプリケーションプログラマであり、ネットワークエンジニアではないことを付記しておく。
専門外を興味のまま調べてるだけ。
Mininetとは
Mininetのインストールと使用方法 - Qiita参照。
インストール
上記のリンク先ではソースから入れているし、本家では配られてるVMがUbuntu 14.04ベースだったので、ここでは18.10にパッケージインストールする形で実施。
本体インストール
$ sudo apt install mininet
GUI準備
これだけでも作業は出来るが、python/TKを使ったGUIがあるようなので、これを使って作業する(上記講座でも使用されていた)。
$ sudo apt install python-tk
GUIの起動は、以下のように実施。
$ zcat /usr/share/doc/mininet/examples/miniedit.py.gz | sudo python
パケットキャプチャGUIの準備
wiresharkのインストール
$ sudo apt install wireshark
途中で↓な画面が出るので、「はい」を選択した(wiresharkを一般ユーザで動かしたいので)。
インストール後、wiresharkグループに普段使いのユーザーを追加。
$ sudo vigr
wireshark:x:グループID:
みたいな行があるのでユーザーIDを追加する
wireshark:x:グループID:ユーザーID
shadow側も自分で追加
sudo vigr -s
同じ感じでユーザーIDを追加する。
一旦ログアウトしてログインし直す。
メニューから起動するとこんな感じ。
Mininet Walkthroughの実施
GUI(miniedit.py)とwiresharkを起動した状態でスタート。
ホストやスイッチと対話する
(1) 最小構成のネットワークを描く
ホスト2つが(レガシー)スイッチで繋がってる構成。
(2) Run
Runボタン押下で、実際にこの構成の仮想ネットが稼働する。
h1のIPは10.0.0.1が自動で振られている。
h2のIPは10.0.0.2が自動で振られている。
(3) h1からh2へ疎通確認
- h1で右クリックしてTerminal選択した状態で離す→xterm起動
- ip a→IPなどを確認(ifconfigの代わり)
- ping 10.0.0.2→パケットが届く
開いたxtermは仮想ホストh1で開いたような操作感。
例)
root@lubuntu:~# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: h1-eth0@if56: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 22:7e:cf:71:61:8b brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 10.0.0.1/8 brd 10.255.255.255 scope global h1-eth0
valid_lft forever preferred_lft forever
inet6 fe80::207e:cfff:fe71:618b/64 scope link
valid_lft forever preferred_lft forever
root@lubuntu:~# ping -c 4 10.0.0.2
PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
64 bytes from 10.0.0.2: icmp_seq=1 ttl=64 time=0.156 ms
64 bytes from 10.0.0.2: icmp_seq=2 ttl=64 time=0.043 ms
64 bytes from 10.0.0.2: icmp_seq=3 ttl=64 time=0.041 ms
64 bytes from 10.0.0.2: icmp_seq=4 ttl=64 time=0.070 ms
--- 10.0.0.2 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 76ms
rtt min/avg/max/mdev = 0.041/0.077/0.156/0.047 ms
root@lubuntu:~#
ここではpingに-c 4をオプション指定して、4回パケットを送出するようにしている(未指定はCtrl-Cするまで繰り返し)。
見れば分かるとおり、0.2ms以下で応答が返ってきている→OK。
(4) h2からh1へ疎通確認
- h2で右クリックしてTerminal選択した状態で離す→xterm起動
- ip a→IPなどを確認(ifconfigの代わり)
- ping 10.0.0.1→パケットが届く
開いたxtermは仮想ホストh2で開いたような操作感。
同様に確認する。
root@lubuntu:~# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: h2-eth0@if57: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 12:51:85:b2:42:5a brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 10.0.0.2/8 brd 10.255.255.255 scope global h2-eth0
valid_lft forever preferred_lft forever
inet6 fe80::1051:85ff:feb2:425a/64 scope link
valid_lft forever preferred_lft forever
root@lubuntu:~# ping -c 4 10.0.0.1
PING 10.0.0.1 (10.0.0.1) 56(84) bytes of data.
64 bytes from 10.0.0.1: icmp_seq=1 ttl=64 time=0.165 ms
64 bytes from 10.0.0.1: icmp_seq=2 ttl=64 time=0.067 ms
64 bytes from 10.0.0.1: icmp_seq=3 ttl=64 time=0.070 ms
64 bytes from 10.0.0.1: icmp_seq=4 ttl=64 time=0.070 ms
--- 10.0.0.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 74ms
rtt min/avg/max/mdev = 0.067/0.093/0.165/0.041 ms
root@lubuntu:~#
(5) 仮想ホストのプロセス共有確認
- h1のxtermでps -a
- h2のxtermでps -a
- ツールのメニューからRun>Root Terminalでxterm起動
- 起動したxtermでps -a
全て同じプロセスであることを確認
例)
root@lubuntu:~# ps -a
PID TTY TIME CMD
14360 pts/0 00:00:00 sudo
14371 pts/0 00:00:02 python
14865 pts/0 00:00:00 xterm
14881 pts/4 00:00:00 ps
root@lubuntu:~#
(6) 仮想ホストでウェブサーバを起動し、疎通確認
ホスト1
でウェブサーバをバックグラウンドジョブとして起動
# python -m SimpleHTTPServer 80 &
ホスト2
でそのWebの/を取ってくる
# wget http://10.0.0.1/
index.htmlを取得できればOK
ホスト1
でウェブサーバを止める
# kill %1
(7) wiresharkでキャプチャ(追記)
上記で、ホスト1<->ホスト2のHTTP通信をキャプチャする。
1. wget実行前に、wiresharkの画面で、「キャプチャ」をクリック
2. 一番下を選択/開始する。
一番下のインターフェースs1-eth2:s1-eth2は仮想スイッチS1のホスト2に繋がるインターフェース。
つまりホスト2のeth0と直結しているインターフェース。
本当はホスト2のeth0をキャプチャしたいが、できないので、これをキャプチャする。
3. ホスト2のxtermからwget→キャプチャされる
4. wiresharkの画面でメニューからキャプチャ>停止
5. 解析
先頭のSYNパケットを選んで、メニューから分析>追跡>TCPストリーム
これで、パケットの中身の詳細まで知らずとも(知ってた方が良いけど)、生ソケットレベルのTCPのストリームを追うことができる。
高度な起動オプション
以降はGUIを使用しない、mininet自体の機能の紹介だったので割愛。
多分必要なときに読めばいい。
今後の予定
次はOpenFlowのチュートリアルをやってみたい。