在 KVM 主機上配置 IPTables 以阻止訪客網橋流量
我正在做一個論文研究項目,我很難弄清楚如何
iptables
(在 KVM 主機上執行)阻止流向 BRIDGED KVM 來賓的流量(或者更確切地說,操縱流量)。我無法獲取iptables
條目(粘貼在下面)來阻止進出虛擬機的流量。實際上,我希望我的主機系統充當這些來賓 VM 的防火牆,目前,我想通過簡單地丟棄所有發往特定 VM 的數據包來測試此功能。在不遠的將來,我還想實現更精細的控制,甚至涉及代理。同樣,這應該完全發生在 HOST 級別,而不是GUEST 級別。
我正在執行 CentOS 6,並且基於我寫的另一個問題:使用一個 NIC 為 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
。
確保您了解此處涉及的網路基礎知識。網橋是交換機,在第 2 層執行。您的
iptables
規則適用於第 3 層,不會在此級別通過。在那裡查看
ebtables
並指定第 2 層規則 - 或者 - 完全禁用網橋的使用並轉移到所有流量都通過第 3 層主機傳遞的路由設置。不確定後一個選項是否可以使用 Libvirt/KVM。
如果你這樣做:
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 規則,這些規則全域適用於所有 VM。它在中等負載的伺服器上執行良好。