AWS EC2 上的 Iptables 端口转发

AWS EC2 上的 Iptables 端口转发
  1. 我有带有 1 个公共子网和 1 个私有子网的 AWS VPC。
  2. 我的 Web 服务器在私有子网的 80 端口上运行。
  3. 我希望这个网络服务器可以通过公共互联网访问
  4. 是的,VPC 安全组具有正确的配置,所以这不是问题。
  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是我的位于私有子网中的网络服务器的 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 端口时,它应该将请求重定向到内部 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

相关内容