以下列方式使用 /etc/hosts 文件作为网站拦截器是否不安全?

信息安全 linux http 主机文件
2021-08-21 09:17:25

我是一个 linux 菜鸟,在寻找一种简单的操作系统级网站阻止技术时,我遇到了使用 linux hosts 文件的解决方案,如下所示:

127.0.0.1 websiteiwanttoblock.com
127.0.0.1 anotherone.com
...

这很好而且简单——非常适合我的目的,但这是我的问题:如果我经常127.0.0.1用于 Web 开发目的,这是否危险?

看来,至少它可能会弄乱我目前正在从事的网络开发项目?例如,如果 Chrome/Firefox 向 发出请求websiteiwanttoblock.com/api/blah,那么这是否会发出请求127.0.0.1/api/blah并可能与我项目的 api 混淆?

如果这在这方面很危险,是否有一个更安全的“空”IP 地址可以将被阻止的站点重定向到?我知道像这样使用主机文件可能不是一个好习惯,但我只是喜欢编辑文本文件而不是下载包或其他任何东西的简单性。

编辑:哦,我经常使用端口 3000 进行开发,但假设我有时使用 80 或任何其他可用端口号。

4个回答

简答

文件用作阻止“空”地址的网站是否安全?/etc/hosts

我认为答案应该是:不。

如果没有其他原因,请求实际上并未“无效”。它们仍然是活跃的请求。正如 OP 所指出的,由于请求是针对合法的 Internet 主机的,因此这种将请求重定向到的捷径localhost可能会干扰在开发环境中测试网络代码。

阻止进出某些 Internet 主机的流量的更好方法可能是利用iptablesLinux 内核防火墙的接口。 iptables是大多数 GNU/Linux 系统的默认网络规则表。一些发行版ufw用作iptables.

如果你想使用iptables,这里有一个简单的脚本,它将DROP所有传入和传出的数据包用于 IP 地址或主机名列表,每行一个地址或主机名包含在一个名为的纯文本文件中~/blocking.txt

## Block every IP address in ~/blocking.txt
## DROP incoming packets to avoid information leak about your hosts firewall
## (HT to Conor Mancone) REJECT outgoing packets to avoid browser wait
for i in $(cat ~/blocking.txt); do
    echo "Blocking all traffic to and from $i"    
    /sbin/iptables -I INPUT -s $i -j DROP
    /sbin/iptables -I OUTPUT -d $i -j REJECT
done

样本 ~/blocking.txt

websiteiwanttoblock.com
anotherone.com
ip.add.of.net/mask

不要将您的localhostIP 地址放在此文件中。

更长的答案

虽然localhost在文件中重新分配 Internet 主机是阻止/etc/hosts不需要的 Internet 主机的常用捷径技术,但这种方法存在一些严重的安全缺陷。

传入请求

不是通过特定用户请求有意发起的传入请求。最常见的例子是网页上的广告。让我们跟踪传入的数据包...

首先,我启动wireshark. 然后,我将最大的互联网广告公司放在我的/etc/hosts文件中,其中包含以下内容:

127.0.0.1   google.com

然后在我的浏览器中禁用所有广告拦截器,导航到youtube并播放任何随机视频。

如果我过滤我的数据包,包括谷歌的 IP 地址空间:

ip.addr==172.217.0.0/16

我仍在接收来自 Google 的数据包。

这是什么意思?

这意味着恶意服务器可能会插入恶意软件,该恶意软件可能会通过仍然到达并发送到本地主机的数据包来攻击我的计算平台。通过防火墙规则使用/etc/hosts而不是丢弃或拒绝数据包是一种较差的安全措施。它不会阻止来自可能的恶意主机的传入数据包,也不会为故障排除提供有效的反馈。

传出请求

发送到localhost而不是被防火墙规则拒绝或丢弃的传出请求仍在由内核处理。/etc/hosts使用而不是防火墙时会发生一些不良操作:

  • 当传出数据包到达 localhost 时,会发生额外的处理。例如,如果主机上正在运行一个网络服务器,则发送到本地主机的数据包可能会由网络服务器处理。

  • /etc/hosts如果填充了某些域,来自传出请求的反馈可能会变得混乱。

iptables 可以处理很多规则

据一些人说:

ServerFault:iptables可以支持多少条规则

32 位机器上可能的理论限制是 3800 万条规则。但是,正如引用的帖子中所述,随着iptables规则列表的扩展,所需的内核内存也随之增加。

[...] 在寻找一种简单的操作系统级网站阻止技术时,我想到了使用 linux hosts 文件的解决方案 [...]

为了澄清,/etc/hosts只需将主机名映射到 IP 地址。带有 的条目127.0.0.1不会阻止您访问服务器,它只会让您的计算机在本地将该特定名称解析为127.0.0.1. 您和服务器仍然可以无限制地交换数据包。

如果我经常127.0.0.1用于 Web 开发目的,这是否危险?看来,至少它可能会弄乱我目前正在从事的网络开发项目?

不,解决127.0.0.1问题不会让您面临额外的危险。这是因为网站可以将其名称解析为任何 IP,包括127.0.0.1(除非 DNS 服务器阻止)。因此,如果evilpage.example想要解析为127.0.0.1,他们可以只指定相应的 DNSA记录,而不必依赖您的/etc/hosts. (另请参阅:DNS 记录指向 127.0.0.1 是否安全?

请注意,运行某些东西127.0.0.1可能会使您容易受到DNS 重新绑定攻击。

除非您的网络服务器在本地计算机 ( ) 的端口 80 或 443 上运行127.0.0.1,否则这不会影响您的网络项目。如果是这样,那么它可能是一个烦恼。如果您向 发送请求http://example.com/api/,那么它最终会向 发送请求http://127.0.0.1/api/如果您有一个名为 的资源/api/,那么它最终会收到请求,从而干扰您的应用程序。但我想强调@Arminus 提到的最重要的一点是,该/etc/hosts/文件用于将 IP 地址映射到主机名。如果要阻止特定主机,我建议安装防火墙,例如 UFW 或使用默认的 Linux 防火墙 iptables。以下是一些可帮助您入门的链接:

UFW:https ://www.linux.com/learn/introduction-uncomplicated-firewall-ufw

iptables:https ://www.howtogeek.com/177621/the-beginners-guide-to-iptables-the-linux-firewall/

如果你想使用一个不应该去任何地方的 IP 地址,你可以使用官方文档的 IP 地址

  • 192.0.2.0/24
  • 198.51.100.0/24
  • 203.0.113.0/24

它们仍然有可能到达某个地方,但应该将它们添加到不可路由的地址空间。正如其他人所指出的那样,这可能只会将您的流量路由到这些 IP 地址 - 其他答案中提到了更好的解决方案,但这些至少不会进入您的本地计算机。