我有一台充当主机 (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
链看起来非常相似。唯一的区别是在重新启动之前,有一些重复的条目,但条目的顺序也相似。 - chain
FORWARD
看起来更加不同了,在重启服务之前,有一些重复的条目,但是,条目的顺序在前后发生了变化。
差异如下(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) 的人们提供的帮助。