2018年12月4日火曜日

VPN(Docker版:その2)

ブリッジ "br0" の作成


前回のブログで仮想NIC(tap_br0)を作成した。次に仮想NICと物理NIC(enp3s0)をつなぐブリッジbr0を作成する。
ブリッジはネットワークの起動ファイルである/etc/network/interfacesで作成する。
しかしながら、Ubuntu 16.04 LTS では、ネットワークの設定は従来のように/etc/network/interfacesで行うのではなく、NetworkManagerを使っている。
ブリッジの設定を行うには、/etc/network/interfacesを使う必要があるので、NetworkManagerの無効化する必要がある。
そのためにまずNetworkManagerを停止する(リスト1)。

sudo service network-manager stop
リスト1.NetworkManagerの停止

その後、 リスト2のコマンドを打ち込んでNetworkManagerを無効化する。

sudo systemctl disable network-manager.service
sudo systemctl status network-manager.service
リスト2.NetworkManagerの無効化

最後に/etc/network/interfacesをリスト3のように編集する。

auto lo
  iface lo inet loopback

auto enp3s0
  iface enp3s0 inet manual

# SoftEtherVPN
auto br0
  iface br0 inet static
    address 172.16.111.217
    netmask 255.255.0.0
    network 172.16.0.0
    broadcast 172.16.255.255
    gateway 172.16.254.254
    # tapデバイス(ap_br0)はvpnserverでブリッジさせるので、enp3s0のみをブリッジする
    dns-nameservers 172.16.254.1
    bridge_ports enp3s0
    bridge_maxwait 10
リスト3./etc/network/interfacesの編集

リスト3では物理NICにはIPアドレスを割り当てず、ブリッジに対して本来物理NICに設定していたIPアドレスを割り当てている。

/etc/network/interfacesの編集を終えたらサーバを再起動する。リスト4は再起動後に"ip a"コマンドを使ってネットワークインターフェースを表示したものである。確かにブリッジbr0ができている。

hinfo@orca17:~$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    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: enp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UP group default qlen 1000
    link/ether f4:4d:30:6b:ac:0c brd ff:ff:ff:ff:ff:ff
3: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether f4:4d:30:6b:ac:0c brd ff:ff:ff:ff:ff:ff
    inet 172.16.111.217/16 brd 172.16.255.255 scope global br0
       valid_lft forever preferred_lft forever
    inet6 fe80::f64d:30ff:fe6b:ac0c/64 scope link
       valid_lft forever preferred_lft forever
4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 02:42:40:ba:a9:c4 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
リスト4.インターフェースに現れたブリッジ br0

リスト4を注意深く見ると、物理NIC "enp3s0" には "master br0" という記述があり、物理NIC "enp3s0" とブリッジ "br0" が繋がっていることがわかる。

次にsoftetherを起動する。

root@orca17:/home/hinfo# docker start softether
リスト5.softetherの起動

"ip a"コマンドを使ってネットワークインターフェースを表示すると、"tap_br0" が現れた。

root@orca17:/home/hinfo# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    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: enp3s0: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UP group default qlen 1000
    link/ether f4:4d:30:6b:ac:0c brd ff:ff:ff:ff:ff:ff
3: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether f4:4d:30:6b:ac:0c brd ff:ff:ff:ff:ff:ff
    inet 172.16.111.217/16 brd 172.16.255.255 scope global br0
       valid_lft forever preferred_lft forever
    inet6 fe80::f64d:30ff:fe6b:ac0c/64 scope link
       valid_lft forever preferred_lft forever
4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 02:42:40:ba:a9:c4 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
5: tap_br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 1000
    link/ether 00:ac:e8:ab:e0:a4 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::2ac:e8ff:feab:e0a4/64 scope link
       valid_lft forever preferred_lft forever
リスト6.インターフェースに現れた仮想NIC "tap_br0" 

リスト6を見ると仮想NIC "tap_br0" には "state UNKNOWN" という表示があるが、これが何を意味しているのかわからない。

仮想NIC "tap_br0" とブリッジ "br0" を繋ぐ


次に、仮想NIC "tap_br0" とブリッジ "br0" を繋ぐ。

その前に、前回のブログの図14~16で作成したブリッジを削除し、仮想HUB(ここではVPN)と仮想NIC "tap_br0" を接続する。

まず、[仮想HUB]のコンボボックスから「VPN」を選択して、[作成する種類]で[新しいtapデバイスとブリッジの接続]にチェックし、[LANカード]から仮想NIC "tap_br0" を選択して[ローカルブリッジを追加]をクリックする。
これで仮想HUBと仮想NICの接続が完了したので、いよいよ仮想NIC "tap_br0" をブリッジ "br0" とつなぐ。
これは、リスト7に示すようにbrctlコマンドを使って行う。

sudo brctl addif br0 tap_br0
リスト7. 仮想NICとブリッジの接続

VPN接続テスト


以上で設定が終わったのでテストを行った。VPNクライアント接続マネージャ(前回のブログの図23)で「***への接続」をダブルクリックするとVPNサーバに接続してIPアドレスが割り当てられた。
このとき、VPNサーバ自体へは接続できたが(pingが通ったり、sshで接続できた)、VPNサーバが接続しているローカルネットワーク上のホストとは接続できなかった。
これは、ちょうど前回のブログに書いたものと正反対の現象である。

また、VPNサーバマネージャのローカルブリッジで、仮想HUBと物理NICのブリッジを削除せずそのままにしておくとサーバが大量のパケットを放出してネットワークがダウンする現象が見られた。

【Tips】


サーバ再起動後もDockerコンテナを自動起動する方法


/lib/systemd/systemディレクトリ内に定義ファイルを作成する。

[Unit]
 Description=SoftEther VPN Container
 Requires=docker.service
 After=docker.service

[Service]
 Restart=always
 ExecStart=/usr/bin/docker start -a softether
 ExecStop=/usr/bin/docker stop -t 10 softether

[Install]
 WantedBy=multi-user.target
リスト8.softetherの定義ファイル

定義ファイルは拡張子を ".service" とする。リスト8に示すのはdockerの定義ファイル "/lib/systemd/system/softether.service" である。

定義ファイルを使って自動起動の設定を行うにはリスト9のコマンドを打ち込む。

sudo systemctl enable softether
リスト9.自動起動設定

これを実行すると次のようなメッセージが出る。

Created symlink from /etc/systemd/system/multi-user.target.wants/softether.service to /lib/systemd/system/softether.service.
リスト10.自動起動設定時のメッセージ 

この結果、下記のフォルダにリンクができる。

/etc/systemd/system/multi-user.target.wants/
リスト11.起動ファイルのリンクが格納されるフォルダ 



dockerコンテナへの入り方


dockerコンテナ内に入るには次のコマンドを入力する。

sudo docker exec -it [コンテナ名] /bin/bash
リスト12.dockerコンテナへ入るコマンド

ホストへ戻るには "exit" と入力する。


dockerコンテナのスタートアップスクリプトファイル


サーバ起動時のサービスの自動起動スクリプトは /etc/init.d/ や /lib/systemd/system などにある。
では、dockerコンテナの場合はどこにあるのか。

答えは 下記のコマンドの表示結果にある"Entrypoint"にある。

sudo docker inspect [コンテナ名]
リスト13.dockerのinspectコマンド

・・・
"Entrypoint": [
    "/usr/local/vpnserver/runner.sh"
],
・・・
リスト14.スタートアップスクリプトを示すEntrypoint

これは、softetherの例で、スタートアップスクリプトが"/etc/local/vpnserver/runner.sh"であることがわかる。

dockerコンテナ内のネットワーク


次のリスト14はdockerコンテナのsoftether, dolphin-db, dolphin-serverを起動しているときのインターフェースを "ip a" コマンドで表示したものである。ただし、仮想NIC(tap_br0)とブリッジ(br0)は繋いでいない。

root@orca17:/lib/systemd/system# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    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: enp3s0: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UP group default qlen 1000
    link/ether f4:4d:30:6b:ac:0c brd ff:ff:ff:ff:ff:ff
3: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether f4:4d:30:6b:ac:0c brd ff:ff:ff:ff:ff:ff
    inet 172.16.111.217/16 brd 172.16.255.255 scope global br0
       valid_lft forever preferred_lft forever
    inet6 fe80::f64d:30ff:fe6b:ac0c/64 scope link
       valid_lft forever preferred_lft forever
4: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    link/ether 02:42:ff:f4:2d:c2 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:ffff:fef4:2dc2/64 scope link
       valid_lft forever preferred_lft forever
6: veth7153883@if5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default
    link/ether 32:cf:b0:7d:26:55 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet6 fe80::30cf:b0ff:fe7d:2655/64 scope link
       valid_lft forever preferred_lft forever
8: veth797aa8b@if7: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default
    link/ether da:a1:37:16:63:50 brd ff:ff:ff:ff:ff:ff link-netnsid 1
    inet6 fe80::d8a1:37ff:fe16:6350/64 scope link
       valid_lft forever preferred_lft forever
9: tap_br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 1000
    link/ether 00:ac:e8:ab:e0:a4 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::2ac:e8ff:feab:e0a4/64 scope link
       valid_lft forever preferred_lft forever
リスト14.インターフェース

これを見ると、docker0のIPアドレスは 172.17.0.1 で、コンテナ内のネットワークアドレスは 172.17.0.0/16 であることがわかる。
また、 2つのインターフェース veth7153883@if5 と veth797aa8b@if7 が docker0 に繋がっていることがわかる。
コンテナdolphin-dbに入って"ip a"コマンドでネットワークインターフェースを調べると、eth0@if6というIPアドレスが172.17.0.2のインターフェースがある。また、コンテナdolphin-serverに入ってネットワークインターフェースを調べると、eth0@if8というIPアドレスが172.17.0.3のインターフェースがある。


IPv6の無効化 


IPv6を無効化するには/etc/sysctl.confに下記を追加してrebootする。

net.ipv6.conf.all.disable_ipv6=1
net.ipv6.conf.default.disable_ipv6=1
リスト15. IPv6の無効化

参考文献

  1. Ubuntuブリッジ化のメモ
  2. ubuntuでブリッジを作成
  3. NetworkManagerを使用しないネットワーク設定
  4. Ubuntuの固定IP設定方法
  5. dockerのコンテナの自動起動をsystemdにて行う際の注意点について
  6. systemd で Docker の管理・設定
  7. Docker + SoftetherVPNでマイクロサーバーを構築する

0 件のコメント:

コメントを投稿

OpenDolphinとORCAの連携

第3章の章末問題 第2章の章末問題でやったカルテ例1をOpenDolphinに入力してORCAで診療報酬明細書を作成し、模範解答と比較しなさい。 を実際にやってみたのでまとめておく。 OpenDolphinで過去にさかのぼってカルテは作成できるか? その前に標題に...