我想阻止某些网站以提高工作效率并避免分心。我发现 BlockSite(Brave 浏览器扩展)是一个非常好的工具,但它有一个致命的缺陷,即它可以被禁用非常通过顶部的任务栏即可轻松完成。我想要一个更坚固的解决方案。
我最初使用概述的方法这里但我发现这种方法没有模拟 BlockSite 的功能,后者会阻止 Facebook 或 Twitter 上的每个页面(例如),这种编辑文件的方法/etc/hosts
最终只会阻止twitter.com
而不是所有与 Twitter 相关的页面(我例如,仍然可以访问乔·拜登或唐纳德·特朗普的 Twitter 页面)
在 ubuntu 上彻底阻止某些网站,同时又使其难以解除阻止的最佳方法是什么?
答案1
这不是一项简单的任务。
您认为有多少网站可能会分散注意力/损害生产力?如果只有 2 个站点,则将它们添加到 /etc/hosts 即可。 20 - 是的,没关系 - 但我们已经到了维持这一点将开始变得困难的地步。当有 200 个主机时,您将看到对性能的一些影响。
按照 Fox 建议运行名称服务器可以在技术方面进行扩展 - 但维护大量站点列表相当困难。此外,您还需要找到一种方法来防止用户简单地将计算机指向另一个 DNS 服务器(或简单地在浏览器中启用 DNS-over-HTTPS)。
对于计算机网络有现成的解决方案 - 使用 pihole 路由器或带有阻止列表的 Squid 代理(在 google 上搜索 Squidguard)。但是,如果您只有一台在国内 ADSL 服务上运行 dhcp 的计算机,那么实现这些功能将很困难 - 您需要在单独的网络名称空间中启动用户会话,而无需访问互联网,并通过在同一网络上其他地方运行的代理进行连接主持人。
答案2
去Githubbytescout/拖延网站列表并遵循非常简单的说明。适用于 Linux 和 Windows。特别是在 Linux 下,您将编辑/etc/hosts
而不是 Windowsc:\windows\system32\drivers\etc\hosts
文件。使用您的sudo
密码。
答案3
我同意贾斯汀·索尔姆斯的观点。我尝试了类似的方法*
,但没有成功(www.google.com
,www.google.fr
-> www.google.*
)。出于我理解的性能原因,也许有一个解决方法。
无论如何,对于个人使用来说会很麻烦。当需要享受自己的时光时,能够从中“回来”真是太好了。我提出了一个适用于所有 Linux 发行版的脚本。只要hosts
是在/etc/
.
该脚本仅进行复制。初始化参数创建(询问是否存在)hosts.prod
(生产力)和hosts.div
(divertissement,它是法语,所以让我们说divertissement保持英语^^)。然后它所做的就是hosts
被 div 或 prod 版本覆盖。
#!/usr/bin/env bash
#
# This script inverts the hosts files.
# To be in the productive mode or not.
# -p: productive mode
# -n: non-productive mode
# --init: initialize hosts
PROD_HOSTS=/etc/hosts.prod
DIV_HOSTS=/etc/hosts.div
HOSTS=/etc/hosts
if [ "$1" == "-p" ]; then
echo "Switching to productive mode"
sudo cp $PROD_HOSTS $HOSTS -f
elif [ "$1" == "-n" ]; then
echo "Switching to non-productive mode"
sudo cp $DIV_HOSTS $HOSTS -f
elif [ "$1" == "--init" ]; then
echo "Initializing hosts"
sudo cp $HOSTS $DIV_HOSTS -i
sudo cp $HOSTS $PROD_HOSTS -i
sudo echo "# Blacklisted websites" >> $PROD_HOSTS
sudo echo "127.0.0.1 www.example.org" >> $PROD_HOSTS
echo ""
echo "To update your blacklist: `sudo vim /etc/hosts.prod`"
echo "(`vim` or `nano`)"
echo ""
echo "/!\\ Don't forget to run this script after editing!"
echo ""
else
echo "Usage: productivity.sh [-p|-n]"
echo " -p: productive mode"
echo " -n: non-productive mode"
echo " --init: initialize hosts"
fi
答案4
您的方向是正确的/etc/hosts
,直接处理主机名解析。正如您所指出的,问题在于您无法对那里的所有子域进行通配符。为此,您需要设置 DNS 服务器。例如,如果您使用 BIND,您首先需要一个如下所示的区域文件:
; /var/named/blackhole.zone
@ IN SOA localhost. localhost. (
2021121301 ; Serial
7200 ; Refresh
120 ; Retry
2419200 ; Expiration
3600) ; Default TTL
A 127.0.0.1
* IN A 127.0.0.1
AAAA ::1
* IN AAAA ::1
然后,您需要创建一个包含您想要阻止的域的配置文件:
# /etc/named/blackhole.conf
zone "facebook.com" {type master; file "/var/named/blackhole.zone";};
zone "twitter.com" {type master; file "/var/named/blackhole.zone";};
在主配置中的某个位置,包含此文件:
# main config, probably /etc/named.conf but can vary
#...
options {
listen-on { 127.0.0.1; }; # localhost only
forwarders {208.67.222.222; 208.67.220.220;}; # OpenDNS
# ...
}
include "/etc/named/blackhole.conf";
然后假设您的 DNS 服务器配置为127.0.0.1
并且 BIND 正在运行,您可以运行rndc reload
以便将所有通配符域列入黑名单。
本质上,您在这里所做的就是设置一个转发DNS服务器有一些自己的(虚构的)权威区将一些主机名定向到本地主机而不是它们的真实位置。