Networking
IPTables - 僅允許特定 IP 地址的 Docker 埠轉發
我在 Ubuntu 16.04 上託管一個網路應用程序。這個應用程序的所有組件都在 Docker 容器內,它們中的大多數只需要相互通信,而不需要與外界通信(如 PostgreSQL 或 ElasticSearch)。例如 ElasticSearch 預設在埠 9200 上公開它的外掛介面。
作為管理員,我需要訪問這些界面,但我只想將其限制在我的工作電腦上。
我已嘗試按照說明僅允許特定 IP 用於 port,但似乎 Docker 覆蓋了我的規則:
## ALLOW specific ports only on ONE IP address: # ElasticSearch iptables -I INPUT -p tcp -s MyWorkIP --dport 9200 -j ACCEPT iptables -I INPUT -p tcp -s 0.0.0.0/0 --dport 9200 -j DROP iptables -I INPUT -p tcp -s MyWorkIP --dport 9300 -j ACCEPT iptables -I INPUT -p tcp -s 0.0.0.0/0 --dport 9300 -j DROP iptables -I INPUT -p tcp -s MyWorkIP --dport 5601 -j ACCEPT iptables -I INPUT -p tcp -s 0.0.0.0/0 --dport 5601 -j DROP # PostgreSQL iptables -I INPUT -p tcp -s MyWorkIP --dport 5432 -j ACCEPT iptables -I INPUT -p tcp -s 0.0.0.0/0 --dport 5432 -j DROP
我正在通過嘗試
page:port
從我的工作電腦(MyWorkIP
在腳本中)和我的手機(動態 IP)訪問特定內容來測試所有內容,但是任何嘗試都允許我從這兩個設備訪問。我需要的是任何其他IPMyWorkIP
都被拒絕;所以我的手機無法訪問。我不太擅長 IPtables 配置,所以我不確定從哪裡開始我的調查……(我沒有在這台伺服器上安裝 X:我在一個學期內完成所有事情)
任何想法/想法?
我設法使它與此一起使用:
刪除所有連接(入站和出站),除了來自 ipyouwanttoallow 的連接
iptables -I DOCKER ! -s ipyouwanttoallow -j DROP
接受從您的容器本地 IP 到世界的所有連接
iptables -I DOCKER -s localipofyourcontainer -d 0.0.0.0/0 -j ACCEPT
允許外部伺服器回答您的容器請求所必需的
iptables -I DOCKER -m state --state ESTABLISHED,RELATED -j ACCEPT
有兩個可能的問題:
- 您需要在介面上或預設情況下啟用轉發。
- 您將需要從您的手機進行埠轉發,可能還需要從您的 work_ip 進行轉發。
考慮使用防火牆建構器工具來建構您的防火牆規則。我更喜歡使用
shorewall
它,因為它有很好的文件,有很好的範例配置,並且配置了文件。ufw
是另一種選擇。兩者都可以作為 Ubuntu 軟體包使用。您可以使用隧道或代理來提供您的訪問權限。