在docker中運行第三方服務時,通常需要綁定服務埠到本地主機。但使用 -p 參數進行的埠映射,會自動在iptables中建立規則,繞過firewalld,這對於埠級的黑白名單控制管理是很不利的,所以我們需要對iptables進行手動修改。 這裡以從名為centos.19.09.05的imag ...
在docker中運行第三方服務時,通常需要綁定服務埠到本地主機。但使用 -p 參數進行的埠映射,會自動在iptables中建立規則,繞過firewalld,這對於埠級的黑白名單控制管理是很不利的,所以我們需要對iptables進行手動修改。
這裡以從名為centos.19.09.05的image建立一個容器為例:
首先,如果系統是CentOS7的話,需要關閉自帶firewalld防火牆,並切換為iptables.
假設需要將新容器的27017埠映射到主機的27017埠,一般情況下我們使用命令
docker run -idt -p 27017:27017 centos.19.09.05 /bin/bash
在容器中27017埠服務運行起來後,我們在外網使用埠掃描工具,發現本地主機的27017埠已經打開了,而我們還未在防火牆上進行開放操作;此時檢查iptabes規則:
iptables --list
發現在Chain DOCKER下多出了一條
Chain DOCKER (1 references) target prot opt source destination ACCEPT tcp -- anywhere 172.17.0.2 tcp dpt:27017
其中172.17.0.2為該容器在docker網橋中的IP,可見該規則允許任意來源的地址訪問27017埠,所以我們需要刪除該規則,並替換成安全性更高的規則。
#刪除DOCKER鏈中的1號規則;如果待刪除規則不位於第一行,則將數字改為對應行號 iptables -D DOCKER 1 #此容器只接受來自地址123.345.456.567的連接請求 iptables -A DOCKER -s 123.345.456.567 -d 172.17.0.2 -p tcp --sport 27017 -j ACCEPT
再次進行埠掃描,發現27017埠已經關閉,只有IP為123.234.345.456的主機能夠連接。