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

我设置我的服务器拒绝所有传入的UDP数据包,以防止UDP洪水。 不过,我被告知,因为我使用我自己的域名和服务器为我的域名服务器,这可能会导致一些问题。 我怎样才能解决这个问题?

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

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

你正在谈论的stream量是UDP。 UDP是无状态的。 这意味着有兴趣使连接饱和的人可以将数据包发送到您的地址,即使您只是丢弃它们。 尽pipe如此,你也许可以在iptables最近的比赛中做一些半实用的工作,只允许有限的stream量实际上被系统接受和处理。 埃文有一个在这里使用SSH的例子。 我们可能必须看到您的整个防火墙规则集,以告诉您必须添加哪些规则。

如果你对你的系统有严重的拒绝服务攻击,你几乎肯定会需要你的ISP来帮助你,试图用VPS上的基于主机的防火墙来处理洪水真的不是很有用。

如果您还没有,请考虑在完全不同的networking上为您的区域设置一些辅助DNS服务器。

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

最高限制不应该太高,否则您的服务器将无法从服务器内部parsing外部域(例如当您执行“ping google.com”时)。 在一个linux操作系统上,32768是第一个短暂端口(akadynamic端口),最高为61000的sockets。因此,32767是静态分配端口的最高端口。 这是唯一的,如果不使用你的服务器作为DNSparsing器又名DNScaching又名服务器与/etc/resolv.conf指向名称服务器127.0.0.1或:: 1

这是一个tcpdump的例子:

23:10:13.315832 IP bbbb34507 > aaaa53: 23674% [1au] A? whitehouse.gov. (38) 23:10:13.377619 IP aaaa53 > bbbb34507: 23674*- 1/2/3 A 172.230.122.69(122) 
  1. bbbb从端口34507请求nameserver aaaa给53端口上的whitehouse.gov Alogging
  2. 来自端口53的aaaa将bbbb应答到端口34507

通常,为了在你的linux上为UDP和TCPfind你的本地dynamic(也称为临时或私有)端口范围:

  cat /proc/sys/net/ipv4/ip_local_port_range 

但是,它只适用于不包含DNSparsing器的服务器(例如,将/etc/resolv.conf指向8.8.8.8时)。

服务器不是DNSparsing器:

  -A INPUT -p udp -m udp --dport 53 -j ACCEPT -A INPUT -p udp -m udp --dport 0:32767 -j DROP 

服务器是一个DNSparsing器:

 -A INPUT -p udp -m udp --dport 53 -j ACCEPT -A INPUT -p udp -m udp --dport 0:1023 -j DROP 

如果您想要托pipe您自己的DNSparsing器,则需要考虑这一点,以parsing所有域名。

最好的办法是自己检查一下:

您可以使用监视发送端口

 tcpdump udp and port 53 and not dst host *yourserveripaddress* 

然后看发送端口,并尝试find最低的数字。 这个最低的数字应该不低于–dport 0:xxxx中的端口号xxxx,否则你会阻止或减慢你的DNS请求。

你真的需要让互联网上的陌生人对你的服务器运行DNS查询吗? 我怀疑你只需要确保你的防火墙允许你的服务器发出DNS请求。

通过防火墙,您可以先阻止所有内容,然后再打开端口/服务/协议的特定组合,并将其限制在IP地址(范围)内,这样就可以非常精确/详细地进行设置。

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

这可以说更广泛: 我怎么能拒绝所有的stream量,我没有启动Linux的netfilter?

答案只是2行:

 iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -j DROP 

考虑到你不想过滤环回stream量来节省一些CPU周期,你可以为它添加exception。

如果OTOH在同一台计算机上有DNS服务器,并且您的qn可以更精确地表述为“ 如何拒绝除DNS-server的外部查询之外的所有传入UDP通信 ”,则可以使用相同的2行基址并添加另一个允许DNSstream量:

 iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -p udp --dport 53 -j ACCEPT -m comment --comment "we serve DNS" iptables -A INPUT -p tcp --dport 53 -j ACCEPT -m comment --comment "DNS uses TCP too sometimes" iptables -A INPUT -j DROP 

请注意,除了第一行之外,通常不需要为任何-m state指定任何-m state ,因为第一行是一个快捷方式,允许任何合法stream量在其导频数据包被允许进入的情况下继续。

其他通知

@ Zoredache recent的build议根本不适用。 recent有非常有限的用例范围,因为它没有使用高效的数据结构,而是列表和哈希,没有树,没有。 默认情况下,每个列表只能记住100个可以扩展的IP地址,但是散列algorithm对于通过search来说并不是非常有效。