Port forwarding error: Port forwarding is not forwarding to server
Port forwarding error: Port forwarding is not forwarding to server
所以,我用c++做了一个客户端和一个服务器。我的服务器有一个端口设置为 htons(54000)。我的客户也有端口 htons(54000)。
我的问题是,当我尝试将我的客户端连接到我的机器(我的服务器所在的机器 ip 是:例如 80.60.117.24)时,什么也没有发生!
我发现我需要使用端口转发。我的路由器是华为 B525 - 23。我尝试从 WAN 端口 54000 端口转发到 LAN 端口 54000 和我机器的本地 ip:192.168.8.50。
嗯,不行。
虽然服务器和客户端在同一个局域网上,但它可以工作。 (我将服务器在客户端上的 ip 地址设置为 192.168.8.50(我的机器,服务器托管在这里))。
//SERVER.cpp
sockaddr_in hint;
hint.sin_family = AF_INET;
hint.sin_port = htons(54000);
hint.sin_addr.s_addr = inet_addr("0.0.0.0");
bind(listening, (sockaddr*)& hint, sizeof(hint));
listen(listening, SOMAXCONN);
//CLIENT.cpp
string ipAddress = "80.60.117.24"; // IP Address of the server
int port = 54000;
sockaddr_in hint;
hint.sin_family = AF_INET;
hint.sin_port = htons(port);
所以,我做错了什么?我如何错误地转发端口?
让我看看我是否理解这个场景。您连接到服务器的客户端是否使用与服务器相同的互联网连接?
您将 IP 设置为允许流量正常工作的同一子网让我觉得就是这种情况。
如果是这种情况,那么它可能无法正常工作,因为流量会向外路由到您的路由器。路由器会查看它并说它在外部 NAT 上有该流量。它会将流量路由到 NAT,NAT 又会应用您的端口转发规则。
挑战在于,当服务器响应时,它将响应 NAT 地址而不是 LAN 地址。当该流量到达路由器时,端口转发将再次获取流量并将其发送到服务器。这样客户端就可以访问服务器,但服务器最终只能与自己对话。
我会尝试从不同的位置连接(如在不同的互联网连接中)。如果可行,那么您就知道发生了这个循环。
话虽这么说,正如@RemyLebeau 指出的那样,通常你的服务器上不会有 public IP,除非你有一系列 public IP 并且你的路由器的 public IP 不同于你的服务器的。如果服务器有单独的 public IP,请确保路由器的 WAN 端口和服务器在同一个 VLAN 上。因此,您必须将交换机上的流量引入没有 VIP 设置的隔离 VLAN。但是,让您的服务器完全暴露在外是非常冒险的。
如果您将服务器设置为与路由器相同的 IP,那么您将遇到完全不同的问题。
您会希望服务器的 IP 位于本地 LAN 上,并且 PAT 设置为将流量转发到该本地 IP。所以如果你的机器有 192.168.8.50,那么你的服务器可能有 192.168.8.40。静态的东西,不在 DHCP 范围内,并且在子网内(我假设一个 /24 网络 - 255.255.255.0)。
希望这对您有所帮助。
如果我错过了标记或者您的设置与这些情况中的任何一个不同,那么请提供有关您的网络配置拓扑的更多详细信息。
好吧,我明白了。我所做的只是将服务器托管在不同的网络上(我家里有 2 个连接)。端口转发设置正确。谢谢你们的帮助,对我的刻薄描述深表歉意。 :)
所以,我用c++做了一个客户端和一个服务器。我的服务器有一个端口设置为 htons(54000)。我的客户也有端口 htons(54000)。
我的问题是,当我尝试将我的客户端连接到我的机器(我的服务器所在的机器 ip 是:例如 80.60.117.24)时,什么也没有发生!
我发现我需要使用端口转发。我的路由器是华为 B525 - 23。我尝试从 WAN 端口 54000 端口转发到 LAN 端口 54000 和我机器的本地 ip:192.168.8.50。
嗯,不行。
虽然服务器和客户端在同一个局域网上,但它可以工作。 (我将服务器在客户端上的 ip 地址设置为 192.168.8.50(我的机器,服务器托管在这里))。
//SERVER.cpp
sockaddr_in hint;
hint.sin_family = AF_INET;
hint.sin_port = htons(54000);
hint.sin_addr.s_addr = inet_addr("0.0.0.0");
bind(listening, (sockaddr*)& hint, sizeof(hint));
listen(listening, SOMAXCONN);
//CLIENT.cpp
string ipAddress = "80.60.117.24"; // IP Address of the server
int port = 54000;
sockaddr_in hint;
hint.sin_family = AF_INET;
hint.sin_port = htons(port);
所以,我做错了什么?我如何错误地转发端口?
让我看看我是否理解这个场景。您连接到服务器的客户端是否使用与服务器相同的互联网连接? 您将 IP 设置为允许流量正常工作的同一子网让我觉得就是这种情况。 如果是这种情况,那么它可能无法正常工作,因为流量会向外路由到您的路由器。路由器会查看它并说它在外部 NAT 上有该流量。它会将流量路由到 NAT,NAT 又会应用您的端口转发规则。 挑战在于,当服务器响应时,它将响应 NAT 地址而不是 LAN 地址。当该流量到达路由器时,端口转发将再次获取流量并将其发送到服务器。这样客户端就可以访问服务器,但服务器最终只能与自己对话。 我会尝试从不同的位置连接(如在不同的互联网连接中)。如果可行,那么您就知道发生了这个循环。 话虽这么说,正如@RemyLebeau 指出的那样,通常你的服务器上不会有 public IP,除非你有一系列 public IP 并且你的路由器的 public IP 不同于你的服务器的。如果服务器有单独的 public IP,请确保路由器的 WAN 端口和服务器在同一个 VLAN 上。因此,您必须将交换机上的流量引入没有 VIP 设置的隔离 VLAN。但是,让您的服务器完全暴露在外是非常冒险的。 如果您将服务器设置为与路由器相同的 IP,那么您将遇到完全不同的问题。 您会希望服务器的 IP 位于本地 LAN 上,并且 PAT 设置为将流量转发到该本地 IP。所以如果你的机器有 192.168.8.50,那么你的服务器可能有 192.168.8.40。静态的东西,不在 DHCP 范围内,并且在子网内(我假设一个 /24 网络 - 255.255.255.0)。 希望这对您有所帮助。 如果我错过了标记或者您的设置与这些情况中的任何一个不同,那么请提供有关您的网络配置拓扑的更多详细信息。
好吧,我明白了。我所做的只是将服务器托管在不同的网络上(我家里有 2 个连接)。端口转发设置正确。谢谢你们的帮助,对我的刻薄描述深表歉意。 :)