Я пытаюсь реализовать пробивку отверстий NAT в python
У меня есть
Клиент: хост за NAT, может пинговать сервер
Сервер: хост за отдельный NAT
Клиент и сервер находятся в разных сетях и не могут общаться друг с другом. Клиент знает адрес сервера. Сервер не знает адрес клиента, но прослушивает сокет для пакетов ICMP в случае, если клиент обращается.
Я использую scapy.
Сервер отправляет эхо-запрос ICMP на адрес «3.3.3.3» вот так
send(IP(dst="3.3.3.3") / ICMP(), verbose=0, loop=1)
У меня есть клиент, который притворяется маршрутизатором на inte rnet отправке запроса на тайм-аут на сервер, поскольку у него открыт сеанс сервера для этого пункта назначения. Обратите внимание, что он включает исходный пакет от сервера
def _contact(broadcast_address, server_address):
reply = IP(dst=server_address) / ICMP(type=11, code=0)
original = IP(dst=broadcast_address, src=server_address) / ICMP(type=8, code=0)
send(reply / original, loop=1, verbose=0)
По определению того, как работает NAT, он должен пропускать пакет от клиента обратно на сервер. Но это не так. Что я делаю не так?