Вопрос или проблема
Я пытаюсь понять модуль iptables physdev и у меня возникают проблемы с таблицей nat, особенно с цепочкой POSTROUTING. Моя цель — SNAT исходящего трафика на мостовом интерфейсе, используя модуль physdev.
Вот моя мини-сетевая настройка: PC1 – (enp6s0f0)BRIDGE(enp6s0f1) – PC2. PC1 имеет адрес 192.168.100.1/24, а PC2 — 192.168.100.2/24.
Вот как настроен мой мост:
ifconfig enp6s0f0 down
ifconfig enp6s0f1 down
brctl addbr br0
brctl addif enp6s0f0 br0
brctl addif enp6s0f1 br0
ifconfig enp6s0f0 0.0.0.0 up
ifconfig enp6s0f1 0.0.0.0 up
ifconfig br0 169.254.100.1/32 up
Эта настройка моста работает хорошо, и PC1 и PC2 могут общаться друг с другом, но не с мостом, как и ожидалось.
Теперь, например, я хочу настроить связь между ПК и Мостом так, чтобы PC1 видел Мост как 192.168.100.100, а PC2 — как 192.168.100.200.
Поэтому я добавляю маршрут:
route add -net 192.168.100.0/24 dev br0
Теперь, если я пингу с Моста любой из ПК, я вижу исходящий трафик с моста с исходным IP 169.254.100.1, как и ожидалось.
Теперь всё о iptables. Мои правила:
iptables -t nat -A POSTROUTING -s 169.254.100.1 -m physdev --physdev-out enp6s0f0 -j SNAT --to-source 192.168.100.100
iptables -t nat -A POSTROUTING -s 169.254.100.1 -m physdev --physdev-out enp6s0f1 -j SNAT --to-source 192.168.100.200
После этого я ожидаю, что весь исходящий трафик с моста будет SNATed на 192.168.100.100 или 192.168.100.200 в зависимости от physdev-out, НО этого не происходит. Почему? Я не знаю.
Что происходит, так это то, что правила игнорируются. iptables -t nat -vnL показывает 0 пакетов, соответствующих правилу, и tcpdump -i enp6s0f0 -p arp -n показывает, что все arp-запросы имеют старый адрес источника 169.254.100.1.
Также важно отметить, что у меня загружен модуль br-netfilter и bridge-nf-call-iptables установлен в 1.
Операционная система, которую я использую, — Ubuntu 20.04, но я пробовал и другие.
Я также искал информацию в Интернете и знаю, что есть несколько других способов достичь желаемого поведения, но я хочу понять, почему этот конкретный метод не работает.
Я также посмотрел на https://ebtables.netfilter.org/br_fw_ia/br_fw_ia.html, и после прочтения у меня сложилось ощущение, что всё должно работать. Пожалуйста, помогите мне
Ответ или решение
Ваш вопрос относится к проблеме работы модуля physdev
в таблице NAT iptables при настройке сетевого мостика. Давайте разберемся, что может быть не так и почему ваши правила SNAT не срабатывают.
1. Понимание работы NAT с мостами
Когда вы работаете с мостами, важно учитывать, что NAT работает на уровне сетевых интерфейсов. Если iptables
правильно настроен, он должен обрабатывать пакеты, которые проходят через мост. При этом, для того чтобы правила NAT сработали, сетевой стек должен отметить пакеты и сопоставить их с правилами в iptables.
2. Настройка iptables и модуля br-netfilter
Учитывая, что вы уже загрузили модуль br-netfilter
и установили параметр bridge-nf-call-iptables
в значение 1, ваши настройки должны позволять iptables обрабатывать трафик, проходящий через сетевой мост. Убедитесь, что вы также проверили следующие параметры:
sysctl net.bridge.bridge-nf-call-ipTables
sysctl net.bridge.bridge-nf-call-iptables
sysctl net.bridge.bridge-nf-call-arptables
Эти параметры должны быть установлены в 1.
3. Проверка правил iptables
Убедитесь, что ваши правила действительно добавлены в таблицу NAT. Ваша команда для просмотра правил правильная. Для более полной диагностики можете использовать:
iptables -t nat -vnL POSTROUTING
4. Настройка маршрутов
Важно отметить, что маршруты для адресов 192.168.100.0/24 должны быть настроены на PCs. Если маршруты не настроены правильно на PC1 и PC2, они смогут не получать пакеты с изменённым адресом источника.
5. Проблемы с физическим интерфейсом
Проверьте, правильно ли указан физический интерфейс в ваших правилах. Убедитесь, что у вас нет ошибок в именах интерфейсов:
ip link show
Проверьте, что enp6s0f0
и enp6s0f1
активны и находятся в состоянии UP.
6. Использование tcpdump
Используйте tcpdump
для отслеживания трафика:
tcpdump -i br0 -n
Это поможет вам увидеть, какой трафик действительно проходит через мост, и если он вообще достигает ваших правил NAT.
7. Проверка на наличие конфликтов
Убедитесь, что нет конфликтующих правил в других таблицах iptables. Напр., иногда правила в таблице filter
могут блокировать трафик, прежде чем он достигнет NAT.
Заключение
После выполнения всех этих шагов, если проблема продолжает оставаться, попробуйте запустить iptables
в более "грубом" режиме, убрав все существующие правила и добавив их заново. Также можно рассмотреть использование простых правил в таблице filter
, чтобы убедиться, что пакеты проходят перед применением NAT.
Если всё равно не работает, возможно, стоит протестировать на другой версии ядра Linux или другом дистрибутиве, чтобы исключить специфику вашей текущей системы.
Надеюсь, эти шаги помогут вам понять и решить вашу проблему с iptables
и physdev
.