除了 DNS 查找之外,如何拒绝所有传入的 UDP 数据包?

Rob*_*Rob 3 iptables udp

我将服务器设置为拒绝所有传入的 UDP 数据包,以防止 UDP 泛洪。但是,有人告诉我,因为我将自己的域和服务器用于名称服务器,所以这可能会导致一些问题。我怎样才能解决这个问题?

我的防火墙是 iptables,我的发行版是 CentOS5.5。

Zor*_*che 5

如果您遵循标准的安全实践,那么您的默认防火墙策略将是阻止一切。如果您想允许传入的 DNS 请求,您所要做的就是编写一个规则来允许 tcp 和 udp 流量到端口 53。

你所说的流量是UDP。UDP 是无状态的。这意味着有兴趣使您的连接饱和的人可以将数据包发送到您的地址,即使您只是丢弃它们。您仍然可以对 iptables 最近的匹配做一些半有用的事情,只允许系统实际接受和处理有限的流量。Evan 有一个在此处用于 SSH的示例。我们可能需要查看您的整个防火墙规则集,以告诉您必须添加哪些规则。

如果您的系统受到严重的 DoS 攻击,您几乎肯定需要您的 ISP 来帮助您,尝试在 VPS 上使用基于主机的防火墙来处理洪水真的不会很有用。

如果您还没有它,您应该考虑在完全不同的网络上为您的区域设置几个辅助 DNS 服务器。

  • 是的。所以你的选择是:1. 不要运行你自己的 DNS 服务器或 2. 承担风险。 (2认同)

Nic*_*net 5

在 Iptables 中,接受传入端口 53 的 UDP 流量并拒绝临时端口端口范围内的所有内容。

最高限制不应太高,否则您的服务器将无法从服务器内部解析外部域(例如,当您执行“ping google.com”时)。在 Linux 操作系统上,32768 是最多 61000 个套接字的第一个临时端口(也称为动态端口)。因此,32767 是静态分配端口的最高端口。仅当不使用您的服务器作为 DNS 解析器(又名 DNS 缓存)且 /etc/resolv.conf 指向名称服务器 127.0.0.1 或 ::1 时,这才是正确的

这是一个 tcpdump 示例:

 23:10:13.315832 IP b.b.b.b.34507 > a.a.a.a.53: 23674% [1au] A? whitehouse.gov. (38)
 23:10:13.377619 IP a.a.a.a.53 > b.b.b.b.34507: 23674*- 1/2/3 A 172.230.122.69(122)
Run Code Online (Sandbox Code Playgroud)
  1. bbbb 从端口 34507 请求名称服务器 aaaa 为端口 53 上的 Whitehouse.gov 提供 A 记录
  2. 来自端口 53 的 aaaa 回答 bbbb 到端口 34507

通常,要在 Linux 上查找 UDP 和 TCP 的本地动态(也称为临时或私有)端口范围:

 cat /proc/sys/net/ipv4/ip_local_port_range
Run Code Online (Sandbox Code Playgroud)

但是,它仅适用于不托管 DNS 解析器的服务器(例如,当您将 /etc/resolv.conf 指向 8.8.8.8 时)。

服务器不是 DNS 解析器:

 -A INPUT -p udp -m udp --dport 53 -j ACCEPT
 -A INPUT -p udp -m udp --dport 0:32767 -j DROP
Run Code Online (Sandbox Code Playgroud)

服务器是 DNS 解析器:

-A INPUT -p udp -m udp --dport 53 -j ACCEPT
-A INPUT -p udp -m udp --dport 0:1023 -j DROP
Run Code Online (Sandbox Code Playgroud)

如果您想托管自己的 DNS 解析器来解析所有域名,则应考虑到这一点。

最好自己检查一下:

您可以使用以下方式监控发送端口

tcpdump udp and port 53 and not dst host *yourserveripaddress*
Run Code Online (Sandbox Code Playgroud)

然后查看发送端口并尝试找到最小的端口号。这个最低数字不应低于 --dport 0:xxxx 中的端口号 xxxx,否则您会阻止或减慢 DNS 请求。