Почему правила iptables проходят тест netperf TCP_STREAM, но нарушают UDP_STREAM?
У меня есть сеть:
+---------------+
| |
[client]--[NAT]--[server]
В NAT я добавил следующие правила iptables:
$ iptables -t nat -L
:
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
MASQUERADE all -- anywhere anywhere
$ iptables -L
: Цепочка INPUT (policy ACCEPT) target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
ACCEPT all -- anywhere anywhere state NEW,RELATED,ESTABLISHED
ACCEPT all -- anywhere anywhere
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Хорошо работает, когда я бегу ping server
на клиенте, когда я запускаю netperf через TCP, и когда я запускаю netperf через UDP через прямое соединение. Но не работает, если я бегу:
$ netperf -H 192.168.2.10 -t UDP_STREAM -l 1
MIGRATED UDP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 192.168.2.10 () port 0 AF_INET : demo
send_data: data send error: errno 101
netperf: send_omni: send_data failed: Network is unreachable
Кажется, межсетевой экран iptables блокирует UDP-пакеты.
Так ли это, и как мне это не настроить?
Ответ здесь: https://stackoverflow.com/a/24211455/1234026
Вкратце: netperf по умолчанию отключает IP-маршрутизацию для теста UDP_STREAM, и если целевой адрес находится в другой подсети, ему не удается найти маршрут. Чтобы он работал нормально, мне нужно поставить -R 1
key как опция для конкретного теста.