我目前正在我的 Web 服务器 (Ubuntu 18.04) 上设置 iptables 规则。几乎所有操作都按我的预期运行,但应用于 DN 查找查询的规则除外。以下是我的理解:
- DN 查找请求发送到 DN 服务器的 53 端口(默认)
- DN 查找请求可以通过 TCP 和 UDP 协议进行
因此我制定了如下规则:
iptables -A INPUT -p tcp --sport 53 -j ACCEPT
iptables -A INPUT -p udp --sport 53 -j ACCEPT
换句话说,接受来自端口 53 的任何传入连接(假设它们是对我的服务器将发送到端口 53 的 DN 查询的响应)。但是,这不起作用。nslookup ubuntuforums.org命令超时。这是我不明白的部分:如果我添加下面的 iptables 规则,那么它就可以正常工作
iptables -A INPUT -p tcp --dport 53 -j ACCEPT
iptables -A INPUT -p udp --dport 53 -j ACCEPT
如果我没看错的话,这意味着我正在接受发送到我服务器端口 53 的传入连接。我不明白为什么需要这样做。我使用 tcpdump 查看运行时发生了什么nslookup ubuntuforums.org我看不到任何发送到我机器 53 端口的连接。显然我遗漏了一些东西,但我不知道是什么... 有人知道吗?提前致谢。
ubuntuforums.org 上的原始帖子:https://ubuntuforums.org/showthread.php?t=2409812
答案1
我假设您的服务器至少有 2 个接口:本地环回接口和以太网接口。
您应用规则的方式适用于两个接口。
当有人进行 DNS 查询时,很长一段时间内,它都是直接通过以太网接口(或用于到达 DNS 服务器的路由所使用的任何接口)。
但这只通过OUTPUT
链,而不是INPUT
(和其他一些与此不相关的内容)。
最近,发行版开始发布本地 DNS 缓存系统(dnsmasq
,,systemd-resolved
...)。
使用 Ubuntu 18.04,您拥有最新的 systemd 功能。因此,我怀疑您systemd-resolved
使用了环回接口来提供 DNS 缓存。当您使用 时nslookup
,它不会直接转到您在 中指定的服务器/etc/resolv.conf
,而是先通过systemd-resolved
。
为了允许这一点,您需要添加防火墙规则以允许环回接口的端口 53 上的 INPUT 流量。
我的建议是使用将环回接口的所有流量列入白名单iptables -I INPUT 1 -i lo -j ACCEPT
。
答案2
标志--dport --sport
分别为Source Port
和Destination Port
;
源端口是连接开始的端口,对端口 53 的请求可以从端口 开始55231
,例如,如果您的服务器执行 DNS 查询,其目标端口将是端口 53,但源端口不是。根据您的示例,您说它不起作用,这是因为这个原因,请求源端口不是 53,所以 iptables 会完成它的工作。
相反,目标端口将过滤目标端口的数据包,因此发送到端口 53 的请求将被接受,并且不会计量来自哪个端口或主机(基于您的示例)。
总之,是的,您现在允许查询服务器的端口 53,运行时您看不到任何与端口 53 的连接,可能是nslookup
因为查询被发送到文件中配置的远程服务器/etc/resolv.conf
。