如何允许 .NET Core 控制台应用程序 FTP 通过 Windows 防火墙连接?

How do I allow a .NET Core console app FTP connection through Windows Firewall?

我有一个 .NET Core 控制台应用程序,它从 FTP 服务器下载文件并处理它们。我将应用程序移到新服务器上,但它停止工作了。在新服务器上禁用 Windows 防火墙解决了这个问题,但显然我不想让它敞开 - 我需要一种有针对性的方式来启用这个应用程序。 FTP 默认防火墙规则似乎已经允许(入站和出站)流量,所以我不知道可以打开哪些额外的端口(我想我正在使用活动 FTP,它可以使用广泛的端口范围 AFAIK)。我更愿意将应用程序列入白名单,但它不是 .exe 文件,所以我不确定允许哪个应用程序。

我运行 应用程序使用.bat 文件的快捷方式。 bat 文件仅包含以下行:

dotnet "C:\path\my-application.dll"

申请失败的代码是:

FtpWebRequest request = (FtpWebRequest)FtpWebRequest.Create(ftpServerUri);
request.UseBinary = true;
request.Credentials = new NetworkCredential(ftpUser, ftpPsw);
request.Method = WebRequestMethods.Ftp.ListDirectory;
request.Proxy = null;
request.KeepAlive = false;
request.UsePassive = false;

// hangs here forever unless Windows Firewall is turned off
FtpWebResponse response = (FtpWebResponse)await request.GetResponseAsync();

是否可以允许应用程序通过防火墙?我是否允许 dotnet.exe、.bat 文件或 .dll 文件,或者是否有替代方法?在此先感谢您的帮助!

您可以在 Win10 上尝试两件事:

  • 允许应用程序通过 Windows 防火墙

Navigation Path: Control Panel\All Control Panel Items\Windows Defender Firewall\Allowed apps

Click Allow another app

On the following pop up, provide the absolute path to dotnet.exe

  • 配置Windows Defender Firewall with Advance Security

Navigation Path: Control Panel\All Control Panel Items\Windows Defender Firewall\ Advanced Settings

编辑:

事实证明,白名单起到了作用。

我可能在这里找到了答案:

https://serverfault.com/questions/401304/active-ftp-client-blocked-by-windows-firewall-on-windows-7

基本上解决方案是转到防火墙高级设置,然后创建一个新的入站规则。 SelectCustom Rule。我将它应用于 All Programs(因为我仍然不知道如何 select .Net Core 应用程序)。我使用的协议类型:TCP,本地端口:All Ports,远程端口:Specific Ports 20.

想法是在 TCP 端口 20 上发起连接,然后生成的入站流量指向某个任意端口,但您可以确定它是一个 FTP 响应,因为远程端口是 TCP 端口 20。因此,与其打开大量本地端口,不如打开所有本地端口,但只打开一个远程端口。

如果有人有答案可以帮助我允许整个应用程序,我将保持打开状态,但除此之外,这是一个足够好的解决方案。

不要使用FTP主动模式。而且你不会有防火墙问题。

默认情况下启用被动模式是有充分理由的。它可以减少通过防火墙的问题。

删除这一行:

request.UsePassive = false;

阅读我在 network configuration needed for FTP active and passive modes 上的文章。