如何在 KVM 主机上设置 IPTables - iptables-persistent 被忽略

如何在 KVM 主机上设置 IPTables - iptables-persistent 被忽略

我正在尝试在运行一些 KVM 客户机的 ubuntu 14.04.1 主机上设置一些特定的 IPTables 规则。

该盒子有多个具有多个 IP 地址的 NIC,并且客户机根据其功能使用不同的地址。

我通常使用 iptables-persistent 来实现这一点,但由于某种原因,/etc/iptables/rules.v4 下的规则在启动时不会被加载。当未安装 libvirt 时,iptables-persistent 可以正常工作。

如果我运行“/etc/init.d/iptables-persistent start”,那么规则就会被加载,设置也会如我所料。但在启动时却不是这样。我尝试创建一个非常简单的 rules.v4 文件来调试它,但它仍然没有加载。

iptables-persistent 的初始化符号链接位于 /etc/rc2.d/S37iptables-persistent

我已确认 ufw 已禁用。我还从 /etc/libvirt/nwfilter 中删除了 nwfilter 规则,virsh nwfilter-list 不显示任何条目。

还有什么可以设置这些规则以及如何根据我的需要定制它们吗?

ufw 状态输出

# ufw status
Status: inactive

virsh nwfilter-list 输出

# virsh nwfilter-list
 UUID                                  Name                 
------------------------------------------------------------------

/etc/iptables/rules.v4 的内容

*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:LOG_AND_DROP - [0:0]
-A INPUT -s 192.168.10.0/24 -i br0 -j ACCEPT
-A INPUT -s 192.168.11.0/24 -i br0 -j ACCEPT
-A LOG_AND_DROP -j LOG --log-prefix "iptables deny: " --log-level 7
-A LOG_AND_DROP -j DROP
COMMIT

启动后 iptables -L -n 的输出(不想要的结果)

# iptables -L -n -v
Chain INPUT (policy ACCEPT 12 packets, 912 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 ACCEPT     udp  --  virbr0 *       0.0.0.0/0            0.0.0.0/0            udp dpt:53
    0     0 ACCEPT     tcp  --  virbr0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:53
    0     0 ACCEPT     udp  --  virbr0 *       0.0.0.0/0            0.0.0.0/0            udp dpt:67
    0     0 ACCEPT     tcp  --  virbr0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:67
    0     0 ACCEPT     udp  --  tunnelbr0 *       0.0.0.0/0            0.0.0.0/0            udp dpt:53
    0     0 ACCEPT     tcp  --  tunnelbr0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:53
    0     0 ACCEPT     udp  --  tunnelbr0 *       0.0.0.0/0            0.0.0.0/0            udp dpt:67
    0     0 ACCEPT     tcp  --  tunnelbr0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:67
    0     0 ACCEPT     udp  --  mgmtbr0 *       0.0.0.0/0            0.0.0.0/0            udp dpt:53
    0     0 ACCEPT     tcp  --  mgmtbr0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:53
    0     0 ACCEPT     udp  --  mgmtbr0 *       0.0.0.0/0            0.0.0.0/0            udp dpt:67
    0     0 ACCEPT     tcp  --  mgmtbr0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:67
  193 17300 ACCEPT     all  --  br0    *       192.168.10.0/24      0.0.0.0/0           
    0     0 ACCEPT     all  --  br0    *       192.168.11.0/24      0.0.0.0/0           

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 ACCEPT     all  --  *      virbr0  0.0.0.0/0            192.168.122.0/24     ctstate RELATED,ESTABLISHED
    0     0 ACCEPT     all  --  virbr0 *       192.168.122.0/24     0.0.0.0/0           
    0     0 ACCEPT     all  --  virbr0 virbr0  0.0.0.0/0            0.0.0.0/0           
    0     0 REJECT     all  --  *      virbr0  0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable
    0     0 REJECT     all  --  virbr0 *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable
    0     0 ACCEPT     all  --  tunnelbr0 tunnelbr0  0.0.0.0/0            0.0.0.0/0           
    0     0 REJECT     all  --  *      tunnelbr0  0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable
    0     0 REJECT     all  --  tunnelbr0 *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable
    0     0 ACCEPT     all  --  mgmtbr0 mgmtbr0  0.0.0.0/0            0.0.0.0/0           
    0     0 REJECT     all  --  *      mgmtbr0  0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable
    0     0 REJECT     all  --  mgmtbr0 *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable

Chain OUTPUT (policy ACCEPT 132 packets, 17456 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 ACCEPT     udp  --  *      virbr0  0.0.0.0/0            0.0.0.0/0            udp dpt:68
    0     0 ACCEPT     udp  --  *      tunnelbr0  0.0.0.0/0            0.0.0.0/0            udp dpt:68
    0     0 ACCEPT     udp  --  *      mgmtbr0  0.0.0.0/0            0.0.0.0/0            udp dpt:68

Chain LOG_AND_DROP (0 references)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 LOG        all  --  *      *       0.0.0.0/0            0.0.0.0/0            LOG flags 0 level 7 prefix "iptables deny: "
    0     0 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0 

运行 /etc/init.d/iptables-persistent start 后 iptables -L -n -v 的输出(预期结果)

# iptables -L -n -v
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
   13   920 ACCEPT     all  --  br0    *       192.168.10.0/24      0.0.0.0/0           
    0     0 ACCEPT     all  --  br0    *       192.168.11.0/24      0.0.0.0/0           

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 8 packets, 1104 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain LOG_AND_DROP (0 references)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 LOG        all  --  *      *       0.0.0.0/0            0.0.0.0/0            LOG flags 0 level 7 prefix "iptables deny: "
    0     0 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0           

答案1

您看到的所有“额外”规则都是由 libvirt 守护程序添加的,用于支持(和保护)虚拟机客户端的虚拟网络。您通常无需担心这些规则(也不应该尝试保留它们,因为它们会在下次启动时重复)。

很明显,你所有的持久防火墙规则添加到防火墙。

-v如果没有`iptables 命令的关键开关,辨别这些事实将非常困难甚至不可能。

答案2

我知道这个问题已经很老了,但由于你的问题这些规则从何而来以及如何定制它们,还没有完全回答,我会尝试这样做......

正如 Michael Hampton 所说,这些规则来自 libvirt。以下是来自libvirt 文档

Libvirt 还可以选择使用 DNSMASQ 为虚拟网络提供 DHCP 服务。在所有情况下,我们都需要允许对主机操作系统进行 DNS/DHCP 查询。由于我们无法预测主机防火墙设置是否已经允许这样做,因此我们在 INPUT 链的开头插入了 4 条规则

下一个规则取决于允许的连接类型,并进入主 FORWARD 链

这些规则由每个网络配置中的“转发模式”控制。您无法修改这些规则,因为它们不在配置文件或脚本中,而是在源代码中。这些 iptables 规则不要与您提到的网络过滤器 ( virsh nwfilter-list) 混淆,因为网络过滤器应用于虚拟机。有关更多详细信息,请参阅网络过滤器

2016 年添加了“开放”网络“转发模式”。当为网络指定时,libvirt 不会为该网络生成任何 iptables 规则。参见错误 846810

因此,请将您的网络(virsh net-edit)编辑为<forward mode='open'/>

open类似route,但不会添加防火墙规则来启用或阻止任何此类流量。请参阅网络 XML 格式更多细节。

答案3

您是否在 /etc/network/interfaces 中检查了“pre-up”指令,它可能看起来像:

pre-up iptables-restore < /etc/iptables.rules

Ubuntu/Debian 上的另一种可能性是脚本位于 /etc/network/if-pre-up.d/ 目录中,因此您应该列出该目录的内容:

# ls -al /etc/network/if-pre-up.d/

另一种可能性是 NetworkManager 加载了规则,您可以通过在以下目录中搜索防火墙/iptables 来检查:

/etc/NetworkManager/dispatcher.d/

另外,检查 /etc/init 和 /etc/init.d 中的所有脚本中的“iptables”和“iptables-restore”。

相关内容