Назад | Перейти на главную страницу

netperf + iptables masquerade -> сеть недоступна

Почему правила 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 как опция для конкретного теста.