C# - .Net Core 5.0 的端口映射

C# - Port Mapping with .Net Core 5.0

预期结果

我正在尝试使用 Kestrel 创建一个 ASP.NET Core 5.0 应用程序,我想自动转发服务器的端口。

套餐

我目前正在使用 OpenNat.Core package. I have also tried the regular OpenNat 并且出现了同样的问题。

问题

当端口转发时,程序说它已正确映射所有内容,甚至在列出我的路由器上的所有映射端口时也会显示该映射。然而,当我试图通过 CanYouSeeMe.org 查看它的状态时,它 returns 出现超时错误,我无法访问网络外的服务器。

我试过的

  1. 我想可能是服务器启动后端口映射一直在打开,所以我手动打开了端口,然后重启了Kestrel服务器。
  2. 我确定我的路由器支持 UPnP
    • 我也有一个 Synology NAS,我从中转发,它工作得很好。
  3. 我有个朋友用ZenMap查了端口。
    • 端口显示已过滤但未打开(未指定服务)。

代码

using Open.Nat;
using System;
using System.Threading;
using System.Threading.Tasks;
...
        public static async Task OpenPort(int port, string description)
        {
            try
            {
                
                NatDiscoverer discoverer = new NatDiscoverer();
                CancellationTokenSource cts = new CancellationTokenSource(10000);
                NatDevice device = await discoverer.DiscoverDeviceAsync(PortMapper.Upnp, cts);
                Mapping map = new(Protocol.Tcp, port, port, description);
                await device.CreatePortMapAsync(map);
                Console.WriteLine($"Created {map}");
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                Console.WriteLine(e.StackTrace);
            }
        }

没关系,我的防火墙阻止了应用程序。我能够动态添加防火墙规则来解决问题。