将 Docker 容器端口从 8002 转发到 443 不起作用

将 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

答案1

不应该更改内部运行的容器端口而不重建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.

请记住,此类部署不能视为生产就绪。它错过了从安全和证书管理开始到服务自动重启的许多事情。

参考:

相关内容