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

### ufwでポートを開放してみる ``` root@ubuntu:~# ufw allow 8080 Rule added Rule added (v6) ```
#### もう一度アクセス
繋がった!!!

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