我正在尝试在运行一些 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”。