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

Почему IP-маскарад (исходный NAT) в ядре Linux не позволяет установить исходный IP-адрес на высокую скорость передачи пакетов

Я пытаюсь проверить пропускную способность стандартного Linux NAT. Я установил следующую виртуальную сеть:

[192.168.42.5] <--> [192.168.42.2:192.168.35.2] <--> [192.168.35.10]

Средний хост имеет 2 интерфейса, работает под управлением ubuntu 14.04 и настроен как NAT:

sysctl -w net.ipv4.ip_forward=1
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf

iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
iptables -A FORWARD -i eth2 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i eth2 -o eht1 -j ACCEPT

В [192.168.42.5] host также имеет правило маршрута для второй сети:

sudo ip route add 192.168.35.0/24 via 192.168.42.2 dev eth1

Тогда я бегу hping3 на [192.168.42.5] хост:

sudo hping3 192.168.35.10  -k -s 3453 -S -n -p 80 -i u1000

А еще я смотрю общение на [192.168.35.10] с участием tcpdump:

sudo tcpdump -i eth1

Система нормально работает на скоростях ~ 1к Пкт / сек. tcpdump отображает поступающие пакеты:

IP 192.168.42.5.3453 > 192.168.35.10.http: Flags [S], seq 1520954148, win 512, length 0

Но когда я увеличиваю скорость пакетов (с -i u700 key), по какой-то причине NAT не может переписать адрес источника, и цель получает такие пакеты:

IP 192.168.42.5.3453 > 192.168.35.10.http: Flags [S], seq 1554999038, win 512, length 0

и игнорирует их, не имея доступного маршрута к 192.168.42.0/24 подсеть, поэтому hping3 не получил никакого ответа. Если это произошло, мне нужно расслабиться и подождать 1-2 минуты, пока я не смогу восстановить нормальную работу NAT даже при низкой скорости передачи пакетов.

Почему NAT так странно дает сбой? Если ему не хватает емкости, почему он все еще пересылает неизмененные пакеты?

P.S. Когда я вместо NAT настраивал обычный роутер (с соответствующим правилом в [192.168.35.10] host), он обычно обрабатывает даже скорость 10k Pkt / s.

Проблема может заключаться в -k флаг. Насколько я понимаю, вы настроили очень необычную настройку, создавая большие объемы соединений с одним и тем же источником / назначением. IPtables - это межсетевой экран с отслеживанием состояния, который отслеживает каждое соединение индивидуально. Я бы предположил, что вы в конечном итоге создаете большое количество коллизий в хеш-таблице. Обычно это замедляет доступ, что может быть именно тем, что вы видите.

Маршрутизатор может работать как без сохранения состояния, так и с полу-сохранением состояния. Это снижает накладные расходы.