「docker run -p hostPort:containerPort」で転送したポートへのアクセスをufwで制限する
「docker run -p hostPort:containerPort」で起動したdockerコンテナへのアクセス(containerPortへのアクセス)をホストのファイアウォール(ufw)で制限したよという話。
環境
root@ubuntu:~# uname -a Linux ubuntu 3.13.0-32-generic #57-Ubuntu SMP Tue Jul 15 03:51:08 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux root@ubuntu:~# cat /etc/lsb-release DISTRIB_ID=Ubuntu DISTRIB_RELEASE=14.04 DISTRIB_CODENAME=trusty DISTRIB_DESCRIPTION="Ubuntu 14.04.4 LTS"
ファイアウォールの設定
ufwを設定
sshはlimit、httpとhttpsをallow、それ以外はdeny。
ufw enable ufw default DENY ufw limit ssh ufw allow http ufw allow https ufw logging low
状態確認
root@ubuntu:~# ufw status Status: active To Action From -- ------ ---- 22 LIMIT Anywhere 80 ALLOW Anywhere 443 ALLOW Anywhere 22 (v6) LIMIT Anywhere (v6) 80 (v6) ALLOW Anywhere (v6) 443 (v6) ALLOW Anywhere (v6)
dockerコンテナ起動
Jenkinsおじさんを立てる(8080 -> 8080)
root@ubuntu:~# docker run -d --name jenkins -p 8080:8080 --restart=unless-stopped blacklabelops/jenkins 65e39eba333e3c215912864d80ff061a36f4cd3ce20a6a1be320e596a2f27236 root@ubuntu:~# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 65e39eba333e blacklabelops/jenkins "/bin/tini -- /home/j" 11 seconds ago Up 8 seconds 0.0.0.0:8080->8080/tcp, 50000/tcp jenkins
確認
……繋がっちゃいましたね……
ここで一旦iptablesの設定を抜いておく(後で比較します)
root@ubuntu:~# iptables -L > 1_before
dockerの設定変更
設定変更と再起動
root@ubuntu:~# echo 'DOCKER_OPTS="--iptables=false"' >> /etc/default/docker root@ubuntu:~# service docker restart docker stop/waiting docker start/running, process 13070
もう一度アクセス
ちゃとブロックされました!!!
状態確認
もう一度iptblesを取ってみましょう
root@ubuntu:~# iptables -L > 2_after
iptablesをdiffる
root@ubuntu:~# diff 1_before 2_after 35d34 < ACCEPT tcp -- anywhere 172.17.0.2 tcp dpt:http-alt
(http-alt は 8080)
dockerの設定後は、「172.17.0.2」の8080へのACCEPTが消えているようです。
NICの状態を確認
「172.17.0.2」が何のアドレスかというと…
root@ubuntu:~# ip a s docker0 3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 02:42:e0:9d:eb:72 brd ff:ff:ff:ff:ff:ff inet 172.17.0.1/16 scope global docker0 valid_lft forever preferred_lft forever inet6 fe80::42:e0ff:fe9d:eb72/64 scope link valid_lft forever preferred_lft forever
root@ubuntu:~# docker inspect jenkins | jq '.[0].NetworkSettings | { Gateway, IPAddress}' { "IPAddress": "172.17.0.2", "Gateway": "172.17.0.1" }
docker用の仮想ブリッジから生えた、コンテナ用のIPのことなんですね(多分)