Принудительная петля UDP через провод

Я пытаюсь настроить небольшую петлевую программу на Python для отправки пакетов UDP с одного интерфейса на другой. Без изменения iptables ядро ​​будет просто закорачивать любую связь и отправлять ее напрямую на определенный интерфейс, даже не переходя по проводам. Используя следующее, я смог заставить pings путешествовать по проводам (из этого поста), но я не уверен, как заставить UDP делать то же самое.

ifconfig eth2 10.50.0.1/24
ifconfig eth3 10.50.1.1/24

# nat source IP 10.50.0.1 -> 10.60.0.1 when going to 10.60.1.1
iptables -t nat -A POSTROUTING -s 10.50.0.1 -d 10.60.1.1 -j SNAT --to-source 10.60.0.1

# nat inbound 10.60.0.1 -> 10.50.0.1
iptables -t nat -A PREROUTING -d 10.60.0.1 -j DNAT --to-destination 10.50.0.1

# nat source IP 10.50.1.1 -> 10.60.1.1 when going to 10.60.0.1
iptables -t nat -A POSTROUTING -s 10.50.1.1 -d 10.60.0.1 -j SNAT --to-source 10.60.1.1

# nat inbound 10.60.1.1 -> 10.50.1.1
iptables -t nat -A PREROUTING -d 10.60.1.1 -j DNAT --to-destination 10.50.1.1

ip route add 10.60.1.1 dev eth2
arp -i eth2 -s 10.60.1.1 00:1B:21:C1:F6:0F # eth3's mac address

ip route add 10.60.0.1 dev eth3 
arp -i eth3 -s 10.60.0.1 00:1B:21:C1:F6:0E # eth2's mac address

ping 10.60.1.1

Я хотел бы, чтобы tp мог транслировать сообщение UDP на 10.50.0.1и читать это на 10.50.1.1

Как я могу сделать это?

1 ответ

Не полный ответ, потому что я в настоящее время на мобильном телефоне, но это также слишком долго для комментария:

По умолчанию все NIC управляются одним IP-стеком в ядре Linux, и поэтому ядро ​​"знает", что трафик с IP-адреса 10.50.0.1 на eth2 до 10.50.1.1 не нужно отправлять на маршрутизатор в 10.50.0.0/24, подсеть полностью пропустит эту маршрутизацию и отправит ее непосредственно в eth3.

Как правило, это разумная вещь, так как она практически не дает задержки и намного большей пропускной способности, чем фактическая скорость передачи данных eth2 и eth3 и маршрутизатора (ов) между ними.

Вы можете предотвратить это, установив конкретные инструкции по маршрутизации, которые, похоже, вы пытались использовать с iptables, но, возможно, лучшим решением будет использование сетевых пространств имен. При назначении каждой сетевой карты отдельному пространству имен ядро ​​Linux больше не будет обрабатывать трафик от eth2 до eth3 как локальный, и вместо того, чтобы просто отправлять пакеты только в памяти с 10.50.0.1 до 10.50.1.1, они будут подключаться к сети.

Другие вопросы по тегам