在 centos7 上使用 iptables 进行端口转发

在 centos7 上使用 iptables 进行端口转发

我在具有公共地址的物理服务器上使用 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)规则集。

另请注意:

相关内容