如何阻止对 Ubuntu 上某些网站的访问?

如何阻止对 Ubuntu 上某些网站的访问?

我想阻止某些网站以提高工作效率并避免分心。我发现 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.comwww.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服务器有一些自己的(虚构的)权威区将一些主机名定向到本地主机而不是它们的真实位置。

相关内容