几个月来,我一直使用我的 hosts 文件(位于 /private/etc/hosts)来屏蔽工作日中分散注意力的网站。到目前为止,这种方法一直很有效。今天它突然停止工作了。
来自 hosts 文件中的一些示例行:
127.0.0.1 Facebook.com
127.0.0.1 www.Facebook.com
我按照以下步骤将该文本放入 hosts 文件中:
sudo nano /etc/hosts
写入上述行,然后按 ^O 写入文件,按 Enter 确认文件名,按 ^X 退出编辑器。
在本地主机 IP 和域名之间我有一个制表符。行尾是 Unix 样式 (LF),奇怪的是,当我使用该ping
命令时,它似乎可以正常工作:
ping facebook.com
PING facebook.com (127.0.0.1): 56 个数据字节
来自 127.0.0.1 的 64 字节:icmp_seq=0 ttl=64 时间=0.137 毫秒
来自 127.0.0.1 的 64 字节:icmp_seq=1 ttl=64 时间=0.122 毫秒
来自 127.0.0.1 的 64 字节:icmp_seq=2 ttl=64 时间=0.118 毫秒
来自 127.0.0.1 的 64 字节:icmp_seq=3 ttl=64 时间=0.110 毫秒
^C
--- facebook.com ping 统计信息 ---
已发送 4 个数据包,已接收 4 个数据包,0.0% 数据包丢失
往返最小值/平均值/最大值/标准差 = 0.110/0.122/0.137/0.010 毫秒
但是当我尝试在 Safari 或 Firefox 中访问 facebook.com 时,我仍然可以访问该网站。我以类似方式阻止的其他网站也是如此。我清空了这两个浏览器的缓存,但这并没有解决问题。
我该如何解决这个问题?
更新 1: 我现在正在检查我以这种方式阻止的所有网站,发现不同域的行为并不一致。这些是我在 /private/etc/hosts 中阻止的“浪费时间的人”:
#阻止时间杀手
127.0.0.1 9gag.com
127.0.0.1 flabber.nl
127.0.0.1 geenstijl.nl
127.0.0.1 dumpert.nl
127.0.0.1 facebook.com
127.0.0.1 www.9gag.com
127.0.0.1 www.flabber.nl
127.0.0.1 www.geenstijl.nl
127.0.0.1 www.dumpert.nl
127.0.0.1 www.facebook.com
##
此列表中的所有站点都可以 ping 到127.0.0.1
,但是9gag.com
和flabber.nl
无法通过任何浏览器访问,但是geenstijl.nl
,dumpert.nl
和facebook.com
是可达。
我尝试过重启,但问题没有解决。在出现此问题之前,我从未通过某种更新更改过系统配置。
更新 2:
三个小时前我可以facebook.com
通过 Safari 和 Firefox 访问,现在却不能了。geenstijl.nl
不过dumpert.nl
仍然可以访问。在过去三个小时内我没有做任何更改,只是使用了 Word 并用 Safari 浏览网页。
更新 3: 现在,第二次更新四小时后,hosts 文件又恢复正常工作了。在摸索 hosts 文件的过程中,我删除了不起作用的条目,并逐个重新添加它们,并在添加后测试每一个条目。我不知道发生了什么,也无法再对流量运行 wireshark,因为我没有观察到任何错误行为。
更新 4: 问题又出现了。与更新 1 中相同的站点显示了错误的行为。
更新 5:
一切又恢复正常。当我再次遇到错误时,我会记住这里发布的解决方案。
答案1
OS X 中的 DNS 解析在从 Snow Leopard 更新到 Lion 时出现问题。全新安装后,一切都应该正常工作,但如果您选择了更新路线,事情可能会出现问题。
选项 1:IPv6 寻址
如果 IPv4 无法访问,许多网站和 ISP 都支持 IPv6。将定义在一开始的时候像/etc/hosts
这样:
# Block Facebook IPv4
127.0.0.1 www.facebook.com
127.0.0.1 facebook.com
# Block Facebook IPv6
fe80::1%lo0 www.facebook.com
fe80::1%lo0 facebook.com
选项 2:使用 DNSMasq
如果上述建议无效,您可以安装 DNSMasq。
答案2
进行任何更改后,在命令行中/etc/hosts
运行dscacheutil -flushcache
以清除本地 DNS 缓存。对我来说,这每次都有效,但有一个例外:Firefox 有自己的 DNS 缓存,因此您必须重新启动它。
答案3
OSX 系统在其大多数网络操作中不使用 /etc/hosts。大多数情况下,终端/命令行命令(Unixy 内容)主要使用 /etc/hosts,而 Maccy (!) 中的任何内容都使用保存在其他地方的内部 plist 类型表。
这种用法不一致且存在问题,因为它使 OSX“unix”变得不确定。正如您所发现的。
我没有 Mac 了,无法确切地找出 Mac OSX 存储其 hosts 文件模拟的位置,但希望这些信息能为您指明正确的方向。
我知道它会在 /Library 目录(和/或 ~/Library)中,并且 plist 文件是压缩的,因此您不能只通过 grep 查找内容。嗯,“plutil”命令可以解压/显示 .plist 文件的内容(我想这就是名称)。也许从
find ~/Library /Library -iname "*host*" -ls
看看在像窗户一样复杂的泥沼中到底隐藏着什么。
它不完全是 unix (netbsd)...但它也不完全是...无论你怎么称呼它(GUI?)。甚至 Windows 也是一致的。也许是错的...但一致。
答案4
我发现,在 OS X 10.9 上,Safari 和 Firefox 可以继续访问被阻止的域,除非我在 etc/hosts 文件中实施了 IPv6 阻止。只有 Chrome 受到 IPv4 阻止的影响。