如何编写一个函数来阻止或防火墙关闭到 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
}
但是我希望有以下约束:
- website/domain 可以类似于 reddit.com,它的一个域名有 多个 IP 地址。
- 屏蔽方法应该是客户端或桌面解决方案。它不应该依赖于使用你的路由器。这个问题的上下文不是网络管理,我希望这个函数在我个人的 windows 机器上执行。
见解:
内容过滤可以发生在网络的不同阶段。使用 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 足以提供答案。参见:
堆栈溢出:
- Is there a way to get all IP addresses of youtube to block it with Windows Firewall?
- CommandLine IP block / unblock in Windows Firewall with Advanced Security
- How to access a website by IP address in a server that hosts many websites?
超级用户:
以下函数是用 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
}
所用函数调用的文档如下:
https://docs.microsoft.com/en-us/powershell/module/dnsclient/resolve-dnsname
https://docs.microsoft.com/en-us/powershell/module/netsecurity/new-netfirewallrule
此功能已经过测试,适用于 whosebug.com 和 Reddit.com,它们都有多个 IP 地址。但是,该函数因 YouTube.com 而失败,因为只为 YouTube.com returns 调用 Resolve-DnsName 一个 IP 地址,但多次调用时可以是不同的 IP。同样,屏蔽所有 YouTube IP 可能会导致屏蔽诸如 Google Drive 和 Google.com 之类的服务,这可能是不可取的。
问题:
我想编写一个具有以下伪代码签名的函数:
/**
* Blocks all traffic to the given website.
*
* @param {String} domain The domain name of the site to block
*/
function blockSite (domain) {
// TODO
}
但是我希望有以下约束:
- website/domain 可以类似于 reddit.com,它的一个域名有 多个 IP 地址。
- 屏蔽方法应该是客户端或桌面解决方案。它不应该依赖于使用你的路由器。这个问题的上下文不是网络管理,我希望这个函数在我个人的 windows 机器上执行。
见解:
内容过滤可以发生在网络的不同阶段。使用 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 足以提供答案。参见:
堆栈溢出:
- Is there a way to get all IP addresses of youtube to block it with Windows Firewall?
- CommandLine IP block / unblock in Windows Firewall with Advanced Security
- How to access a website by IP address in a server that hosts many websites?
超级用户:
以下函数是用 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
}
所用函数调用的文档如下:
https://docs.microsoft.com/en-us/powershell/module/dnsclient/resolve-dnsname
https://docs.microsoft.com/en-us/powershell/module/netsecurity/new-netfirewallrule
此功能已经过测试,适用于 whosebug.com 和 Reddit.com,它们都有多个 IP 地址。但是,该函数因 YouTube.com 而失败,因为只为 YouTube.com returns 调用 Resolve-DnsName 一个 IP 地址,但多次调用时可以是不同的 IP。同样,屏蔽所有 YouTube IP 可能会导致屏蔽诸如 Google Drive 和 Google.com 之类的服务,这可能是不可取的。