c# - 使用 c# "UDP punch hole into firewall"将流量从端口 X 转发到计算机 B

标签 c# networking tcp portforwarding

我需要建立一个从我家电脑到我办公室电脑的 tcp 连接。

办公室里有一个路由器,连接了几台电脑。该路由器有互联网,因此连接到该路由器的所有计算机也有互联网。在我的房子里,我有一台可以上网的电脑。我需要我的办公室电脑作为服务器和我的家用电脑来连接它。以前,我曾经能够通过服务器上的端口转发流量进行连接:

    NATUPNPLib.UPnPNATClass upnpnat;
    NATUPNPLib.IStaticPortMappingCollection mappings;

    public ServerExample()
    {
        InitializeComponent();

        upnpnat = new NATUPNPLib.UPnPNATClass();
        mappings = upnpnat.StaticPortMappingCollection;

        //                           server local IP address
        mappings.Add(1300, "TCP", 1300, "192.168.150.146", true, "plsease work");
        // this code tels the router to forward all tcp traffic comming from port
        // 1300 to the server computer (it's lan ip address happens to be 192.168.150.146)
        //...

我能够从我家连接。 (我知道简单的方法是打开办公室路由器上的端口并将它们转发到我的计算机,问题是我无法访问办公室路由器)

现在他们用更新的路由器替换了我办公室的路由器,我无法使用我的代码。现在,使用新路由器,当我执行私有(private)代码时,我得到:

enter image description here

请注意,映射返回 null;因此,我无法添加映射。

我相信应该有一种方法可以建立连接,因为办公室中的某些人使用例如limewire 或bit torrent。我认为我的问题可能与权限有关?我该如何解决这个问题?

编辑

因此,从研究中我发现我想要做的是“UDP 在防火墙中打洞”。我实际上想通过 tcp 连接来完成。我不知道 tcp 和 upd puch holing 之间的区别是什么……我的意思是,这样做的目的是让客户端无需在路由器上进行配置即可找到梨。

.

.

.

.

.

.

更新

好的,所以我相信我已经尝试使用 c# 执行你们在这个问题上发布的内容:好的,让我向您展示我所做的:

请注意,您可能需要引用此图以了解我将要解释的内容:
enter image description here

如您所知,我想在计算机 A 和计算机 B 之间建立 tcp 连接。我设法做到这一点的方法是执行所谓的 tcp 打洞。

第1步:
我做的第一件事是开始监听服务器 S 上的新连接。
                   TcpListener server = new TcpListener(System.Net.IPAddress.Parse(“192.168.11.109”), 55550);
                   Server.Start();

                   var client = server.AcceptSocket();  \\ wait here until someone connects

第2步:
现在使用计算机 A 连接到服务器:
          TcpClient tcpClient = new TcpClient("192.168.11.109", 55550);

第 3 步:
在计算机 A 上执行第 2 步代码后,服务器 S 调试应如下所示:

enter image description here

第四步:
现在我们的目标是从计算机 B 连接到计算机 A。服务器 S 拥有 B 建立连接所需的信息。实际上,我必须在计算机 B 和服务器 S 之间建立连接,以便服务器 S 可以为 B 提供适当的参数,以便 B 连接到 A。

第 5 步:
因为我正在调试,所以我能够看到参数,所以我现在通过监听端口 3313 使计算机 A 成为服务器。我希望计算机 A 现在正在监听该端口(3313),因为所有包都通过端口发送到路由器 X 3313 应发送到计算机 A。
       \\ COMPUTER A 
       TcpListener server = new TcpListener(System.Net.IPAddress.Parse("192.168.0.120"), 3313);
        server.Start();

        var newClient = server.AcceptSocket();  \\ wait here until a client gets connected

第 6 步:
因此,计算机 A 现在应该在端口 3313 上监听新连接。端口 3313 再次很重要,因为路由器 x 应该将从该端口接收到的所有数据包转发到计算机 A。

计算机 A 正在等待新连接。
enter image description here

第 7 步:
所以现在快点!我们想从计算机 B 建立该连接。实际上,服务器 S 将传递参数,但由于我只是想完成这项工作,因此我将在计算机 B 上非常快速地编写程序。
          TcpClient tcpClient = new TcpClient(“192.168.11.108”, 3313);
           \\192.168.11.108  is the address of router X

最后:

由于某种原因,计算机 B 无法连接到计算机 A。

enter image description here

无法连接的原因是路由器 X 没有将包转发到计算机 A。(我知道这一点是因为我在路由器 X 的端口 54540 上启用了端口转发,当我使用该端口时它可以工作)我的意思是我不明白为什么路由器 X 没有将来自端口 3313 的流量转发到计算机 A。计算机 A 已经与服务器 S 建立了连接,并且服务器 S 通过端口 3313 发送到路由器 X 的所有内容都被发送到计算机 A。为什么是如果我通过端口 3313 将包发送到路由器 X,它们不会被计算机 A 接收到!?

PS:

请注意,我在这里展示的所有内容,实际上都有三个路由器 X、Y 和 Z,还有服务器 S、计算机 A 和计算机 B:

enter image description here

最佳答案

你的新工作路由器可能有 UPnP禁用,因此您的空引用。

没有这个,您的服务器就无法对入站流量可见,因为路由器不知道将入站数据包发送到哪里。在这种情况下,路由器充当防火墙,阻止传入服务器的流量。

解决这个问题的基本方法是:

1)打开UPnP

这使您的应用程序能够指示路由器如何将入站流量转发回您的服务器。

2)设置端口转发

如上通过手动配置路由器。

3)让你的工作服务器成为客户端

路由器通过允许出站连接来启动连接来工作。它记住返回地址,重写外部可见的 IP,并为外部流量提供一个未使用的端口来回话 (NAT)。这允许出站请求与外部建立通信并绕过防火墙。如果您的家庭 IP 是固定的,您可以在工作中设置一个客户端,尝试按计划调用家庭(直到您启动服务器并可以建立连接)。

4)使用P2P(中介服务器)

我不确定你会从哪里开始,但原则是这样。它通常在单个 UDP 端口上工作。不在 NAT 后面的服务器用于建立连接。客户端以 UDP 数据包的形式将其 IP 发送到服务器,路由器用路由器返回地址重写 UDP 报头。服务器获取此数据并将其发送给其他对等方。现在每个人都知道彼此的返回地址,他们可以直接向对方发送 TCP 流量,服务器就会让开。

有一些非常好的文章here关于NAT的基础知识,用简单的术语解释。还有一篇好文章here这解释了 P2P 如何利用 NAT 绕过防火墙。

希望这能给你一些想法。

关于c# - 使用 c# "UDP punch hole into firewall"将流量从端口 X 转发到计算机 B,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7225150/

相关文章:

c# - 登录 C# 库

c# - 将项目添加到通用列表时为 "Index was outside the bounds of the array"

c# - 将Datatable数据绑定(bind)到Windows窗体的Gridview

C++ Builder XE2,接收 tcp 请求

linux - echo 2 >/proc/sys/net/ipv4/tcp_mtu_probing 能够解决我的问题,但为什么呢?这个命令是做什么的?

c# - dbcontext.SaveChnages();插入数据库时​​抛出异常DbUpdateException,将EF5与Mysql结合使用

c# - 网络接口(interface)子类型 .Net Framework 4.0

C++/Qt同步下载文件

java - 检测网络中重叠社区的库?

networking - 除了 UDP 广播或多播,我还可以在 WiFI 网络上使用哪些其他方法来发现计算机?