You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何关闭本地子网外的所有互联网连接?.NET防火墙应用遗留连接问题求助

解决防火墙启用后无法终止已建立互联网连接的问题

我明白你遇到的痛点了——Windows防火墙的默认逻辑是阻止新的连接请求,但对于已经握手完成的活跃连接(比如Messenger这类保持长连接的应用),它不会主动去中断这些已建立的会话。要实现彻底切断本地子网外的所有连接,得从「防火墙规则强化」和「主动终止现有连接」两个层面配合操作:

一、调整防火墙规则,覆盖已建立的连接

默认的防火墙规则只对「新连接」生效,你需要修改规则的作用范围,让它能阻断所有状态的连接(包括已建立的)。在.NET里可以通过NetFwTypeLib COM库或者简化的NuGet包WindowsFirewallHelper来操作:

代码示例(使用原生COM库)

using NetFwTypeLib;

public void BlockAllExternalConnections()
{
    // 获取防火墙策略实例
    var firewallPolicy = (INetFwPolicy2)Activator.CreateInstance(Type.GetTypeFromProgID("HNetCfg.FwPolicy2"));
    var blockRule = (INetFwRule)Activator.CreateInstance(Type.GetTypeFromProgID("HNetCfg.FWRule"));

    // 配置规则参数
    blockRule.Name = "Library Block External Connections";
    blockRule.Description = "Blocks all existing and new connections outside local subnets";
    blockRule.Direction = NET_FW_RULE_DIRECTION_.NET_FW_RULE_DIR_OUT;
    blockRule.Action = NET_FW_ACTION_.NET_FW_ACTION_BLOCK;
    blockRule.Enabled = true;
    blockRule.Protocol = (int)NET_FW_IP_PROTOCOL_.NET_FW_IP_PROTOCOL_ANY;
    // 排除本地子网,只阻断外部地址(根据图书馆实际网段调整)
    blockRule.RemoteAddresses = "!192.168.0.0/16, !10.0.0.0/8, !172.16.0.0/12";
    // 让规则作用于所有连接状态(关键:默认仅针对新连接)
    blockRule.Profiles = (int)NET_FW_PROFILE_TYPE2_.NET_FW_PROFILE2_ALL;
    blockRule.InterfaceTypes = "All";

    // 将规则添加到防火墙
    firewallPolicy.Rules.Add(blockRule);
}

二、主动终止已建立的外部连接

即使防火墙规则生效,部分已建立的长连接可能还会维持一段时间。你可以通过两种方式主动清理这些连接:

方法1:命令行工具快速实现(简单易上手)

通过调用netstat枚举外部连接,再用taskkill终止对应进程:

public void KillExternalConnectionProcesses()
{
    // 执行netstat命令,筛选排除本地子网的连接
    var cmdProcess = new Process
    {
        StartInfo = new ProcessStartInfo
        {
            FileName = "cmd.exe",
            Arguments = "/c netstat -ano | findstr /v 192.168 | findstr /v 10. | findstr /v 172.16",
            RedirectStandardOutput = true,
            UseShellExecute = false,
            CreateNoWindow = true
        }
    };

    cmdProcess.Start();
    var output = cmdProcess.StandardOutput.ReadToEnd();
    cmdProcess.WaitForExit();

    // 提取唯一PID并终止进程
    var targetPids = new HashSet<string>();
    foreach (var line in output.Split(new[] { '\n', '\r' }, StringSplitOptions.RemoveEmptyEntries))
    {
        var lineParts = line.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
        if (lineParts.Length >= 5)
        {
            targetPids.Add(lineParts[4]);
        }
    }

    foreach (var pid in targetPids)
    {
        try
        {
            Process.GetProcessById(int.Parse(pid)).Kill();
        }
        catch (Exception ex)
        {
            // 跳过无法终止的系统进程
            Console.WriteLine($"无法终止进程 {pid}: {ex.Message}");
        }
    }
}

方法2:IPHelper API原生实现(专业无依赖)

通过P/Invoke调用Windows原生APIGetExtendedTcpTable和SetTcpEntry来直接终止TCP连接,这种方式不需要依赖命令行,适合精细化控制。核心思路是枚举所有TCP连接,判断远程地址是否属于本地子网,然后主动重置连接。

三、关键注意事项

  • UAC权限:必须确保应用以管理员权限运行,否则无法修改防火墙规则或终止进程
  • 子网适配:根据图书馆实际使用的本地网段调整RemoteAddresses里的排除范围
  • 用户提示:终止进程可能导致用户未保存的数据丢失,建议在执行前弹出明确提示
  • 规则清理:恢复互联网访问时,记得禁用或删除之前添加的阻断规则

内容的提问来源于stack exchange,提问作者TomWardrop

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:14:29