iOS_の画像__2_

Dockerコンテナでのネットワーク作成とデスクトップ環境作成

DockerとVMの比較をいろいろやっていますが、コンテナ環境を使いやすくするためにネットワークの変更やデスクトップ環境を作れるようにしてみます。よく使っている環境として、VirtualBox上のUbuntuにDockerをインストールして、VirtualBoxのホストオンリーネットワークを共有させて使うことで、ホストOS・VirtualBoxゲストOS、Dockerコンテナを同じセグメント上で扱うことができ、柔軟な環境を構築できます。VirtualBoxの環境は他のマシンにも移しやすいので、同じ環境をそっくりそのまま別のマシンで使う時などに便利かと思いますし、直接インターネットに繋がないけど、ホストOSを仮想的にインターネットとみなしたハッキング・ラボ環境として演習などに使用することを想定しています。
また、目的が違う場合でも、Dockerのデフォルトネットワークではコンテナとの通信はポートフォワード設定が必要なので、面倒かなと思うことも多々あるので、使いやすいDockerネットワーク環境づくりの参考になればと思います。
自分用メモとか言っておきながら、参考になればとか偉そうなこと言ってしまった・・・いや、見てくれてる人がいるのがわかると嬉しくなってしまいますのですぐ調子に乗ります。

環境
ホストOS:MacOS X Catalina
仮想化ソフト:VirtualBox 6.0
ゲストOS:Ubuntu18.04LTS日本語Remix
コンテナ:Docker CE 18.09

まずは、VirtualBoxにUbuntuをインストールします。

スクリーンショット 2020-02-19 22.05.44

スクリーンショット 2020-02-19 22.15.33

Guest Additionsもインストールしておきます。

スクリーンショット 2020-02-19 22.17.47

続いて、Dockerをインストールします。sudo apt updateとsudo apt upgradeしてから、ソフトウェアセンターを使ってインストールしてみました。インストール方法は何でも良いと思います。

スクリーンショット 2020-02-19 22.43.28

まずネットワーク環境を確認してみます。ホストオンリーネットワークが、192.168.56.0/24で振られています。また、Dockerのデフォルトネットワークは、172.17.0.0/16のネットワークで、Docker0というブリッジ を介してNATされます。

(ホストオンリーネットワークのアダプタ)
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
   link/ether 08:00:27:64:67:ce brd ff:ff:ff:ff:ff:ff
   inet 192.168.56.26/24 brd 192.168.56.255 scope global dynamic noprefixroute enp0s3
      valid_lft 1162sec preferred_lft 1162sec
   inet6 fe80::13cb:25a8:c5ff:4aa9/64 scope link noprefixroute 
      valid_lft forever preferred_lft forever

(Dockerのブリッジ)
4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
   link/ether 02:42:33:4b:80:b5 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

ここで、Docker側からもホストオンリーネットワークを使えるように、同じセグメントのブリッジ ネットワークを作ってあげます。下記の場合、ゲストOSのUbuntuでの名称がdocker_bridgeというブリッジ で、Docker上でdocker_lanというネットワークが作成されます。ipの部分は適宜環境に合うようにしてください。

$ sudo docker network create --driver bridge \
--subnet 192.168.56.0/24 --gateway 192.168.56.200 \
-o com.docker.network.bridge.enable_icc=true \
-o com.docker.network.bridge.enable_ip_masquerade=false \
-o com.docker.network.bridge.name=docker_bridge docker_lan

こんな感じで、新たなインターフェースができているかと思います。このブリッジ をDocker側で使うように接続できれば、VirtualBoxのホストオンリーネットワークと同じセグメントで直接通信ができるようになります。

スクリーンショット 2020-02-19 23.08.36

以下のコマンドで接続していきますが、その前に192.168.56.0/24につながっているインターフェースの名称を確認しておきます。

スクリーンショット 2020-02-19 23.58.57

スクリーンショット 2020-02-19 23.56.08

この名称が、下記コマンドでインターフェースを指定している場所に入るので、間違えないように注意してください。経験上ですが、アダプター1に設定している時はenp0s3,有線接続1になるようです。

sudo nmcli connection modify docker_bridge ipv4.method manual ipv4.addresses "192.168.56.200/24"
sudo nmcli connection modify docker_bridge connection.autoconnect yes
sudo nmcli connection modify docker_bridge ipv4.never-default yes
sudo nmcli connection modify docker_bridge ipv4.may-fail no
sudo nmcli connection add type bridge-slave ifname enp0s3 master docker_bridge
sudo nmcli connection delete "有線接続 1"
sudo systemctl restart NetworkManager

実際に実行してみると以下のようになります。

スクリーンショット 2020-02-20 0.05.09

これでゲストOS側での準備は完了です。次はコンテナ側も同じネットワークに接続しますが、試しにubuntuのコンテナを作ります。

スクリーンショット 2020-02-20 0.09.27

これで「ubuntu」という名前のコンテナがたちあがったので、これが192.168.56.0/24のネットワークを使えるようにします。

$ sudo docker network connect --ip 192.168.56.201 docker_lan ubuntu

これで、ubuntuコンテナに192.168.56.201のアドレスが振られたはずです。試しにping打ってみます。

スクリーンショット 2020-02-20 0.13.31

返答あり!こう言うのは、ちゃんとなるだろうなと思ってても、できるまではちょっとドキドキしながら書いてます・・・。実際、ネットワークって特に何があるかわかんないですね。ちなみに、コンテナとホストOSを直接通信させたい場合はもちょっとルーティングとか必要かな?です。たぶん。デフォルトのブリッジ残すかどうかでも違うかな。いろいろな状況考えられそうです。
私はセキュリティの演習(ハッキングラボ)的な使い方が目的なので、あんまり直接の通信は無いほうが良いかなと言う事情があるので、とりあえずネットワーク的な部分は一旦ここまでとして、これでもネットワーク的にはかなり柔軟な構成が組めるのではと思います。

次は作ったコンテナにデスクトップ環境を設定してみます。まずはコンテナに接続して、必要なパッケージをインストールします。

# apt update
# apt install lxde
# apt install vnc4server

多分これだけで行けると思う。結構デスクトップパッケージは時間かかります。なお、別のデスクトップパッケージでも問題ないはずです。xubuntu-desktopとかいいかもです。次に、vncserverの設定をします。

一度立ち上げて設定ファイルを作ります。

# vncserver :1

You will require a password to access your desktops.

Password:
Verify:
xauth:  file /root/.Xauthority does not exist

New '17aed46f084d:1 ()' desktop is 17aed46f084d:1

Creating default startup script /root/.vnc/xstartup
Starting applications specified in /root/.vnc/xstartup
Log file is /root/.vnc/17aed46f084d:1.log

パスワードには任意のものをいれてください。のちほど」/root/.vnc/xstartupファイルが出来上がったので、下記のように編集します(viがなかったので、apt install vimでインストールしておきました)

#!/bin/sh

xrdb $HOME/.Xresources
xsetroot -solid grey
#x-terminal-emulator -geometry 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" &
#x-window-manager &
# Fix to make GNOME work
export XKL_XMODMAP_DISABLE=1
/etc/X11/Xsession
/usr/bin/startlxde

この辺の設定は、使ったパッケージとか状況によって多少異なるかも。ネットにもいろいろ情報あるので探してみてください。ファイル保存して、vncserverを一度停止して再度起動します。解像度指定で起動してみます。

# vncserver -kill :1
Killing Xvnc4 process ID 4437
# vncserver :1 -geometry 1366x768

New '17aed46f084d:1 ()' desktop is 17aed46f084d:1

Starting applications specified in /root/.vnc/xstartup
Log file is /root/.vnc/17aed46f084d:1.log

あとは、VNCクライアントから接続してみます。ソフトはなんでもいいですがremminaをインストールして使ってみました。ポート番号は5900+セッション番号?って言うのかな?この場合は5901です。きちんと設定できていれば、先ほど設定したパスワードが聞かれるはずです。

スクリーンショット 2020-02-20 1.01.13

無事接続できました!

スクリーンショット 2020-02-20 1.31.41

いろいろ汎用的に使えると思いますが、コンテナイメージのubuntuはいろいろ削ぎ落とされてるので、必要なものは追加して使う必要があります。
私は、ハッキングラボ的な演習環境で、操作用クライアントとか、脆弱なクライアントとかサーバとか、様々なクライアントを用意して使っています。必要に応じてdocker commitしてイメージを保存しておくと同じコンテナを大量生産できます。

$ sudo docker commit ubuntu ubuntu-lxde
$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu-lxde         latest              762919c74e4d        23 seconds ago      1.05GB
ubuntu              latest              ccc6e87d482b        4 weeks ago         64.2MB

まあ、容量ちょっとは大きくなりますが・・・。この時点でVirtualBoxのイメージも10GB弱ぐらいでした。想定内でしょうか。コンテナを数個増やしても、VMをいくつも作るよりは圧倒的に少ないリソース消費で使用できます。
コンテナは基本的には余計なものはいらないという考え方なので、デスクトップ環境が必要なものかそうじゃないのかなどをちゃんと分けて、最小限の構成で行けると良いと思います。

今回はこのへんで。


この記事が気に入ったらサポートをしてみませんか?