Я пытаюсь проверить пропускную способность стандартного 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 - это межсетевой экран с отслеживанием состояния, который отслеживает каждое соединение индивидуально. Я бы предположил, что вы в конечном итоге создаете большое количество коллизий в хеш-таблице. Обычно это замедляет доступ, что может быть именно тем, что вы видите.
Маршрутизатор может работать как без сохранения состояния, так и с полу-сохранением состояния. Это снижает накладные расходы.