Ubuntu:理解 iptables 规则以允许域名查找

Ubuntu:理解 iptables 规则以允许域名查找

我目前正在我的 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 PortDestination Port

源端口是连接开始的端口,对端口 53 的请求可以从端口 开始55231,例如,如果您的服务器执行 DNS 查询,其目标端口将是端口 53,但源端口不是。根据您的示例,您说它不起作用,这是因为这个原因,请求源端口不是 53,所以 iptables 会完成它的工作。

相反,目标端口将过滤目标端口的数据包,因此发送到端口 53 的请求将被接受,并且不会计量来自哪个端口或主机(基于您的示例)。

总之,是的,您现在允许查询服务器的端口 53,运行时您看不到任何与端口 53 的连接,可能是nslookup因为查询被发送到文件中配置的远程服务器/etc/resolv.conf

相关内容