我们希望将所有 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
我发现有三个潜在问题(与其他答案相反,即使在问题的未编辑版本中,我也没有看到任何会导致“循环”的问题)。
- 必须启用 IP 转发。
- 经过网络地址转换并放回网络后,该数据包可能会成为源地址过滤的牺牲品,因为它看起来非常像一个欺骗数据包。
- 对通过 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
否则,我认为数据包将直接从转发到的机器返回到客户端,而客户端不会期待来自该主机的数据包。