我正在做一个论文研究项目,在弄清楚如何iptables
(在 KVM 主机上运行)阻止发往桥接KVM 客户机。我无法获取iptables
条目(粘贴在下面)来阻止往返于 VM 的流量。
实际上,我希望我的主机系统充当这些客户虚拟机的防火墙,目前,我想通过简单地丢弃发往特定虚拟机的所有数据包来测试此功能。在不久的将来,我还想实现更精细的控制,甚至使用代理。同样,这应该完全在主机级别发生,并且不是在宾客 (GUEST) 层面。
我正在运行 CentOS 6,并且根据我写的另一个问题:使用一个网卡为 Linux KVM 创建多个接口,我配置了以下接口:
eth0
br0
tap0
以下是每个接口的网络设置脚本:
eth0
的配置:
DEVICE="eth0"
BOOTPROTO="none"
NM_CONTROLLED="no"
ONBOOT=yes
TYPE="Ethernet"
UUID="<<UUID-HERE>>"
HWADDR=<<MAC-ADDR-HERE>>
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=yes
IPV6INIT=no
NAME="System eth0"
BRIDGE="br0"
br0
的配置:
DEVICE="br0"
TYPE="Bridge"
ONBOOT="yes"
BOOTPROTO="dhcp"
DELAY=0
tap0
的配置:
DEVICE="tap0"
TYPE="Tap"
BRIDGE="br0"
ONBOOT="yes"
我正在运行 CentOS 6 VM,并将其配置为使用tap0
桥接接口。VM 上的网络运行正常。未对主机系统进行任何其他更改。
iptables
以下是我添加到链中的不起作用的规则FORWARD
(值得注意的是,我还不是一个iptables
专家)。
sudo iptables -I FORWARD -i any -o tap0 -j DROP
sudo iptables -I FORWARD -i tap0 -o any -j DROP
运行命令后,FORWARD
表格如下所示:
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 DROP all -- tap0 any anywhere anywhere
0 0 DROP all -- any tap0 anywhere anywhere
0 0 REJECT all -- any any anywhere anywhere reject-with icmp-host-prohibited
不幸的是,这并不能阻止流量。我不明白为什么这不起作用。
更新:2014年11月25日:距离我上次更新已经有一段时间了。事实证明,iptables
有physdev
插件,这实际上是我在研究中成功使用的,并且比更灵活ebtables
。
答案1
确保您了解此处涉及的网络基础知识。网桥是一种交换机,在第 2 层运行。您的iptables
规则适用于第 3 层,不会在此级别传递。
查看ebtables
并指定第 2 层规则 - 或者 - 完全禁用网桥的使用并转到路由设置,其中所有流量都通过第 3 层的主机。不确定后一种选项是否可以使用 Libvirt/KVM。
答案2
如果你这样做:
echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables
它将在网桥上启用 netfilter,然后您可以在 FORWARD 链上设置 iptables 规则来影响通过网桥接口往返于虚拟机的数据包。
为了使其在重启时永久生效:
编辑/etc/sysctl.conf
并设置net.bridge.bridge-nf-call-iptables = 1
https://wiki.libvirt.org/page/Net.bridge.bridge-nf-call_and_sysctl.conf
尽管 wiki 上说这样做不可取,但我已经这样做了很多年。它允许我在 FORWARD 链上设置黑名单和其他 iptables/ipset 规则,这些规则对所有虚拟机都有效。它在中等负载的服务器上运行良好。