2016-08-08

解決 Docker 造成 UFW 防火牆設定失效的方法

阿舍習慣在安裝好 Ubuntu 之後,就會用 UFW 來把防火牆給打開,然後,再依需要來打開會用到的 Port,所以,阿舍在安裝 Docker 之後也沒多想,因為,阿舍從來就沒有懷疑過 Docker 會做什麼突穿防火牆的事,但是,事實證明,這個 Docker 是會去動防火牆的設定的,只怪阿舍學藝不精哩 ! ... 呵 !


阿舍用下面的指令起了一個 CouchDB 資料庫 Docker Container,然後,因為,阿舍在 CouchDB 的前面有用 Nginx Porxy 來讓外部用 SSL/TLS 連進來,所以,阿舍的 CouchDB 就不用直接對外開放 5984 埠,因此,阿舍就以為,阿舍沒有用 UFW 來打開 5984 埠,那麼外面的世界就應該看不到阿舍有 5984 埠才對哩 ...

docker run --name couchdb-ayu -p 5984:5984 -d couchdb

不過,阿舍運氣不錯,突然心血來潮,用下面第一行的指令檢查完成 UFW 的設定 後,確定沒有開啟 5984 埠後,就用自己的電腦用下了下面第二行的 nc 指令來試了一下,結果,竟然是傳回 "Successed" 的訊息,阿舍不想信,所以,再用了 telnet 指令來確認一下,喔 ! 真的有連線成功哩 .... 怎會這樣呢 ?

$ sudo ufw status verbose

$ nc -zv xyz.arthurtoday.com 5984

$ telnet xyz.arthurtoday.com 5984

阿舍的 UFW 的設定看來就明明沒有打開 5984 埠哩 ! 好,看來,阿舍看到的設定不是最終的結果,阿舍記得,有人說 UFW 是 iptable 的一個 Shell,所以,阿舍也許可以直接來看一下 iptable 的設定是如何,也許就可以找出問題吧 ! 因此,阿舍就用了下面的指令來列出 iptable 的內容 ... 結果,其實,也看不出個所以然來,因為 Ubuntu 版的 iptable 已經和 UFW 的規則整合過,會直接讀 UFW 的規則而不是直接轉換成 iptable 的規則哩 ~~ (不過,阿舍對 iptable 沒有很熟,也許有方式可以查的出來哩 ! )

$ sudo iptables -L

後來,阿舍再查了一下 UFW 的指令後才發現,其實,是可以用下面這一行指令來詳列出 UFW 的規則的,然後,阿舍就發現,怎麼有一個 Docker 的 ACCEPT ALL 的規則插在 DROP ALL 的前面,難怪阿舍的 5984 埠不用設定就自動開啟了哩 !

$ sudo ufw show raw

於是,阿舍就去找了一下,嗯 ! 果然,這是一個常見的問題,在這一篇文裡有提到一種解法,就是在 /etc/default/docker 的設定檔裡,把「DOCKER_OPTS」這個選項改成下面這樣來讓 Docker 不去調整 iptable 的設定。

DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4 --iptables=false"

不過,阿舍似乎是不太能用這一招,因為,阿舍在同一台機器上還有另一個 Docker Container 是有綁外部 IP 來直接對外做服務的,如果這樣設定,阿舍可能就要再調整相關設定,有點麻煩哩 ! 所以,阿舍就再花時間看看有沒有其它的方法 ... 結果,是有的。

原來,一切都是阿舍的習慣的問題,就是在用 Docker 的 run 指令的 -p 選項的時候,沒習慣加上綁定的 IP 位址,所以,就會讓 Docker 聰明的幫忙開啟防火牆了哩 ! 舉例來說,阿舍習慣用下面第一行指令的方式來把 Container 的 port 給 Expose 到 Host,但是,比較安全且正確的作法應該是下第二行的方式,也就是要明確的把 IP 位址給指定出來哩 !

$ docker run -p 5984:5984 -d couchdb

$ docker run -p 127.0.0.1:5984:5984 -d couchdb

阿舍用上面第二行的方式後,再測了一下,果然,就不會讓防火牆漏洞了,而且,也不需要去調整 Docker 的 iptable 設定就可以解決了哩 ! 所以,阿舍是建議,各位在用 Docker 的 -p 選項時,請多加注意,儘量明確的指出它綁定的 IP 位址,這樣,似乎就可以避掉一些麻煩哩 ... 供參囉 !


推薦閱讀


有疑問? 問題還是沒解決嗎? 歡迎下方留言提問和討論 😁

2 則留言 :

Unknown 提到...

太感謝了!

匿名 提到...

太感謝了!!
太可怕了吧!
我都不知道這件事情....
我覺得這件事情很嚴重餒.....

張貼留言

歡迎留言提問和討論 .... 😁