无法将备份发送到 NAT 后的内部 PC

Posted

技术标签:

【中文标题】无法将备份发送到 NAT 后的内部 PC【英文标题】:Can not send back UDP to internal PC behide NAT 【发布时间】:2014-06-25 23:33:51 【问题描述】:

我设置了两台电脑, 一个是本地网络中的客户端,位于 NAT 后面, 另一个是公共网络上的服务器。

测试步骤是—— 1) 客户端在 33333 端口监听 udp 2) 服务器在 22222 端口监听 udp 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");

【问题讨论】:

【参考方案1】:

无法从外部访问经过 NAT 的计算机,这对于点对点或朋友对朋友的软件来说尤其痛苦。基本上是因为您的 PC 没有公共 IP 地址,但您的 NAT 设备有。因此,NAT 是可见的,而您的 PC 不可见。

服务器从 NAT 设备获取包并将响应发送给它。是的,NAT 接收到响应,它必须将它中继到您的 PC,这就是诀窍。为此,您必须在 NAT 中配置端口转发。

NAT 有一个如下表:

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

可以理解为:当 NAT 在其端口#33333 接收到一个包时,它必须重定向到内部 IP 198.162.0.3(您的 PC IP 地址)和端口#33333。

如果您的 PC 使用固定 IP,您可以在 NAT 中手动进行此映射。但是,如果您使用 DHCP 服务器,您的 PC 的 IP 可能会在每次重新启动后更改,因此您需要通过项目中的软件进行此映射。大多数 NAT 都支持通用即插即用、端口映射协议或端口控制协议来实现这种映射,并且您可以使用 nodejs 来实现,因为您只需要向 NAT 发出适当的 HTTP 请求。

是的,你可以自己做,但这并不容易。实际上,发现过程需要您在 LAN 中的特定端口广播 udp 消息。我强烈建议您使用第三方组件。

我希望这对你有帮助。

【讨论】:

以上是关于无法将备份发送到 NAT 后的内部 PC的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 java 套接字将图像从 android studio 发送到 pc,filePath 返回 null

如何配置NAT?

两台计算机如何通过 NAT 连接到同一个外部地址?

网络技术:NAT 网络地址转换及原理

如何使用 TCP 或 UDP 将数据从 Windows Phone 8.1 发送到 PC?

使用 socket.socket 将数据连续发送到两个不同的 IP:NAT 保持相同端口是标准行为吗?