如何编写一个函数来阻止或防火墙关闭到 Windows 中具有多个 IP 地址的网站的流量?

How do I write a function that blocks or firewalls off traffic to a website that has multiple IP addresses in Windows?

问题:

我想编写一个具有以下伪代码签名的函数:

/**
 * Blocks all traffic to the given website.
 * 
 * @param {String} domain The domain name of the site to block
 */
function blockSite (domain) {
  // TODO
}

但是我希望有以下约束:


见解:

内容过滤可以发生在网络的不同阶段。使用 Windows 防火墙的解决方案在第 4 层(传输层)工作。其他解决方案可能使用第 7 层,即应用层。 Cold Turkey 是一个在第 7 层上运行的商业应用程序,要求在每个浏览器上安装插件并通过插件过滤内容。

增加阻止站点复杂性的一个挑战是共享网络托管。例如,某些网站(例如 youtube.com)与 google.com 等网站共享同一组 IP 地址。 为简单起见,满足共享虚拟主机的问题可以忽略。我只想屏蔽有问题的网站,而不管其他附属网站被它屏蔽了。

共享虚拟主机问题的一个解决方案是使用基于 DNS 的过滤(而不是基于 IP 的过滤)。为阻止站点任务提出的常见解决方案是使用主机文件 c:\windows\system32\drivers\etc\hosts。考虑以下用 powershell 编写的函数作为解决方案:

function Block-Site([String] $domain) {
    $hosts = 'C:\Windows\System32\drivers\etc\hosts'
    $isBlocked = Get-Content -Path $hosts | Select-String -Pattern ([regex]::Escape($domain))

    If(-not $isBlocked) {
        Add-Content -Path $hosts -Value "127.0.0.1 $domain"
        Add-Content -Path $hosts -Value "127.0.0.1 www.$domain"
    }
}

上述解决方案的问题在于它有许多琐碎的解决方法。例如,一种解决方法是仅 google 网站名称,然后单击来自 Google 的网站。因此,我对解决方案不是很满意,因为它实际上并没有阻止或防火墙关闭流量。

更新:我相信 Windows filter platform 可能是最全面的解决方案。我正在研究它的潜力,并为其添加标签。


研究:

我检查了我能找到的所有相关的 Whosebug 和超级用户问题,但 none 足以提供答案。参见:

堆栈溢出:

超级用户:

以下函数是用 powershell 编写的,将通过创建 Windows 防火墙规则阻止网站的所有 TCP 流量到与该网站关联的 IP 地址。

function Block-TrafficToURL([String] $domain) {
    [System.Collections.ArrayList]$IPs = @()
    Resolve-DnsName -Name $domain -NoHostsFile | Foreach {$IPs.Add("$($_.IPAddress)")}
    New-NetFirewallRule -DisplayName "Block $domain" -Direction Outbound -Protocol TCP -Action Block -RemoteAddress $IPs
}

所用函数调用的文档如下:

此功能已经过测试,适用于 whosebug.com 和 Reddit.com,它们都有多个 IP 地址。但是,该函数因 YouTube.com 而失败,因为只为 YouTube.com returns 调用 Resolve-DnsName 一个 IP 地址,但多次调用时可以是不同的 IP。同样,屏蔽所有 YouTube IP 可能会导致屏蔽诸如 Google Drive 和 Google.com 之类的服务,这可能是不可取的。