%20%D0%BC%D0%B5%D1%88%D0%B0%D0%B5%D1%82%20%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B5%20%D0%BC%D0%BE%D0%B5%D0%B3%D0%BE%20%D0%BC%D0%BE%D1%81%D1%82%D0%B0%20(brctl)%3F.png)
Я настроил мост br0
, «присоединенный» к двум интерфейсам:
eth0
, мой физический интерфейс подключен к реальной локальной сети,vnet0
, виртуальный интерфейс KVM (подключенный к виртуальной машине Windows).
И у меня есть это единственное правило брандмауэра в прямой цепочке:
iptables -A FORWARD -j REJECT
Теперь единственный работающий пинг — от виртуальной машины к хосту.
Интерфейс br0
владеет IP-адресом моей хост-машины. eth0
и vnet0
не "владеет" никаким IP с точки зрения хоста. У Windows VM есть статическая конфигурация IP.
Если изменить iptables
правило на ACCEPT
(или даже использовать более ограничительное iptables -A FORWARD -o br0 -j ACCEPT
), все будет работать нормально! (т.е. я смогу пинговать любую машину локальной сети с виртуальной машины, и наоборот тоже).
Все параметры ядра IP-пересылки отключены (например net.ipv4.ip_forward = 0
, ).
Итак, как брандмауэр Netfilter может блокировать то, что даже не включено?
Более того, трафик VM - LAN должен подразумевать только eth0
и vnet0
. Тем не менее, похоже, что разрешение ПРЯМОГО трафика с -o br0
"работает" (хотя я не очень внимательно проверял).
решение1
TheкомментарийСтефан Шазеля дает подсказку к ответу.
В соответствии сЧасто задаваемые вопросы о Bridge-nfbridge-nf позволяет iptables, ip6tables или arptables видеть трафик, проходящий через мост.
Начиная с версии ядра 2.6.1, их пятьзаписи sysctlдля поведенческого контроля моста-nf:
bridge-nf-call-arptables
- передавать трафик ARP по мосту в цепочку FORWARD arptables.bridge-nf-call-iptables
- передавать трафик IPv4 по мосту в цепочки iptables.bridge-nf-call-ip6tables
- передавать трафик IPv6 по мосту в цепочки ip6tables.bridge-nf-filter-vlan-tagged
- передавать трафик ARP/IP с тегами VLAN через мост в arptables/iptables.net.bridge.bridge-nf-filter-pppoe-tagged
- передавать трафик IP/IPv6 с тегом PPPoE в таблицы {ip,ip6}
Вы можете отключить блокировку брандмауэра Netfilter с помощью:
# sysctl -w net.bridge.bridge-nf-call-iptables=0
# sysctl -w net.bridge.bridge-nf-call-ip6tables=0