我在具有公共地址的物理服务器上使用 Centos7,并且在 KVM 环境中运行客户机,其私有 IP 地址为 192.168.122.2。我需要在客户机中安装 httpd 并将流量从公共 IP 地址重定向到私有地址 192.168.12.2。我尝试过:iptables -t Nat -A PREROUTING -I em1 -p TCP --deport 80 -j DNAT --to-destination 192.168.122.2:80
其中:em1 是我的物理机上的网络接口,但它不起作用。转发已激活,命令 iptables -nvL 返回:
链转发(策略丢弃 12 个数据包,720 字节)数据包字节目标协议选择加入退出源目标
7 420 接受 tcp -- * * 0.0.0.0/0 192.168.122.2 tcp dpt:80
链输出(策略接受 406 个数据包,59695 字节)pkts 字节目标协议选择加入源目标
0 0 DROP icmp -- * * 0.0.0.0/0 0.0.0.0/0 icmptype 0
问候
答案1
您的规则集缺少允许传入流量返回路径的有状态部分。如果没有它,TCP SYN 数据包会被从远程接受(如数据包计数器所示:7),但从内部到原始远程源的回复数据包(以 TCP SYN-ACK 开头)很可能被默认策略 DROP 规则丢弃(如丢弃的 12 个数据包所示,可能是回复加上几次重试)。
通过指定状态规则的位置,将其作为自然顺序中的前两个规则插入:
iptables -I FORWARD 1 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -I FORWARD 2 -m conntrack --ctstate INVALID -j DROP
第二条规则(... --ctstate INVALID -j DROP
)也应该使用,特别是如果稍后,某些规则会拒绝数据包而不是仅仅 DROP 它们。
如果这还不足以解决您的问题,您应该在问题中添加此命令的输出,以便我可以尝试进一步提供帮助:
iptables-save -c
iptables-save
,相反iptables -nvL
产生一个完整的和可重复(使用iptables-restore
)规则集。
另请注意:
- NAT 表与 一起使用
-t nat
,而不是-t Nat
。 - 不加区分地丢弃 ICMP 数据包可能会造成连接问题尤其是当路上有隧道的时候。虽然掉落传出ICMP 可能不是造成此类问题的原因。