Я установил мост Ethernet br0
который содержит два интерфейса eth0
и tap0
brctl addbr br0
brctl addif eth0
brctl addif tap0
ifconfig eth0 0.0.0.0 promisc up
ifconfig tap0 0.0.0.0 promisc up
ifconfig br0 10.0.1.1 netmask 255.255.255.0 broadcast 10.0.1.255
Мой по умолчанию FORWARD
политика сети DROP
iptables -P FORWARD DROP
Когда я не добавляю следующее правило, трафик не проходит через мост.
iptables -A FORWARD -p all -i br0 -j ACCEPT
Насколько я понимаю iptables
отвечает только за уровень IP.
ebtables
должен отвечать за фильтрацию трафика на мосту Ethernet.
Итак, почему мне нужно добавить правило ACCEPT в цепочку FORWARD iptable?
Из-за кода br-nf, который доступен как патч для Linux 2.4 и используется в Linux 2.6:
Код br-nf заставляет IP-фреймы / пакеты проходить через цепочки iptables. Ebtables фильтрует на уровне Ethernet, а iptables фильтрует только IP-пакеты.
Поскольку трафик, с которым вы работаете, - это ip, iptables
правила все еще применяются из-за бр-нф передача мостовых пакетов в iptables
.
это отличный ресурс, чтобы прочитать о взаимодействии и вот этот подробно описывает функциональность бр-нф код, в том числе, как отключить все или некоторые функции (т.е. не передавать трафик моста в iptables).
Вы можете отключить это поведение (разрешив iptables обрабатывать мостовые пакеты), набрав:
echo "0" > /proc/sys/net/bridge/bridge-nf-call-iptables
(видеть http://ebtables.sourceforge.net/documentation/bridge-nf.html)
Если у вас нет необходимости использовать iptables с мостом в вашей системе, вы можете навсегда отключить его, используя одно из следующих действий:
iptables -I FORWARD -m physdev --physdev-is-bridged -j ACCEPT
net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0
net.bridge.bridge-nf-call-arptables = 0
Цепочки ebtables не будут видеть фреймы, поступающие через порт моста без пересылки. Можете взглянуть на это: http://ebtables.sourceforge.net/br_fw_ia/br_fw_ia.html