Как имитировать поведение разных NAT

Я работаю над Holepunching с использованием UDP и UDT. Для окончательного тестирования мне нужно протестировать приложение на разных типах NAT (симметричный, полный конус, ограниченный конус, NAT с ограниченным доступом).

Есть ли какой-нибудь метод, который я смогу имитировать? То, что я ожидаю здесь, - это какая-то виртуальная установка. Могу ли я использовать ПК в качестве маршрутизатора, чтобы настроить его в соответствии с моими потребностями?

В целом, как мы тестируем приложения для разных сетевых условий?

Ответ 1

Я думаю, что вы уже ответили на свой вопрос, используйте VirtualBox (или VMware, Xen и т.д.).

Я сделал это очень успешно, установив мини-виртуальные машины. Если вы ищете программное обеспечение для работы в качестве маршрутизатора внутри виртуальной машины, я бы начал с http://www.pfsense.org/ и посмотрел, соответствует ли это вашей необходимо. Это дистрибутив FreeBSD, специально разработанный для простой установки маршрутизатора/брандмауэра с приятным интерфейсом управления веб-интерфейсом и всем этим.

Если pfsense не соответствует вашим потребностям, существует множество других дистрибутивов linux/bsd, которые предназначены для такого рода материалов и которые вы можете установить в VM: http://en.wikipedia.org/wiki/List_of_router_or_firewall_distributions для хорошего списка:) (я тоже хорошо слышал об OpenWRT и ClearOS.)

Ответ 2

На тот случай, если кто-то еще захочет это сделать, этот веб-сайт объясняет, как настроить различные среды NAT с использованием IPTables.

Обновить

Прошло несколько лет с тех пор, как я это сделал, учитывая, что ссылка была размещена за логином, а перемотка была также размещена за логином, я просмотрел свои заметки со спины и обнаружил следующее. Обратите внимание, что они не проверены.

Полный конус NAT;

iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to-source "public IP"
iptables -t nat -A PREROUTING -i eth1 -j DNAT --to-destination "private IP"

NAT с ограниченным конусом;

iptables -t nat POSTROUTING -o eth1 -p udp -j SNAT --to-source "public IP"
iptables -t nat PREROUTING -i eth1 -p udp -j DNAT --to-destination "private IP"
iptables -A INPUT -i eth1 -p udp -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i eth1 -p udp -m state --state NEW -j DROP

NAT с ограниченным портом NAT;

iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source "public IP"

Симметричный NAT;

echo "1" >/proc/sys/net/ipv4/ip_forward
iptables --flush
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE --random
iptables -A FORWARD -i eth1 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT