我有这个 EC2 实例,其私有 IP 为 172.31.11.204,公共 IP 为 34.205.XX。我的 Web 服务在私有 IP 172.31.11.204 和端口 31336 上运行。
- 在 EC2 中,我可以使用以下方式访问该服务
curl 172.31.11.204:31336
- 从我的电脑上,我可以使用 ec2 公共 IP 和端口 31336 访问它
curl 34.205.X.X:31336
但我无法使用端口 80 访问该服务,即 curl 34.205.26.X:80
我的安全组规则非常好。
另外,我尝试在 IPtables 中添加以下 nat 规则 -
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 172.31.11.204:31336
或者
sudo iptables -t nat -I PREROUTING --src 0/0 --dst 127.0.0.1 -p tcp --dport 80 -j REDIRECT --to-ports 31336
当我执行 tcpdump 时,我注意到传入连接符合上述规则,但返回流量却停留在 172.31.11.204.80
我搜索了很多次,但没有找到任何解决方案。
答案1
两个选项:
为什么不让你的应用程序监听端口 80 并完成它呢?由于你想将所有流量重定向到它,所以它不会降低安全性。
您可能需要在 INPUT 链中打开端口 80:
iptables -I INPUT -p tcp --dport 80 -j ACCEPT
然后是没有地址的重定向规则:
iptables -t nat -I PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 31336
也许吧
--to-ports 127.0.0.1:31336
,不确定。还可以尝试设置
sysctl -w net.ipv4.conf.eth0.route_localnet=1
-可能被需要。
但是如果我是你的话我会简单地让应用程序在端口 80 上监听 ;)
更新:你应该提到监听的容器31336
是由Kubernetes!在这种情况下,你需要的是服务它将接受外部连接并将其转发到荚。
更多详细信息请参见此处:https://kubernetes.io/docs/concepts/services-networking/service/
希望有帮助!