「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>