我正在尝试弄清楚为什么我的 hosts 文件没有被正确执行。正确执行的意思是,当我访问我试图阻止的网站时,它需要大约 12 小时才能生效。
是的,我知道这个问题和这个问题类似(https://serverfault.com/questions/50934/hosts-file-being-ignored) 但那里提出的任何建议都无法解决问题。
背景:我想在上课期间屏蔽我儿子电脑上的 YouTube。我的路由器允许按计划屏蔽,但这会影响我的整个网络。现在,我知道,我可以获得一个好的、可配置的防火墙设备(例如 Firewalla、pfSense、Untangle 等)或添加第二个无线接入点,让他的笔记本电脑连接到该接入点,然后在第二个接入点上创建屏蔽规则。但是,我是个白痴,我选择了困难的路线。
因此,我的想法是创建两个备用主机文件,其中一个包含以下行来阻止 YouTube:
127.0.0.1 youtube.com
另一个没有。然后我创建了两个批处理脚本,根据使用 Windows 调度程序的计划替换 hosts 文件。以下是批处理脚本:
ECHO OFF
SET COPYCMD=/Y
xcopy /V /Y C:\Windows\System32\drivers\etc\hosts_YT_OFF.txt C:\Windows\System32\drivers\etc\hosts
IPCONFIG /flushdns
因此,当我执行脚本时(甚至还没有进入调度程序步骤),它会按预期工作,有点(“有点”是指,是的,从技术上讲,它已经起作用,但需要超过 12 个小时才能生效)。
检查hosts文件:是的,它已被正确替换。
Ping“youtube.com”:
C:\WINDOWS\system32>ping youtube.com
Pinging youtube.com [127.0.0.1] with 32 bytes of data:
Reply from 127.0.0.1: bytes=32 time<1ms TTL=128
Reply from 127.0.0.1: bytes=32 time<1ms TTL=128
Reply from 127.0.0.1: bytes=32 time<1ms TTL=128
Reply from 127.0.0.1: bytes=32 time<1ms TTL=128
如您所见,hosts 文件已被遵守。检查 dns 缓存:
C:\WINDOWS\system32>ipconfig /displaydns
Windows IP Configuration
youtube.com
----------------------------------------
No records of type AAAA
youtube.com
----------------------------------------
Record Name . . . . . : youtube.com
Record Type . . . . . : 1
Time To Live . . . . : 0
Data Length . . . . . : 4
Section . . . . . . . : Answer
A (Host) Record . . . : 127.0.0.1
尝试过这个:
C:\WINDOWS\system32>nbtstat -R
不用找了。
做过这个:
C:\WINDOWS\system32>ipconfig /release
C:\WINDOWS\system32>ipconfig /renew
再次,没有变化。我的意思是,它确实禁用了适配器并更新了它,但我仍然可以在 Chrome、Firefox、Edge 上访问 YouTube。是的,我重启了浏览器,并清除了缓存。什么都没有。
我有不是重启了电脑,但我不打算这么做。首先,它会最终禁用 YouTube。其次,当我 ping youtube.com 时,它返回 localhost,那么,我为什么要禁用它呢?某物把事情搞砸了,我太固执了,不愿意放手,不愿意采取上述简单的解决方案。:P
hosts 文件是被正确替换,就像第二个脚本一样,当我想重新启用 YouTube 访问时,它只是用默认文件替换被阻止的 YouTube 主机文件。我已经确认,在成功禁用 YouTube 后(大约 12 小时后才发生),可以 ping 并访问 YouTube。
我希望所有这些都有意义。一定有一些非常简单的 Windows 网络解释,而我却没有找到。任何帮助都将不胜感激。
更新2020 年 9 月 11 日。我成功了。问题是我需要将这个额外的地址添加到 hosts 文件中:
127.0.0.1 www.youtube.com
就是这样。一点也不复杂,只是一个“www”。我不确定为什么,我以为域名可以覆盖它。没有。唉。所以现在它读起来是:
127.0.0.1 youtube.com
127.0.0.1 www.youtube.com
答案1
由于 MS Windows 忽略了一些具体的主办方规则甚至考虑了一些这样的尝试安全风险,你可以尝试做一个防火墙规则阻止特定网站。一条规则可以阻止多个 URL。您可以制作批处理脚本来激活规则:
netsh advfirewall firewall set rule name="TestRule" new enable=yes
或者用来... enable=no
使其停用。
- 按Windows,输入防火墙,然后选择具有高级安全性的 Windows Defender 防火墙。
- 选择入境规则。
- 选择新规则...在下面操作。
- 选择自定义规则。
- 在下面范围,添加 许多 远程 IP 地址对于 YouTube.com,例如 172.217.6.238(见下文)
- 在下面行动,阻止连接。
- 如果需要,重复出站规则。
注意:阻止单个 IP 地址是没有意义的,因为YouTube 拥有许多IP 地址例如,
- 个人地址:
- 208.65.153.238
- 208.65.153.251
- 令人厌烦
- IP 地址范围:
- 199.223.232.0-199.223.239.255
- 207.223.160.0 - 207.223.175.255
- 以及许多尚未被发现的正如 T. Lehrer 所说。
警告:这些防火墙规则可以被绕过,并且随着 YouTube 添加更多 IP 地址也需要更新。
答案2
一些程序维护自己的 DNS 查找缓存。
因此,对于此类程序,如果它提供了清除缓存的方法,您还需要告诉程序清除其缓存。
答案3
这里的问题是该hosts
文件(顾名思义)包含主机名条目,不是域名項目。
youtube.com
恰好是主机名,这就是您可以使用浏览器导航到它的原因,也是为什么文件中的条目hosts
会产生影响的原因。
正如您已经知道的www.youtube.com
那样,是另一个可以访问相同内容的主机名。进一步思考,您将遇到此方法的问题,因为您无法知道 YouTube 使用多少其他主机名。
例如,对于网站的移动版本,仍然经常使用 而不是 (尤其是大型网站)。因此,我刚刚尝试了m.
,它成功了。我还没有彻底调查,但这似乎只会导致重定向。但是,根据你儿子的年龄(即聪明程度),找出所需的 IP 地址就足够了(例如打开和发出)。我假设有一堆其他主机名可以指向 YouTube 内容。www.
m.youtube.com
cmd
ping m.youtube.com
总而言之,它不是域, 但主机名您在浏览器的导航栏中输入的内容以及放入文件中的内容hosts
,不幸的是,首先,您不知道有多少个主机名以及哪些主机名解析到同一个主机,这就是您所描述的保护系统无法做到万无一失的原因之一。
[有方法可以调查域中使用的主机名,但我认为这些细节在这里与主题无关,并且您的保护系统还有其他注意事项。此外,YouTube 可以随时添加和删除其他主机名,因此您必须定期检查。]