「docker run -p hostPort:containerPort」で起動したdockerコンテナへのアクセス(containerPortへのアクセス)をホストのファイアウォール(ufw)で制限したよという話。

環境

1
2
3
4
5
6
7
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。

1
2
3
4
5
6
ufw enable
ufw default DENY
ufw limit ssh
ufw allow http
ufw allow https
ufw logging low

状態確認

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
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)

1
2
3
4
5
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の設定を抜いておく(後で比較します)

1
root@ubuntu:~# iptables -L > 1_before

dockerの設定変更

設定変更と再起動

1
2
3
4
root@ubuntu:~# echo 'DOCKER_OPTS="--iptables=false"' >> /etc/default/docker
root@ubuntu:~# service docker restart
docker stop/waiting
docker start/running, process 13070

もう一度アクセス

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

状態確認

もう一度iptblesを取ってみましょう

1
root@ubuntu:~# iptables -L > 2_after

iptablesをdiffる

1
2
3
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」が何のアドレスかというと…

1
2
3
4
5
6
7
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
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
root@ubuntu:~# docker inspect jenkins | jq '.[0].NetworkSettings | { Gateway, IPAddress}'
{
  "IPAddress": "172.17.0.2",
  "Gateway": "172.17.0.1"
}

```docker用の仮想ブリッジから生えた、コンテナ用のIPのことなんですね(多分)<br/>
<br/>





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

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

#### もう一度アクセス
繋がった!!!<br/> <br/> ### まとめ <ul> <li>初期設定ではdocker用の仮想ブリッジはファイアウォールでACCEPTされる。</li> <li>「/etc/default/docker」に「DOCKER_OPTS="--iptables=false"」の設定を追加することでACCEPTされなくなる。</li> <li>んでホストのufwからポートを開けたり閉じたりできる</li> </ul> ### 参考 <ul> <li><a href="http://qiita.com/yakumo/items/07f0472c34299524e662">Dockerコンテナのポートをホストにマップすると危険 - Qiita</a></li> <li><a href="http://deeeet.com/writing/2014/05/11/docker-network/">Dockerのネットワークの基礎 | SOTA</a></li> <li><a href="http://qiita.com/nmrmsys/items/5b4a4bd2e3909db161b1">シェル芸で使いたい jqイディオム - Qiita</a></li> </ul>