预期结果
我正在尝试使用 Kestrel 制作 ASP.NET Core 5.0 应用程序,并且我想自动端口转发服务器的端口。
包裹
我目前正在使用该OpenNat.Core
软件包。我也尝试过常规OpenNat
,并且出现了同样的问题。
问题
当端口转发时,程序说它已经正确映射了所有内容,并且当列出我的路由器上的所有映射端口时,地图甚至会显示出来。然而,当我尝试通过CanYouSeeMe.org查看其状态时,它返回超时错误,并且我无法访问网络外的服务器。
我试过的
- 我以为服务器启动后端口映射可能已经打开,所以我手动打开了端口,然后重新启动了 Kestrel 服务器。
- 我确保我的路由器支持 UPnP
- 我也有一台 Synology NAS,可以从中进行转发,它工作得很好。
- 我有一个朋友使用 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);
}
}