背景
今天出現了一個奇怪的現象,centos伺服器上的防火牆(firewall)沒有開放8103埠,但是依然可以訪問
伺服器開放的埠如下:
可以看出並沒有開放8103埠
開放的服務如下:
失敗的原因,如下:
docker run -p 啟動的時候會往iptables裡面新增規則,firewall底層是基於iptables的,所以-p引數啟動等於在防火牆上打了個洞
因為我是在docker的宿主機上控制埠訪問,所以簡單粗暴直接讓docker不使用iptables,操作如下:
vi /usr/lib/systemd/system/docker.service
在檔案中新增 --iptables=false
systemctl daemon-reload systemctl restart docker
重啟 Docker 搞定!!!
注意:完成上述步驟以及可以採用系統 firewall 控制埠訪問,但會出現 docker 容器間無法訪問,而且容器內也無法訪問外部網路。
使用類似 NAT 網路方式使得 docker 可以訪問外部網路
firewall-cmd --permanent --zone=public --add-masquerade
談談使用該方法解決 docker 無視系統防火牆問題所帶來的缺點:容器內無法獲取得到客戶端的真實 IP,由於是類似 NAT 網路,常常 nginx 日誌上記錄的是 docker0 網路的子網 IP,對於一些業務無法獲取真實 IP 可能不能容忍,看個人的取捨吧。