我不太熟悉 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
.
请记住,此类部署不能视为生产就绪。它错过了从安全和证书管理开始到服务自动重启的许多事情。
参考: