更新

更新

我有一台充当主机 (KVM)、代理和防火墙的服务器。为了访问此主机中的虚拟机提供的服务,iptables必须正常工作才能将数据包正确重定向到客户机。

问题出现在服务器关闭时(即:重启或断电)。当服务器再次启动时,端口重定向似乎不起作用(即:无法通过 SSH 连接到客户机或使用主机的重定向端口访问其服务)。

此时,我可以通过 SSH 连接到主机并验证iptables是否正在运行。但是,我需要service iptables restart确保一切按预期运行。

为什么会发生这种情况?这与使用 KVM 有关吗?如何避免iptables每次服务器宕机时都必须手动重新启动?

请注意,我不需要更改iptables配置就可以使一切按预期工作,我只需要重新启动服务(就好像配置没有正确应用或在某些时候被覆盖一样)。

更新

在主机上:

# chkconfig --list iptables
0:off   1:off   2:on    3:on    4:on    5:on    6:off

iptables重启服务前后规则对比:

  • 链条PREROUTING看上去一模一样。
  • INPUT链看起来非常相似。唯一的区别是在重新启动之前,有一些重复的条目,但条目的顺序也相似。
  • POSTROUTING链看起来非常相似。唯一的区别是在重新启动之前,有一些重复的条目,但条目的顺序也相似。
  • chainFORWARD看起来更加不同了,在重启服务之前,有一些重复的条目,但是,条目的顺序在前后发生了变化。

差异如下(PREROUTING链条已被排除,因为它在重新启动之前和之后看起来完全相同iptables):

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination        
MASQUERADE  tcp  --  10.0.0.0/24         !10.0.0.0/24         masq ports: 1024-65535
MASQUERADE  udp  --  10.0.0.0/24         !10.0.0.0/24         masq ports: 1024-65535
MASQUERADE  all  --  10.0.0.0/24         !10.0.0.0/24        
MASQUERADE  tcp  --  10.0.0.0/24         !10.0.0.0/24         masq ports: 1024-65535
MASQUERADE  udp  --  10.0.0.0/24         !10.0.0.0/24         masq ports: 1024-65535
MASQUERADE  all  --  10.0.0.0/24         !10.0.0.0/24        

Chain INPUT (policy ACCEPT)
target     prot opt source               destination        
ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0           udp dpt:53
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:53
ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0           udp dpt:67
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:67
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:443
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:80
ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0           udp dpt:53
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:53
ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0           udp dpt:67
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:67
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0          
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0          
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22
REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:3300
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:4333
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:443

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination        
ACCEPT     all  --  0.0.0.0/0            10.0.0.0/24         state RELATED,ESTABLISHED
ACCEPT     all  --  10.0.0.0/24          0.0.0.0/0          
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0          
REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-port-unreachable
REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-port-unreachable
ACCEPT     all  --  0.0.0.0/0            10.0.0.0/24         state NEW,RELATED,ESTABLISHED
ACCEPT     all  --  0.0.0.0/0            10.0.0.0/24         state RELATED,ESTABLISHED
ACCEPT     all  --  10.0.0.0/24          0.0.0.0/0          
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0          
REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-port-unreachable
REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-port-unreachable
REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination        

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination        
MASQUERADE  tcp  --  10.0.0.0/24         !10.0.0.0/24         masq ports: 1024-65535
MASQUERADE  udp  --  10.0.0.0/24         !10.0.0.0/24         masq ports: 1024-65535
MASQUERADE  all  --  10.0.0.0/24         !10.0.0.0/24        

Chain INPUT (policy ACCEPT)
target     prot opt source               destination        
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:443
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:80
ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0           udp dpt:53
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:53
ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0           udp dpt:67
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:67
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0          
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0          
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22
REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:3300
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:4333
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:443

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination        
ACCEPT     all  --  0.0.0.0/0            10.0.0.0/24         state NEW,RELATED,ESTABLISHED
ACCEPT     all  --  0.0.0.0/0            10.0.0.0/24         state RELATED,ESTABLISHED
ACCEPT     all  --  10.0.0.0/24          0.0.0.0/0          
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0          
REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-port-unreachable
REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-port-unreachable
REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

答案1

您是否有可能在文件 '/etc/network/interfaces' 中的“post-up iptables-restore < /etc/iptables.up.rules”行中使用了其他脚本

答案2

我的虚拟机使用 NAT 网络和由 libvirt 控制的虚拟网络,因此 libvirt 尝试更改 iptables 规则以将正确的流量发送到正确的 VM,但显然,它不能正常工作。

基本上,libvirt 在 iptables 已经加载其配置后向 iptables 添加规则。

快速、肮脏的黑客攻击

简单且实用:

echo "service iptables restart" >> /etc/rc.d/rc.local

/etc/rc.d/rc.local被处决所有其他初始化脚本。

其他选择(仅是想法)

  • 一种解决方案可能是使用 libvirt“钩子”脚本,它可以做得更好一些(参见libvirt 和使用 nat - iptables 覆盖进行网络过滤)。
  • 重新设计网络以使其不使用 NAT(这不是真正的解决方案,它只是意味着改变服务器架构)。
  • 将服务器更新到 CentOS 7(现在使用 CentOS 6)也可能有帮助(使用firewalld)。

如果您能提供更详细的解决方案(要遵循的步骤)或新的选项来扩展此答案,我们将不胜感激。

感谢 TrevorH 和 #centos (freenode) 的人们提供的帮助。

相关内容