如何通过 Windows 防火墙允许 .NET Core 控制台应用程序 FTP 连接?
Posted
技术标签:
【中文标题】如何通过 Windows 防火墙允许 .NET Core 控制台应用程序 FTP 连接?【英文标题】:How do I allow a .NET Core console app FTP connection through Windows Firewall? 【发布时间】:2020-04-10 07:09:31 【问题描述】:我有一个 .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 文件,或者是否有替代方法?提前感谢您的帮助!
【问题讨论】:
有一种方法可以发布您的控制台应用程序,以便创建exe
-> (***.com/questions/44074121/…),然后您可以将 exe
列入白名单 -> 一种可能的解决方案。
【参考方案1】:
你可以在 Win10 上尝试 2 件事:
允许应用通过 Windows 防火墙使用下面的高级安全配置 Windows Defender 防火墙导航路径:控制面板\所有控制面板项\Windows Defender 防火墙\允许的应用程序
点击允许其他应用
在以下弹出窗口中,提供 dotnet.exe 的绝对路径
导航路径:控制面板\所有控制面板项\Windows Defender 防火墙\高级设置
编辑:
事实证明白名单起到了作用。
【讨论】:
我希望使用“允许应用程序通过 Windows 防火墙”方法,但我不知道在 .Net 核心的上下文中选择什么...“.dll”不是受支持的扩展程序。 @DaveSmash,您是否尝试过允许 dotnet.exe 我能想到的另一种方法是为特定端口配置入站/出站规则? 我刚刚添加了它,并且将禁用我的其他规则来检查...这些 FTP 文件已经堆积了一段时间,所以我要让程序在我测试之前完成运行,但是我会尽快跟进。我的第一个想法是这比我希望允许的范围更广,但我想我可以控制哪些 .Net Core 应用程序在服务器上运行,所以我想得越多,它似乎也不是什么大威胁. 是的,入站规则非常灵活 将 dotnet.exe 列入白名单似乎确实有效。我实际上将使用 Martin Prikryl 建议的被动 FTP 方法,但是您的 cmets 为我提出的实际问题提供了更好的答案。如果您想对其进行编辑以更具体地说明如何将 C:\Program Files\dotnet.exe 列入白名单,这样人们就不必阅读评论线程,那么我会给您功劳!感谢您的帮助。【参考方案2】:我可能在这里找到了答案:
https://serverfault.com/questions/401304/active-ftp-client-blocked-by-windows-firewall-on-windows-7
基本上解决方案是转到防火墙高级设置,并创建一个新的入站规则。选择Custom Rule
。我将它应用于All Programs
(因为我仍然不知道如何选择.Net Core 应用程序)。我使用的协议类型:TCP
,本地端口:All Ports
,远程端口:Specific Ports
20
。
这个想法是您在 TCP 端口 20 上启动连接,然后将产生的入站流量指向某个任意端口,但由于远程端口是 TCP 端口,您可以确定它是 FTP 响应20. 因此,您无需打开大量本地端口,而是打开所有本地端口,但只针对单个远程端口。
如果有人有帮助我允许整个应用程序的答案,我将保持打开状态,但这是一个足够好的解决方案。
【讨论】:
没有什么可以阻止攻击者使用远程端口 20,允许它针对您计算机上的任何端口/侦听应用程序。就好像您完全关闭了防火墙一样。 好吧,如果他们知道或猜测使用远程端口 20,我就完全关闭了防火墙......但我明白你的意思。我比这个更喜欢你的被动 FTP 方法。 这就是我写“几乎”的原因。攻击者不难识别出您的主要连接是 FTP。那么端口20就很容易猜到了。即使没有,您会使用“20”作为您的帐户密码吗? - 在安全性方面是等效的。【参考方案3】:不要使用 FTP 主动模式。而且您不会遇到防火墙问题。
默认启用被动模式是有充分理由的。它可以减少通过防火墙的问题。
删除这一行:
request.UsePassive = false;
阅读我在network configuration needed for FTP active and passive modes上的文章。
【讨论】:
您的链接读起来不错,而且被动 FTP 方法似乎确实可以在不更改防火墙的情况下工作。为了任何人搜索允许 .Net Core 通过防火墙的问题,我将接受解决该特定问题的答案,但 +1 并真诚地感谢您提供更好的方法!以上是关于如何通过 Windows 防火墙允许 .NET Core 控制台应用程序 FTP 连接?的主要内容,如果未能解决你的问题,请参考以下文章