使用 iptables 将 http 流量转发到另一个 IP 地址

Lig*_*ard 6 linux web-hosting iptables

我们希望将所有 http 流量转发到 Amazon EC2 股票 Linux 机器(基于 CentOS)上的另一个 IP 地址。我知道如何使用代理规则和 apache 来做到这一点,但我假设 iptables 将是一个更快的解决方案(也许不是!)

命令

须藤 iptables -P 输入接受
须藤 iptables -F
sudo iptables -A PREROUTING -t nat -p tcp -i eth0 --dport 80 -j DNAT --to 208.68.208.81:80
sudo iptables -A FORWARD -p tcp -d 208.68.208.81 --dport 80 -j ACCEPT

iptables -t nat -L -v -n

链 PREROUTING(策略接受 0 数据包,0 字节)
 pkts 字节目标 prot 选择退出源目标
    0 0 DNAT tcp -- eth0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 到:208.68.208.81:80

Chain INPUT(策略接受0包,0字节)
 pkts 字节目标 prot 选择退出源目标

Chain OUTPUT(策略接受11个数据包,820字节)
 pkts 字节目标 prot 选择退出源目标

Chain POSTROUTING(策略接受 11 个数据包,820 字节)
 pkts 字节目标 prot 选择退出源目标

iptables -L -v -n

Chain INPUT(策略接受202个数据包,15705字节)
 pkts 字节目标 prot 选择退出源目标

Chain FORWARD(策略接受 0 个数据包,0 个字节)
 pkts 字节目标 prot 选择退出源目标
    0 0 接受 tcp -- * * 0.0.0.0/0 208.68.208.81 tcp dpt:80

Chain OUTPUT(策略接受145个数据包,13747字节)
 pkts 字节目标 prot 选择退出源目标

http://208.68.208.81进入网络浏览器可以工作,但是当我使用此配置尝试 EC2 机器的 IP 地址时,我得到了超时。我确实看到一些数据包出现watch -d iptables -t nat -L -v -n

帮助!

更新:添加-i eth0到 PREROUTING 规则

Pet*_*een 5

我看到三个潜在的问题(与其他答案相反,即使在问题的未经编辑版本中,我也没有看到任何会导致“循环”的问题)。

  1. 必须启用 IP 转发。
  2. 在被 nat 并放回网络后,数据包可能会成为源地址过滤的受害者,因为它看起来非常像欺骗数据包。
  3. 对经过 NAT 的数据包的响应必须经过相同的 NAT,以便可以执行反向转换。否则,客户端将收到带有错误源 IP/端口的响应,并且可能会丢弃该响应(如果尚未通过反向路径过滤将其丢弃)。

除了 DNAT 之外,您还可以使用 SNAT 或 MASQURADE 规则来解决第 2 点和第 3 点,但如果您这样做,则会丢失流量的原始源 IP。这将使滥用控制变得非常困难。

第 2 点和第 3 点的另一个解决方案是在两台服务器之间设置 VPN。然后使用 DNAT 通过 VPN 转发流量,并使用基于源 IP 的路由将回复带回 NAT。