之前服務器都是直接配置LNMP環境,最近手頭正好有一臺須要從新配置,想嘗試使用docker來配置多PHP版本環境。docker配置十分順利,感謝有明大佬的小冊,和DNMP項目。git
服務器配置好後,在幾天的試用過程當中,發現以下兩個問題:github
沒法訪問公網,沒法獲取真實IP,首先想到了防火牆的問題;關閉iptables,問題解決。但是iptables不能關呀,雖然說如今雲服務器都有安全組過濾,但防火牆是最後一道防線,不能在雲廠商的懷抱裏裸奔啊……docker
查看了docker的網絡部分,docker暴露容器端口是由docker-proxy來實現的,至於docker-proxy是什麼略過不表。確定是iptables影響了docker-proxy致使數據包的源ip發生了改變,沒法獲取真實IP;沒法訪問公網,則是數據包找不到出口,被iptables攔截掉了,在內網轉圈圈shell
假設個人公網IP爲 117.25.140.71api
NGINX容器內網IP爲 172.18.0.2安全
PHP容器內網IP爲 172.18.0.3 172.19.0.3服務器
添加以下規則網絡
-A PREROUTING -d 117.25.140.71 -p tcp -m tcp --dport 80 -j DNAT --to-destination 172.18.0.2:80
-A PREROUTING -d 117.25.140.71 -p tcp -m tcp --dport 443 -j DNAT --to-destination 172.18.0.2:443
複製代碼
重啓iptables 沒法獲取真實IP問題解決tcp
個人PHP容器訪問公網,需求大抵是發送短信之類(無郵件發送),用的都是http協議,因此這裏我沒有選擇所有轉發,而是隻轉發目的端口爲80和443的數據包spa
添加以下規則
-A POSTROUTING -s 172.19.0.3 -p tcp -m tcp --dport 80 -j SNAT --to 117.25.140.71
-A POSTROUTING -s 172.19.0.3 -p tcp -m tcp --dport 443 -j SNAT --to 117.25.140.71
複製代碼
重啓iptables發現仍然沒法訪問公網,是否是落下了什麼。。 對了,既然http協議訪問其餘域名提供的api服務,怎麼能少了DNS解析呢?添加DNS的支持(注意:DNS解析使用的是udp協議)
補充以下規則
-A POSTROUTING -s 172.19.0.3 -p udp -m udp --dport 53 -j SNAT --to 117.25.140.71
複製代碼
重啓iptables,大功告成!
最後總結幾點: