为什么systemd-resolved
从systemd
版本 219 开始侦听一个随机 UDP 端口?
我的一台机器监听端口58557
(CentOS 7,systemd
版本 219)。
sudo netstat -tunlp|grep -P '^Active|^Proto|systemd'
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
udp 0 0 0.0.0.0:58557 0.0.0.0:* 372/systemd-resolve
另一台机器侦听端口52010
(也是systemd
版本 219 的 CentOS 7)。
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
udp 768 0 0.0.0.0:52010 0.0.0.0:* 398/systemd-resolve
一旦我重新启动机器,systemd-resolved
就会监听另一个 UDP 端口。
我有第三台机器,它运行systemd
版本 234 的 Fedora 27。这里,systemd
确实不是打开随机 UDP 端口。
附带说明一下,我在和LLMNR
中都禁用了,所以这不可能是这样。另外,将打开端口 5355。/etc/systemd/network/20-eth0.network
/etc/systemd/network/20-eth0.network
LLMNR
$ grep LLMNR /etc/systemd/resolved.conf
LLMNR=no
$ grep LLMNR /etc/systemd/network/20-eth0.network
LLMNR=no
答案1
正如我在对该问题的评论中提到的,我systemd-resolved
在 strace 中运行,而watch[ing] netstat -tunlp
.我注意到只有当我发出第一个解析 DNS 名称的请求时,该端口才会打开。
我使用 捕获了流量tcpdump -i eth0 -nn -w capture_file
,记下我看到的端口netstat
并使用 Wireshark 查看输出。 Wireshark 中的过滤器很简单:(udp.port eq 37078
使用前面提到的 down udp 端口)。
我可以确认正在打开的UDP端口systemd-resolved
是用于与DNS服务器通信的端口。