【问题标题】:Webserver behind NAT, do I need to enable port forwarding for request port?NAT后面的网络服务器,我需要为请求端口启用端口转发吗?
【发布时间】:2014-04-08 10:19:05
【问题描述】:

这是一个微不足道的问题,但我真的找不到一个好的答案。

当我在 NAT 后面托管一个监听端口 80 的网络服务器时,很明显我需要在我的路由器中启用端口转发到网络服务器的端口 80。但是,80 只是服务器的接受端口,对于实际请求,它将使用不同的临时随机端口。

我的问题是,我是否还需要为这个正在用于请求的随机端口启用端口转发?如果没有,它是如何工作的,我的意思是它是如何神奇地通过 NAT 的呢?

让我引用一本书: “服务器(程序)在特定计算机上运行,​​并具有绑定到特定端口的套接字。 服务器侦听套接字以供客户端发出连接请求(请参阅 参考资料)。如果一切顺利 好吧,服务器接受连接。接受后,服务器获得一个新的套接字 绑定到不同的端口。它需要一个新的套接字(因此需要一个不同的端口号)以便它可以 在为已连接的客户端提供服务时,继续侦听原始套接字以获取连接请求。”

我只想知道这个“新连接”是否适用于互联网上的客户端,如果端口转发仅启用到路由器后面的服务器的侦听端口。

【问题讨论】:

    标签: sockets networking webserver router nat


    【解决方案1】:

    在 TCP 级别,服务器总是使用端口 80,这里没有随机端口。当然会有一个新的套接字,但这是因为一个套接字代表一个连接(serverIP,80,clientIP,clientPort)。

    网络网关将客户端(ip、tcp 端口)映射到网络内部的唯一地址/端口,并在表中对其进行跟踪。在最简单的情况下,转换后的地址将是网关的私有地址,并且端口可能相同。当服务器响应(从端口 80 到转换后的地址/端口)时,网关查找表,将数据包头中的地址转换回并通过 Internet 将转换后的数据包发送到客户端。

    这是我从here 复制的示例跟踪。您会看到位于 192.168.0.102 的服务器始终从端口 80 响应。浏览器似乎打开了两个端口 1046 和 1047。在此示例中,客户端和服务器都在同一个子网中,但假设 NAT 192.168.0.103 可能是网关地址和 1046、1047 可能是转换后的端口。如果浏览器前面还有网关,端口可以翻译两次。

    5   14:52:49.543851  192.168.0.103.1046 > 192.168.0.102.80: S 7861110:7861110(0) win 8192 <mss 1460> (DF)
    6   14:52:49.543851  192.168.0.102.80 > 192.168.0.103.1046: S 3595122238:3595122238(0) ack 7861111 win 32736 <mss 1460>
    7   14:52:49.543851  192.168.0.103.1046 > 192.168.0.102.80: . ack 3595122239 win 8760 (DF)
    8   14:52:49.653851  192.168.0.103.1046 > 192.168.0.102.80: P 7861111:7861361(250) ack 3595122239 win 8760 (DF)
    9   14:52:49.663851  192.168.0.102.80 > 192.168.0.103.1046: . 3595122239:3595123699(1460) ack 7861361 win 32736 (DF)
    10  14:52:49.663851  192.168.0.102.80 > 192.168.0.103.1046: P 3595123699:3595124724(1025) ack 7861361 win 32736 (DF)
    11  14:52:49.663851  192.168.0.103.1046 > 192.168.0.102.80: . ack 3595124724 win 8760 (DF)
    12  14:52:50.803851  192.168.0.103.1047 > 192.168.0.102.80: S 7862363:7862363(0) win 8192 <mss 1460> (DF)
    13  14:52:50.803851  192.168.0.102.80 > 192.168.0.103.1047: S 3701480536:3701480536(0) ack 7862364 win 32736 <mss 1460>
    14  14:52:50.803851  192.168.0.103.1047 > 192.168.0.102.80: . ack 3701480537 win 8760 (DF)
    15  14:52:50.873851  192.168.0.103.1048 > 192.168.0.102.80: S 7862437:7862437(0) win 8192 <mss 1460> (DF)
    16  14:52:50.873851  192.168.0.102.80 > 192.168.0.103.1048: S 2553725067:2553725067(0) ack 7862438 win 32736 <mss 1460>
    17  14:52:50.873851  192.168.0.103.1048 > 192.168.0.102.80: . ack 2553725068 win 8760 (DF)
    18  14:52:50.973851  192.168.0.103.1048 > 192.168.0.102.80: P 7862438:7862753(315) ack 2553725068 win 8760 (DF)
    19  14:52:50.993851  192.168.0.102.80 > 192.168.0.103.1048: . ack 7862753 win 32736 (DF)
    20  14:52:50.993851  192.168.0.102.80 > 192.168.0.103.1048: . 2553725068:2553726528(1460) ack 7862753 win 32736 (DF)
    21  14:52:50.993851  192.168.0.102.80 > 192.168.0.103.1048: P 2553726528:2553726886(358) ack 7862753 win 32736 (DF)
    22  14:52:50.993851  192.168.0.103.1048 > 192.168.0.102.80: . ack 2553726886 win 8760 (DF)
    23  14:52:51.023851  192.168.0.103.1047 > 192.168.0.102.80: P 7862364:7862677(313) ack 3701480537 win 8760 (DF)
    24  14:52:51.023851  192.168.0.102.80 > 192.168.0.103.1047: . 3701480537:3701481997(1460) ack 7862677 win 32736 (DF)
    25  14:52:51.023851  192.168.0.102.80 > 192.168.0.103.1047: . 3701481997:3701483457(1460) ack 7862677 win 32736 (DF)
    26  14:52:51.033851  192.168.0.103.1047 > 192.168.0.102.80: . ack 3701483457 win 8760 (DF)
    27  14:52:51.033851  192.168.0.102.80 > 192.168.0.103.1047: P 3701483457:3701484633(1176) ack 7862677 win 32736 (DF)
    

    搜索 NAT 和 PAT,有很多很好的资源可以更详细地了解其工作原理。

    【讨论】:

    • 请看我的编辑,我不认为我问的问题是正确的。
    • 写信给作者(Buyya of "Obj. Oriented Programming with Java",对吗?)他错了,当然需要一个新的套接字但不需要一个新的端口,绝对不是一个新的 TCP港口。在我看来,作者试图“解释”docs.oracle.com/javase/tutorial/networking/sockets/…,这是小心不要让端口不准确。看书里的图和我提供的链接就明白我的意思了,没有新的TCP端口!!!
    • 我仍然不明白的是,如果没有新端口,那么 ONE 客户端与服务器的所有通信都会阻塞监听端口,因此其他客户端无法连接。还是真的如您发送给我的链接中所述,一个端口可用于多个套接字连接?一直学习一个端口=套接字,否则资源很忙。我可以在一个端口上打开多个套接字是 Java 特有的,还是通常设计为在网络中如此?你能指出我澄清这一点的资源吗?
    • 一个端口不是一个套接字。正如我在回答中所写的,一个 TCP 套接字“是”一个(serverIP、serverPort、clientIP、clientPort)。因此服务器端口可以相同(即 80),并且在您的代码中仍然有多个套接字,因为它们引用不同的客户端 IP/端口。
    猜你喜欢
    • 2012-02-23
    • 1970-01-01
    • 2013-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多