使用systemd-resolved
如何阻止、路由或解析域名到黑洞或无处可寻的地址。子域也有奖励积分。
我尝试了单个域/etc/hosts
:
127.0.0.1 google.com
::1 google.com
我也尝试过/etc/systemd/network/100-blocked.network
:
[Match]
Name=wlp113s0
[Network]
Description="Just block the domain, and sub domains"
DNS=127.0.0.255
DNS=::1
[Resolve]
Domains=google.com
sudo systemd-resolve --status
:
Link 3 (wlp113s0)
Current Scopes: DNS
LLMNR setting: yes
MulticastDNS setting: no
DNSSEC setting: no
DNSSEC supported: no
DNS Servers: 127.0.0.255
::1
2001:4888:3a:ff00:304:d::
2001:4888:39:ff00:308:d::
例如使用dnsmasq
我能够做到:
server=192.168.43.1
address=/google.com/0.0.0.0
# a very long list of "address=/domain/0"
有关的:
答案1
添加一个条目/etc/hosts
应该可以工作,并且在我的测试中它按预期工作。我的测试是在 Fedora Rawhide 上进行的,版本为 systemd-239-9.git9f3aed1.fc30.x86_64,所以这是 systemd 的最新快照,也许旧版本不会像预期的那样工作......
在将条目添加到之前/etc/hosts
:
1)解析查询:
$ resolvectl query google.com
google.com: 172.217.6.78
-- Information acquired via protocol DNS in 1.4ms.
-- Data is authenticated: no
2)平:
$ ping -c1 google.com
PING google.com (172.217.6.78) 56(84) bytes of data.
64 bytes from sfo07s17-in-f78.1e100.net (172.217.6.78): icmp_seq=1 ttl=54 time=12.4 ms
--- google.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 12.435/12.435/12.435/0.000 ms
3)卷曲:
$ curl http://google.com
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="http://www.google.com/">here</A>.
</BODY></HTML>
添加条目后,在这种情况下/etc/hosts
看起来像这样:
$ cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
127.0.0.1 google.com
::1 google.com
测试表明阻塞有效:
1)解析查询:
$ resolvectl query google.com
google.com: 127.0.0.1
::1
-- Information acquired via protocol DNS in 1.8ms.
-- Data is authenticated: yes
2)平:
$ ping -c1 google.com
PING google.com(localhost (::1)) 56 data bytes
64 bytes from localhost (::1): icmp_seq=1 ttl=64 time=0.613 ms
--- google.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.613/0.613/0.613/0.000 ms
3)卷曲:
$ curl http://google.com
curl: (7) Failed to connect to google.com port 80: Connection refused
所以这个区块似乎正在发挥作用。
我预计这会起作用,因为最近在针对 systemd 的问题中提出了这一点。问题#9718讨论了向 中添加数百万个条目/etc/hosts
,它有一个用例,那就是将域列入黑名单,例如此处。
请注意,这里有很多移动部件,因此在解决此问题时考虑这些部件很重要。
我的/etc/systemd/resolved.conf
没有覆盖配置,所有条目都被注释掉,网络设置使用带有 DHCP 的 systemd-networkd,也没有覆盖。
输出resolvectl status
包括:
Global
LLMNR setting: yes
MulticastDNS setting: yes
DNSOverTLS setting: no
DNSSEC setting: allow-downgrade
DNSSEC supported: no
Fallback DNS Servers: 8.8.8.8
8.8.4.4
2001:4860:4860::8888
2001:4860:4860::8844
Link 2 (ens33)
Current Scopes: DNS LLMNR/IPv4 LLMNR/IPv6
LLMNR setting: yes
MulticastDNS setting: no
DNSOverTLS setting: no
DNSSEC setting: allow-downgrade
DNSSEC supported: no
/etc/resolv.conf
使用存根解析器的配置:
$ ls -l /etc/resolv.conf
lrwxrwxrwx. 1 root root 39 Nov 7 22:08 /etc/resolv.conf -> ../run/systemd/resolve/stub-resolv.conf
$ grep '^[^#]' /etc/resolv.conf
nameserver 127.0.0.53
并且 nsswitch.conf 配置为使用nss 解析(8)根据其手册页的建议:
$ grep ^hosts: /etc/nsswitch.conf
hosts: files resolve [!UNAVAIL=return] dns myhostname
如果仍然无法使其工作,您可能需要检查系统中的这些设置并确认它们都配置正确。或者,至少,在此处发布您当前的配置(以及 Linux 发行版和 systemd 版本)以帮助诊断它可能不适合您的原因。
答案2
我想为此目的你可以修改你的/etc/nsswitch.conf
。参数。此文件中的 host 向您显示 systemd-resolved 用于按名称获取主机的源。所以你可以这样修改它:hosts: files [!NOTFOUND=return] dns
.
files - 本地文件,例如 /etc/hosts 和 /etc/passwd
dns - 互联网域名系统
在这种情况下,systemd-resolved 首先将用于/etc/hosts
通过名称获取主机。部分!NOTFOUND=return
意味着如果在 systemd-resolved 中未找到名称,/etc/hosts
将尝试使用dns
.