- ナレッジセンター
- 匠コラム
Windows 10 HomeとDockerでBGP/MPLSを学ぶ②
- 匠コラム
- ネットワーク
- 仮想化
ビジネス開発本部
第3応用技術部 第3チーム
平河内 竜樹
本記事では、WSL 2とDockerを利用し、Windows端末上でBGP/MPLSに関する検証環境の常設を目指します。
このページでは、前節で挙げた構成案が想定通りに機能を提供可能であるかの検証を行います。
WSLとDockerを利用したネットワークの検証環境
本記事の検証ではホストOSにWindows 10 Home build 19041.329を利用します。WSL 上へのDockerやSSH・RPCAPの具体的なセットアップ手順は割愛させていただいて、出来上がった状態がこちらになります(表1)。
Host OS |
PS C:\WINDOWS\system32> wsl -- netstat -lt -4 Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 0.0.0.0:2002 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:ssh 0.0.0.0:* LISTEN PS C:\WINDOWS\system32> PS C:\WINDOWS\system32> wsl -- service docker status * Docker is running PS C:\WINDOWS\system32> |
またホストOSからは、localhostを用いてアクセスすることにより、WSL上のLinuxアプリケーションと通信を行うことができます(Announcing Windows 10 Insider Preview Build 18945)。図3・図4はそれぞれTera Term・WiresharkでWSL上のデーモンにアクセスしたときの様子です。
![]() 図3:ホストOS上のTera TermからWSL上のSSHサーバにアクセス |
![]() 図4:ホストOS上のWiresharkからWSL上のRPCAPサーバにアクセス |
上記の結果から、各種サービスがWSL上で稼働し、ホストOSからネットワーク経由でアクセス可能なことが確認できました。
次に、この状態からpingの実行・応答が可能なノードとなるコンテナを二つ用意し、その間を二つのネットワークで接続しました。その結果、コンテナ間を接続するネットワークは、Linuxホストで実行した時と同様に、ホストとなるWSL上でネットワークとして認識されていることが確認できました(図5・表2~7)。
![]() 図5:構成図(コンテナ間通信とそのキャプチャに関する確認) |
WSL / Ubuntu |
~# docker images REPOSITORY TAG IMAGE ID CREATED SIZE ~# ~# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ~# ~# ip link show up 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 5: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000 link/ether 00:15:5d:60:85:7d brd ff:ff:ff:ff:ff:ff 6: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default link/ether 02:42:36:1d:51:a3 brd ff:ff:ff:ff:ff:ff ~# ~# docker network ls NETWORK ID NAME DRIVER SCOPE 30f5bd08b351 bridge bridge local 38a850dd8a43 host host local a949cdce62c5 none null local ~# ~# docker network inspect bridge | grep -e Name -e Address "Name": "bridge", ~# |
WSL / Ubuntu |
docker pull frrouting/frr:latest |
WSL / Ubuntu |
docker run -dit --privileged--name frr1 frrouting/frr:latest docker run -dit --privileged--name frr2 frrouting/frr:latest |
WSL / Ubuntu |
~# docker images REPOSITORY TAG IMAGE ID CREATED SIZE frrouting/frr latest 92659918864e 2 days ago 130MB ~# ~# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b2b04c5a718d frrouting/frr:latest "/sbin/tini -- /usr/…" 23 seconds ago Up 21 seconds frr2 af9e1b2e3efb frrouting/frr:latest "/sbin/tini -- /usr/…" 46 seconds ago Up 43 seconds frr1 ~# ~# ip link show up 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 5: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000 link/ether 00:15:5d:60:85:7d brd ff:ff:ff:ff:ff:ff 6: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default link/ether 02:42:36:1d:51:a3 brd ff:ff:ff:ff:ff:ff 8: vethf0249dc@if7: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP mode DEFAULT group default link/ether 8e:26:08:a7:7c:b9 brd ff:ff:ff:ff:ff:ff link-netnsid 0 10: veth4f61a6d@if9: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP mode DEFAULT group default link/ether ce:1d:c4:e8:af:e2 brd ff:ff:ff:ff:ff:ff link-netnsid 1 ~# ~# docker network ls NETWORK ID NAME DRIVER SCOPE 30f5bd08b351 bridge bridge local 38a850dd8a43 host host local a949cdce62c5 none null local ~# ~# docker network inspect bridge | grep -e Name -e Address "Name": "bridge", "Name": "frr1", "MacAddress": "02:42:ac:11:00:02", "IPv4Address": "172.17.0.2/16", "IPv6Address": "" "Name": "frr2", "MacAddress": "02:42:ac:11:00:03", "IPv4Address": "172.17.0.3/16", "IPv6Address": "" ~# ~# brctl show bridge name bridge id STP enabled interfaces docker0 8000.0242361d51a3 no veth4f61a6d vethf0249dc ~# |
WSL / Ubuntu |
docker network create net120 docker network connect net120 frr1 docker network connect net120 frr2 |
WSL / Ubuntu |
~# ip link show up 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 5: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000 link/ether 00:15:5d:60:85:7d brd ff:ff:ff:ff:ff:ff 6: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default link/ether 02:42:36:1d:51:a3 brd ff:ff:ff:ff:ff:ff 8: vethf0249dc@if7: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP mode DEFAULT group default link/ether 8e:26:08:a7:7c:b9 brd ff:ff:ff:ff:ff:ff link-netnsid 0 10: veth4f61a6d@if9: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP mode DEFAULT group default link/ether ce:1d:c4:e8:af:e2 brd ff:ff:ff:ff:ff:ff link-netnsid 1 11: br-c06165a05dc3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default link/ether 02:42:5d:fb:28:82 brd ff:ff:ff:ff:ff:ff 13: vethe8d6be6@if12: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-c06165a05dc3 state UP mode DEFAULT group default link/ether 9e:3c:85:43:44:ba brd ff:ff:ff:ff:ff:ff link-netnsid 0 15: veth29be792@if14: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-c06165a05dc3 state UP mode DEFAULT group default link/ether fe:73:46:e8:00:76 brd ff:ff:ff:ff:ff:ff link-netnsid 1 ~# ~# docker network ls NETWORK ID NAME DRIVER SCOPE 30f5bd08b351 bridge bridge local 38a850dd8a43 host host local c06165a05dc3 net120 bridge local a949cdce62c5 none null local ~# ~# docker network inspect net120 | grep -e Name -e Address "Name": "net120", "Name": "frr1", "MacAddress": "02:42:ac:12:00:02", "IPv4Address": "172.18.0.2/16", "IPv6Address": "" "Name": "frr2", "MacAddress": "02:42:ac:12:00:03", "IPv4Address": "172.18.0.3/16", "IPv6Address": "" ~# ~# brctl show bridge name bridge id STP enabled interfaces br-c06165a05dc3 8000.02425dfb2882 no veth29be792 vethe8d6be6 docker0 8000.0242361d51a3 no veth4f61a6d vethf0249dc ~# |
上記を確認した後に、各ノードへのコンソールアクセスを同時に行うため、コンテナの数だけ追加でSSHセッションを確立しました。あわせてホストOS上のWiresharkで、追加したネットワーク(net120)のみを対象としてパケットキャプチャを開始しました。その後、各コンテナからpingを実行すると、通信の成功と指定したネットワークに対するキャプチャ結果が確認できました(表8~10・図6)。この時、キャプチャはリアルタイムに行われ、また停止後のファイル保存も可能でした。
WSL / Ubuntu |
docker exec -it frr1 /bin/bash docker exec -it frr2 /bin/bash |
Container#1 |
bash-5.0# ip address show 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 2: sit0@NONE: |
Container#2 |
bash-5.0# ip address show 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 2: sit0@NONE: |
![]() 図6:表9・表10の操作に対するキャプチャ結果(片側のネットワークを指定) |
さらに、docker0をキャプチャ対象に追加で指定することにより、両方のネットワークを経由する通信が同時にキャプチャされることをあわせて確認しています(図7・図8)。
![]() 図7:キャプチャ対象の指定 |
![]() 図8:表9・表10の操作に対するキャプチャ結果(両側のネットワークを指定) |
上記の結果より今回想定した検証環境で、コンテナ間の通信成功と共に、各ノードへのコンソールアクセスおよび任意の箇所に対するパケットキャプチャを提供可能なことが確認できました。
以降では、これまでに確認できた内容を踏まえて、当初ターゲットにしていたプロトコルに関する検証環境の実現を目指したいと思います。
~続く~
執筆者プロフィール
平河内 竜樹
ネットワンシステムズ株式会社 ビジネス開発本部
第3応用技術部 第3チーム 所属
ルータ分野を核とした新旧技術の調査・検証と共に、エンタープライズ・パブリック・サービスプロバイダのネットワーク提案および導入を支援する業務に、10年以上にわたり従事
- CCIE RS
- CCIE SP
Webからのお問い合わせはこちらから
ピックアップ
ナレッジセンターを検索する
カテゴリーで検索
タグで検索