Невозможно отправить обратно UDP на внутренний ПК за NAT

Я настраиваю два компьютера, один - клиент в локальной сети за NAT, другой - сервер в общедоступной сети.

Шаги теста: 1) клиент прослушивает udp на порту 33333 2) сервер прослушивает udp на порту 22222 1) клиент отправляет UDP на сервер 2) сервер получил данные и отправил обратно

Когда я тестирую код в своей тестовой сети, все в порядке.

Если поместить сервер в реальный Интернет, сервер может получить сообщение от клиента, клиент не может получить ответ от сервера. Что случилось?

Вот тестовый код с помощью nodejs.

сервер var dgram = require ('dgram');

var socket = dgram.createSocket('udp4');
socket.on('message', function (message, remote) {
        console.log('client ip:' + remote.address + ', port:' + remote.port +', message:' + message);
        //send response to client
        var message = new Buffer("hello, client!");
        socket.send(message, 0, message.length, remote.port, remote.address);
});

//listening port
socket.bind(22222);

клиент var dgram = require ('dgram');

var socket = dgram.createSocket('udp4');

socket.on('message', function (message, remote) {
        //display message from server
        console.log('server ip:' + remote.address + ', port:' + remote.port +', message:' + message);
});

//listening port
socket.bind(33333);

//send message to server
function send(server){
        var message = new Buffer("hello, server!");
        socket.send(message, 0, message.length, 22222, server, function(){
                //send again after 1 seconds
                setTimeout(function(){
                        send(server);
                }, 1000);
        });
};

//suppose that server address is public.server.com
send("public.server.com");

person user3616695    schedule 08.05.2014    source источник


Ответы (1)


К компьютерам с NAT нельзя получить доступ извне, и это особенно болезненно для программного обеспечения для одноранговых сетей или программ «друг другу». В основном потому, что у вашего ПК нет общедоступного IP-адреса, а у вашего устройства NAT есть. Итак, NAT виден, а ваш компьютер - нет.

Сервер получает пакет от устройства NAT и отправляет ему ответ. Да, NAT получает ответ и должен передать его на ваш компьютер, вот в чем фокус. Для этого вам необходимо настроить переадресацию портов в NAT.

В NAT есть следующая таблица:

+----------+---------------------+---------------+ 
| NAT PORT | INTERNAL IP ADDRESS | INTERNAL PORT | 
+----------+---------------------+---------------+
|   33333  | 198.162.0.3 (pc ip) |       33333   |

Это можно читать так: когда NAT получает пакет на свой порт 33333, он должен перенаправляться на внутренний IP 198.162.0.3 (IP-адрес вашего ПК) и порт 33333.

Если ваш компьютер использует фиксированный IP-адрес, вы можете выполнить это сопоставление вручную в своем NAT. Однако, если вы используете DHCP-сервер, IP-адрес вашего ПК может изменяться после каждой перезагрузки, поэтому вам необходимо выполнить это сопоставление программным обеспечением в вашем проекте. Большинство NAT поддерживают универсальный Plug & Play, протокол сопоставления портов или протокол управления портами для достижения этого сопоставления, и вы можете сделать это с помощью nodejs, учитывая, что все, что вам нужно, - это утвержденный HTTP-запрос к NAT.

Да, вы можете сделать это самостоятельно, но это не так-то просто. Фактически, процесс обнаружения требует, чтобы вы транслировали сообщения udp в локальной сети через определенный порт. Я настоятельно рекомендую вам использовать для этого сторонний компонент.

Я надеюсь, это поможет вам.

person lontivero    schedule 08.05.2014