- 我有带有 1 个公共子网和 1 个私有子网的 AWS VPC。
- 我的 Web 服务器在私有子网的 80 端口上运行。
- 我希望这个网络服务器可以通过公共互联网访问
- 是的,VPC 安全组具有正确的配置,所以这不是问题。
- 不,我不想使用 ELB 或 nginX/Haproxy。我们不要讨论这个。
- 我想通过 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
在哪里:
10.0.1.132
是我的位于私有子网中的网络服务器的 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 端口时,它应该将请求重定向到内部 Web 服务器的 80 端口,但实际上并没有起作用。我的设置 ORiptables
规则有什么问题?
谢谢。
答案1
使用
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
答案2
仅使用DNAT
规则,您的 Web 服务器将尝试将回复直接发送到客户端的(公共)源 IP,而客户端可能无法从其私有子网访问该 IP。您还需要在路由器上设置 SNAT 或 MASQERADE 规则才能实现此功能。如下所示:
iptables -t nat -A POSTROUTING -p tcp --dport 80 -j MASQUERADE