这些是我运行我的实例在公有子网,并有公共IP地址的命令。
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 10.0.1.132:80
哪里:
10.0.1.132是我的Web服务器坐在专用子网中的IP地址。 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