端口转发问题(我认为)

端口转发问题(我认为)

我制作了一个非常基本的 KryoNet 服务器和客户端程序。如果我通过 localhost 连接客户端,它会按预期工作。现在我想从外部连接到它,所以我用 noip.com 的动态 DNS 工具为自己设置了一个 DNS。当我通过 DNS 连接时,KryoNet 显示了正确的 IP,但无法连接。

服务器:

public class ServerTester {

    public static void main(String[] args) throws IOException {
        // TODO Auto-generated method stub
        Server server = new Server();
        server.start();
        server.bind(TCP, UDP);

        server.getKryo().register(Packet.class);
        server.getKryo().register(TestPackage.class);

        server.addListener(new Listener() {
            public void received (Connection connection, Object object)
            {
                if (object instanceof Packet)
                {
                    if (object instanceof TestPacket)
                    {
                        TestPacket p1 = (TestPacket) object;
                        System.out.println("server received: " + p1.name);
                    }
                }
            }
        });
    }
}

客户:

public class ClientTester {

    public static void main(String[] args) {
        Client client = new Client();
        client.start();
        try {
            client.connect(5000, "my.dynamic.dns", TCP, UDP);
        } catch (IOException e) {
            JOptionPane.showMessageDialog(null, "Could not connect to server");
        }

        client.getKryo().register(Packet.class);
        client.getKryo().register(TestPacket.class);

        TestPacketp1 = new TestPacket();
        p1.name = "Menno Gouw";     
        client.sendTCP(p1);
    }
}

我在路由器上转发了用于 TCP 和 UDP 的端口。不确定显示端口是否存在安全风险,所以我只是为这个问题编造了一些。我转发了从 ipconfig 获得的 IPv4 地址和我的真实互联网地址的端口。

TCP = 8001
UDP = 8002

Public-Port-Range |  Target IP   | Target Port Range | Protocol
    8001-8002     | IPv4 Address |    8001-8002      |   Both
    8001-8002     | real Address |    8001-8002      |   Both

那么为什么客户端无法连接?是我的端口转发问题还是我的 ISP 以某种方式阻止了此问题?

就像我说的,如果我使用 localhost (127.0.0.1) 让客户端连接到服务器,一切都会按预期进行。当我尝试使用动态 DNS 连接时,我在控制台中收到一条 KryoNet 消息,表示它正在连接到我的“真实”IP 地址:

00:00  INFO: Connecting: my.dynamic.dns/XXX.XXX.XXX.XXX:8001/8002

但 5000 毫秒超时后连接失败。

答案1

如果您尝试从同一网络内进行连接,则无法正常工作。您无法访问自己的外部 IP。

您可以使用端口转发测试器网站(周围有很多)来检查端口是否打开并接受流量,但对于真正的测试,您需要尝试从另一个互联网连接进行连接。

答案2

正如 @Deadly-Bagel 指出的那样,您的调制解调器/路由器可能不允许 NAT 环回,即您的 LAN 客户端无法通过您自己的公共 IP 访问服务(例如 Web 服务器)。

资源:https://en.wikipedia.org/wiki/Network_address_translation#NAT_loopback

可能发生的情况是

  1. 您的 Kryo 客户端正在连接到您的 DDNS 服务器(通过其 URL)
  2. DDNS 服务(例如 DynDNS)会告诉您的 Kryo 客户端域的 IP 是什么(即您自己的公共 IP)。
  3. 然后,您的 Kryo 客户端尝试连接到您自己的公共 IP,但会失败,因为您的调制解调器/路由器无法将请求环回(然后转发)到您的 Kryo 服务器。

对此有几种可能的解决方案:

  1. 将调制解调器/路由器更改为具有 NAT 环回功能的调制解调器/路由器
  2. 编辑您正在使用的计算机的hosts文件以指向您的 DDNS URL,从而127.0.0.1产生与您的 DDNS 服务对话的效果。
  3. 如果您的 Kryo 服务器与 Kryo 客户端位于不同的计算机上,那么您可以将 Kryo 客户端 PC 绑定到您的手机等设备上,并使用您的 3G 连接来测试您的客户端与服务器的连接。

另外,您不应该进行端口转发并将您的公共 IP 设置为 LAN IP - 这样做不行。端口转发的整个目的是将 WAN 端请求定向到 LAN 端设备。

相关内容