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

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

我们希望将所有 http 流量转发到 Amazon EC2 普通 Linux 机器(基于 CentOS)上的另一个 IP 地址。我知道如何通过代理规则和 apache 来实现这一点,但我以为 iptables 会是一个更快的解决方案(也许不是!)

命令

sudo iptables -P 输入接受
sudo 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 字节数 目标 协议 选择加入 退出 源 目标
    0 0 DNAT tcp -- eth0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 到:208.68.208.81:80

链输入(策略接受 0 个数据包,0 字节)
 pkts 字节数 目标 协议 选择加入 退出 源 目标

链输出(策略接受 11 个数据包,820 字节)
 pkts 字节数 目标 协议 选择加入 退出 源 目标

链 POSTROUTING(策略接受 11 个数据包,820 字节)
 pkts 字节数 目标 协议 选择加入 退出 源 目标

iptables -L -v -n

链输入(策略接受202个数据包,15705字节)
 pkts 字节数 目标 协议 选择加入 退出 源 目标

链转发(策略接受 0 个数据包,0 字节)
 pkts 字节数 目标 协议 选择加入 退出 源 目标
    0 0 接受 tcp -- * * 0.0.0.0/0 208.68.208.81 tcp dpt:80

链输出(策略接受 145 个数据包,13747 字节)
 pkts 字节数 目标 协议 选择加入 退出 源 目标

http://208.68.208.81进入 Web 浏览器是可行的,但当我尝试使用此配置的 EC2 计算机的 IP 地址时,我得到了超时。我确实看到一些数据包显示watch -d iptables -t nat -L -v -n

帮助!

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

答案1

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

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

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

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

答案2

您可以使用 rinetd 来简单地转发您的 IP 流量。

答案3

您已创建了一个循环。请确保将 in 接口添加到PREROUTING规则中(例如-i eth1或其他)。

您可能还需要这样的规则:

Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination 

  45M 3723M MASQUERADE  all  --  *     WAN_IF  0.0.0.0/0            0.0.0.0/0  

否则,我认为数据包将直接从转发到的机器返回到客户端,而客户端不会期待来自该主机的数据包。

相关内容