%20%E6%9C%83%E5%B9%B9%E6%93%BE%E6%88%91%E7%9A%84%E7%B6%B2%E6%A9%8B%20(brctl)%EF%BC%9F.png)
我設定了一個br0
「連接」到兩個介面的橋:
eth0
,我的實體介面連接到真實的LAN,vnet0
,KVM虛擬介面(連接到Windows VM)。
我在前向鏈中有一個防火牆規則:
iptables -A FORWARD -j REJECT
現在,唯一有效的 ping 是從虛擬機器到主機。
該br0
介面擁有我的主機的 IP 位址。從主機的角度來看,eth0
並且不“擁有”任何IP。 vnet0
Windows VM 具有靜態 IP 配置。
如果將我的iptables
規則更改為ACCEPT
(或甚至使用更具限制性的iptables -A FORWARD -o br0 -j ACCEPT
),一切都會正常工作! (即我可以從虛擬機 ping 任何 LAN 計算機,反之亦然)。
所有 IP 轉送內核選項均停用(如net.ipv4.ip_forward = 0
)。
那麼,netfilter 防火牆如何阻止甚至未啟用的東西呢?
此外,VM-LAN 流量應僅表示eth0
和vnet0
。然而,它看起來像是允許-o br0
「有效」的轉送流量(雖然我沒有仔細檢查)。
答案1
這評論斯特凡·查澤拉斯 (Stéphane Chazelas) 提供了答案的提示。
根據Bridge-nf 常見問題解答bridge-nf 使 iptables、ip6tables 或 arptables 能夠查看橋接流量。
從核心版本 2.6.1 開始,有五個系統控制條目對於bridge-nf行為控制:
bridge-nf-call-arptables
- 將橋接 ARP 流量傳送到 arptables 的 FORWARD 鏈。bridge-nf-call-iptables
- 將橋接的 IPv4 流量傳遞到 iptables 的鏈。bridge-nf-call-ip6tables
- 將橋接的 IPv6 流量傳遞到 ip6tables 的鏈。bridge-nf-filter-vlan-tagged
- 將橋接 VLAN 標記的 ARP/IP 流量傳遞到 arptables/iptables。net.bridge.bridge-nf-filter-pppoe-tagged
- 將橋接的 pppoe 標記的 IP/IPv6 流量傳遞到 {ip,ip6} 表
您可以使用以下命令停用 netfilter 防火牆封鎖:
# sysctl -w net.bridge.bridge-nf-call-iptables=0
# sysctl -w net.bridge.bridge-nf-call-ip6tables=0