將 Docker 容器埠從 8002 轉發到 443 不起作用
我不太熟悉 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
-sTCP/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
.請記住,這樣的部署不能被視為生產就緒。它遺漏了很多東西,從安全和證書管理開始,到服務自動重啟結束。
參考: