Iptables

將 Docker 容器埠從 8002 轉發到 443 不起作用

  • January 3, 2018

我不太熟悉 iptables 和不同規則的所有細微差別。我正在學習,但我需要這個加急,這就是我在這裡問的原因。

我在 AWS EC2 實例上的 Docker 內執行 WebLogic 容器。容器正在使用docker run -d -p 8002:8002 weblogic. 我沒有建立圖像,所以有些東西必須保留。由於網路限制,我需要從外部通過埠 443 訪問 WebLogic 伺服器,即使它被建構為通過埠 8002 訪問。

我嘗試了各種 iptables 規則,但都沒有成功轉發。即使有轉發 8002 -> 443 的規則,容器仍然可以在 8002 上訪問。

執行RHEL 7.3並且 Dockerfile 是為 iptables 建構的,而不是為 firewalld 建構的。其中一些東西我無法控制,所以我必須使用我擁有的東西。

我試過的 iptables 命令之一是:

iptables -t nat -A OUTPUT -p tcp --dport 8002 -j DNAT --to-destination 127.0.0.1:443

注意:我知道執行service iptables save. 我可以使用iptables -S.

編輯:這是我目前的 iptables 規則

-P INPUT ACCEPT  
-P FORWARD ACCEPT  
-P OUTPUT ACCEPT  
-N DOCKER  
-N DOCKER-ISOLATION  
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT  
-A INPUT -p icmp -j ACCEPT  
-A INPUT -i lo -j ACCEPT  
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT  
-A INPUT -j REJECT --reject-with icmp-host-prohibited  
-A FORWARD -j DOCKER-ISOLATION  
-A FORWARD -o docker0 -j DOCKER  
-A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT  
-A FORWARD -i docker0 ! -o docker0 -j ACCEPT  
-A FORWARD -i docker0 -o docker0 -j ACCEPT  
-A FORWARD -j REJECT --reject-with icmp-host-prohibited  
-A FORWARD -i eth0 -p tcp -m tcp --dport 443 -j ACCEPT  
-A DOCKER -d 172.17.0.2/32 ! -i docker0 -o docker0 -p tcp -m tcp --dport 8002 -j  ACCEPT  
-A DOCKER-ISOLATION -j RETURN

不應該Docker在不重建映像的情況下更改內部執行的容器埠。EXPOSE級別的命令Dockerfile負責暴露容器的埠。您可以使用命令檢查暴露的容器埠

docker inspect <image-name>

正如文件所說,weblogic伺服器TCP/8002預設執行。所以,我假設你想讓你的容器可以訪問443,你需要輸入:

docker run -d -p 443:8002 weblogic

它只是NAT-s TCP/443(在主機級別)-> TCP/8002(容器命名空間級別)。你也可以在裡面看到iptables

iptables -t nat -L

它將通過以下方式可見:

docker ps 

您將看到以下文本:0.0.0.0:443->127.0.0.1:8002

下一步。您需要添加防火牆的(iptables具體)規則以允許TCP/443.

所以:

iptables -t filter -A INPUT -p tcp --dport 443 -j ACCEPT

有了它,您將配置系統的防火牆允許流量到TCP/443.

還缺少一件事。您需要配置與 EC2 關聯的安全組以允許連接到TCP/443.

請記住,這樣的部署不能被視為生產就緒。它遺漏了很多東西,從安全和證書管理開始,到服務自動重啟結束。

參考:

引用自:https://unix.stackexchange.com/questions/414375