くんすとの備忘録

プログラミングや環境設定の覚え書き。

「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

確認

f:id:kunst1080:20160514115010p:plain
……繋がっちゃいましたね……

ここで一旦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

もう一度アクセス

f:id:kunst1080:20160514115026p:plain

ちゃとブロックされました!!!

状態確認

もう一度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のことなんですね(多分)

ufwでポートを開放してみる

root@ubuntu:~# ufw allow 8080
Rule added
Rule added (v6)

もう一度アクセス

f:id:kunst1080:20160514115037p:plain

繋がった!!!

まとめ

  • 初期設定ではdocker用の仮想ブリッジはファイアウォールでACCEPTされる。
  • 「/etc/default/docker」に「DOCKER_OPTS="--iptables=false"」の設定を追加することでACCEPTされなくなる。
  • んでホストのufwからポートを開けたり閉じたりできる

広告