У меня Ubuntu с двумя сетевыми адаптерами. eth0 подключен к концентратору, а eth1 подключен к Интернету. eth1 используется для создания точка-точка VPN с использованием openVPN. Итак, у меня интерфейс tun0. конечные точки VPN-туннеля - 10.9.0.1 (привязаны к eth1) и 10.9.0.2 (удаленный узел). Я хочу пересылать / зеркалировать весь трафик, полученный на eth0 (сторона концентратора), на одноранговый узел VPN 10.9.0.2. Для этого я создал следующие правила iptables.
sudo iptables -t mangle -A PREROUTING -i eth0 -j TEE --gateway 10.9.0.2
И, конечно же, я установил eth0 в неразборчивый режим.
sudo ifconfig eth0 promisc
И я даже активировал переадресацию ip
sudo sh -c 'echo 1 > /proc/sys/net/ipv4/ip_forward'
Когда я обнюхиваю eth0 (сторона концентратора), я вижу весь трафик, но когда я обнюхиваю 10.9.0.2 (удаленный VPN-узел), я вижу только многоадресный трафик, полученный на eth0. Мой вопрос: почему не-многоадресный или выделенный одноадресный трафик не зеркалируется / не перенаправляется?
Примечание. Если я обнюхиваю tun0 на моем сервере Ubuntu, я вижу только многоадресный трафик и выделенный одноадресный трафик. Итак, я прихожу к выводу, что проблема не в правилах iptables, а до ...
Спасибо и наилучшими пожеланиями.
Я наконец нашел решение. Идея @MrMajestyk мне помогла. Вот мое решение.
Во-первых, необходимо использовать ebtables для изменения MAC-адреса получателя полученного пакета, чтобы код IP-стека получил пакет. Если я этого не сделаю на уровне Ethernet, сетевой уровень никогда не получит кадры, кроме многоадресной, широковещательной и выделенной одноадресной рассылки. И если сетевой уровень никогда не получает все пакеты, их невозможно обработать с помощью iptables. Но для того, чтобы это правило ebtables работало, необходимо создать мостовой интерфейс с входящим (на стороне концентратора) интерфейсом на нем.
sudo ifconfig eth0 10.9.0.5
sudo brctl addbr br0
sudo brctl addif br0 eth0
sudo ifconfig br0 up
Затем мы можем создать ebtables правила.
sudo ebtables -t broute -A BROUTING -i eth0 -j redirect --redirect-target DROP
Затем я могу использовать iptables для зеркалирования моего трафика, полученного к моему удаленному узлу VPN (10.9.0.2).
sudo iptables -t raw -A PREROUTING -i eth0 -j TEE --gateway 10.9.0.2
Обратите внимание, что я использую туннельный интерфейс (tun) вместо Ethernet-моста (tap). После этого я могу прослушивать удаленный узел 10.9.0.2 и видеть весь трафик (кроме, например, ARP).
Я даже могу фильтровать свой трафик, но это необходимо делать внутри необработанная таблица, цепочка предварительной маршрутизации перед -j TEE - правила шлюза. Посмотрите, например, мои записи iptables raw, prerouting.
-A PREROUTING -p vrrp -j DROP
-A PREROUTING -p ospf -j DROP
-A PREROUTING -d 255.255.255.255/32 -j DROP
-A PREROUTING -p udp --sport 53 -j DROP
-A PREROUTING -p tcp --sport 53 -j DROP
-A PREROUTING -i eth0 -j TEE --gateway 10.9.0.2
Спасибо за помощь
Я думаю, ваша проблема в том, что пересылка, которую вы выполняете, не работает, если MAC-адрес назначения фактически не находится на машине, которую вы используете в качестве маршрутизатора. Трансляции работают по дизайну. То, что вы ищете, вероятно, больше похоже на зеркалирование порта коммутатора. Есть нить, как это сделать Вот. Для потомков я перепишу здесь суть:
SWITCH
+---------------+
| |
SOURCE <------------>|<-----+------->|<------------> RCV
| | |
+---------------+
| Mirrored port ("tap")
| (output only)
|
| +------------+
+<---->| ROUTER |<-------------> MONITOR
eth0 +------------+
Вот как переписать входящие MAC-адреса, чтобы они соответствовали eth0. eth0 должен быть привязан к устройству моста, даже если у моста нет других устройств. Это позволяет ebtables подключиться к нему.
ifconfig eth0 X.X.X.X
brctl addbr br0
brctl addif br0 eth0
ip link set br0 up (or ifconfig br0 up)
ebtables -t broute -A BROUTING -i eth0 -j redirect --redirect-target DROP
ip route add y.y.y.y dev eth0 (have to do for all expected incoming addresses/subnets)
Опять же - вышеупомянутая цитата просто цитирует исходный пост, чтобы убедиться, что это можно будет отмахнуться и позже.
Я не думаю, что вам нужно устанавливать iptables, просто установите ip-адрес eth1 в качестве шлюза для eth0 и установите DNS в «базовом» файле, это сработает.