AWS EC2上的Iptables端口转发

  1. 我拥有1个公有子网和1个私有子网的AWS VPC。
  2. 我有我的Web服务器在私有子网中的端口80上运行。
  3. 我想这个networking服务器可以访问公共互联网
  4. 是的,VPC安全组具有正确的configuration,所以这不是问题。
  5. 不,我不想使用ELB或nginX / Haproxy。 让我们不要讨论这个问题。
  6. 我想通过IPtalbes实现这一点。 我想在公共子网中有一个公共IP地址的实例,它应该充当一个使用iptables的Linux路由器。

这些是我运行我的实例在公有子网,并有公共IP地址的命令。

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 10.0.1.132:80 

哪里:

  1. 10.0.1.132是我的Web服务器坐在专用子网中的IP地址。
  2. eth0是我的实例的接口,它作为一个路由器,有一个私有的IP地址10.0.0.151

我有IP转发启用:

 # sysctl -p net.ipv4.ip_forward = 1 

这里是我的iptables状态:

 # iptables -t nat -L Chain PREROUTING (policy ACCEPT) target prot opt source destination DNAT tcp -- anywhere anywhere tcp dpt:http to:10.0.1.132:80 Chain POSTROUTING (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination 

现在,当我到达我的Linux路由器的公共DNS时,我什么都没有得到:

 $ curl -IL ec2-54-201-38-205.us-west-2.compute.amazonaws.com HTTP/1.0 504 Gateway Time-out Server: squid/2.7.STABLE9 Date: Wed, 20 Nov 2013 10:22:57 GMT Content-Type: text/html Content-Length: 1145 X-Squid-Error: ERR_CONNECT_FAIL 61 X-Cache: MISS from localhost X-Cache-Lookup: MISS from localhost:3128 Via: 1.0 localhost:3128 (squid/2.7.STABLE9) Connection: close 

所以这意味着,无论我做什么都不行。

我期待当我在公共的Linux路由器上到达端口80时,它应该已经将请求redirect到我的内部Web服务器的端口80,但是这不起作用。 我的设置或iptables规则有什么问题?

谢谢。

只有DNAT规则,您的networking服务器将尝试直接将答复发送到客户端的(公共)源IP,这可能无法从其私有子网访问。 您还需要在路由器上使用SNAT或MASQERADE规则才能工作。 像这样的东西:

 iptables -t nat -A POSTROUTING -p tcp --dport 80 -j MASQUERADE 

使用

 sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 10.0.1.132:80 sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT 

如果您正在使用Amazon Linux AMI VPC NAT实例,则伪装规则已经存在,否则请添加

 sudo iptables -t nat -A POSTROUTING -p tcp --dport 80 -j MASQUERADE