It is the top of the page

Link for moving within the page
To text (c)

このウェブサイトではサイトの利便性の向上のためにクッキーを利用します。サイトの閲覧を続行されるには、クッキーの使用にご同意いただきますようお願いします。
お客様のブラウザの設定によりクッキーの機能を無効にすることもできます。詳細はこちら

The main part starts here.

  1. ナレッジセンター
  2. 匠コラム

Windows 10 HomeとDockerでBGP/MPLSを学ぶ②

匠コラム
ネットワーク
仮想化

ビジネス開発本部
第3応用技術部 第3チーム
平河内 竜樹

本記事では、WSL 2Dockerを利用し、Windows端末上でBGP/MPLSに関する検証環境の常設を目指します。

このページでは、前節で挙げた構成案が想定通りに機能を提供可能であるかの検証を行います。

WSLとDockerを利用したネットワークの検証環境

本記事の検証ではホストOSWindows 10 Home build 19041.329を利用します。WSL 上へのDockerSSHRPCAPの具体的なセットアップ手順は割愛させていただいて、出来上がった状態がこちらになります(表1)。

表1:ホストOSから見た各サービスの状態

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 TermWiresharkWSL上のデーモンにアクセスしたときの様子です。

3:ホストOS上のTera TermからWSL上のSSHサーバにアクセス

4:ホストOS上のWiresharkからWSL上のRPCAPサーバにアクセス

上記の結果から、各種サービスがWSL上で稼働し、ホストOSからネットワーク経由でアクセス可能なことが確認できました。

次に、この状態からpingの実行・応答が可能なノードとなるコンテナを二つ用意し、その間を二つのネットワークで接続しました。その結果、コンテナ間を接続するネットワークは、Linuxホストで実行した時と同様に、ホストとなるWSL上でネットワークとして認識されていることが確認できました(図5・表27)。

5:構成図(コンテナ間通信とそのキャプチャに関する確認)

2:コンテナ作成前の状態

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",
~#

 表3:今回行うイメージ作成の操作

WSL / Ubuntu
docker pull frrouting/frr:latest

4:今回行うコンテナ作成・起動の操作

WSL / Ubuntu
docker run -dit --privileged--name frr1 frrouting/frr:latest
docker run -dit --privileged--name frr2 frrouting/frr:latest

5:コンテナ起動後の状態

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
~#

6:今回行うネットワーク作成・接続の操作

WSL / Ubuntu
docker network create net120
docker network connect net120 frr1
docker network connect net120 frr2

7:ネットワーク接続後の状態

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を実行すると、通信の成功と指定したネットワークに対するキャプチャ結果が確認できました(表810・図6)。この時、キャプチャはリアルタイムに行われ、また停止後のファイル保存も可能でした。

8:今回行うコンテナに対する操作(各コンテナに対し個別のSSHセッションを用意)

WSL / Ubuntu
docker exec -it frr1 /bin/bash
docker exec -it frr2 /bin/bash

91台目のコンテナにおける通信確認

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:  mtu 1480 qdisc noop state DOWN group default qlen 1000
    link/sit 0.0.0.0 brd 0.0.0.0
7: eth0@if8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever
12: eth1@if13: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    link/ether 02:42:ac:12:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.18.0.2/16 brd 172.18.255.255 scope global eth1
       valid_lft forever preferred_lft forever
bash-5.0#
bash-5.0# ping -c 3 172.17.0.3
PING 172.17.0.3 (172.17.0.3): 56 data bytes
64 bytes from 172.17.0.3: seq=0 ttl=64 time=8.497 ms
64 bytes from 172.17.0.3: seq=1 ttl=64 time=0.107 ms
64 bytes from 172.17.0.3: seq=2 ttl=64 time=0.125 ms
--- 172.17.0.3 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.107/2.909/8.497 ms
bash-5.0#

102台目のコンテナにおける通信確認

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:  mtu 1480 qdisc noop state DOWN group default qlen 1000
    link/sit 0.0.0.0 brd 0.0.0.0
9: eth0@if10: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever
14: eth1@if15: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    link/ether 02:42:ac:12:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.18.0.3/16 brd 172.18.255.255 scope global eth1
       valid_lft forever preferred_lft forever
bash-5.0#
bash-5.0# ping -c 3 172.18.0.2
PING 172.18.0.2 (172.18.0.2): 56 data bytes
64 bytes from 172.18.0.2: seq=0 ttl=64 time=7.421 ms
64 bytes from 172.18.0.2: seq=1 ttl=64 time=0.177 ms
64 bytes from 172.18.0.2: seq=2 ttl=64 time=0.139 ms
--- 172.18.0.2 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.139/2.579/7.421 ms
bash-5.0#

6:表9・表10の操作に対するキャプチャ結果(片側のネットワークを指定)

さらに、docker0をキャプチャ対象に追加で指定することにより、両方のネットワークを経由する通信が同時にキャプチャされることをあわせて確認しています(図7・図8)。

7:キャプチャ対象の指定

8:表9・表10の操作に対するキャプチャ結果(両側のネットワークを指定)

上記の結果より今回想定した検証環境で、コンテナ間の通信成功と共に、各ノードへのコンソールアクセスおよび任意の箇所に対するパケットキャプチャを提供可能なことが確認できました。

以降では、これまでに確認できた内容を踏まえて、当初ターゲットにしていたプロトコルに関する検証環境の実現を目指したいと思います。

~続く~

執筆者プロフィール

平河内 竜樹
ネットワンシステムズ株式会社 ビジネス開発本部
第3応用技術部 第3チーム 所属

ルータ分野を核とした新旧技術の調査・検証と共に、エンタープライズ・パブリック・サービスプロバイダのネットワーク提案および導入を支援する業務に、10年以上にわたり従事

  • CCIE RS
  • CCIE SP

Webからのお問い合わせはこちらから

ピックアップ

ナレッジセンターを検索する

カテゴリーで検索

タグで検索