iptables,ICMP和RELATED

我正在使用以下简单的iptables规则接受相关的数据包:

-A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT 

我让ICMP 回声请求通过这个其他的规则:

 -A INPUT -p icmp --icmp-type echo-request -j ACCEPT 

我是否应该明确地添加任何东西来接收“有用的”ICMP消息,如destination-unreachabletime-exceededparameter-problem ,或者RELATED子句已经接受它们了?

http://www.linuxtopia.org/Linux_Firewall_iptables/x1571.html

ICMP的另一个非常重要的部分是它用来告诉主机发生了什么特定的UDP和TCP连接或连接尝试。 出于这个简单的原因,ICMP回复将经常被认为是与原始连接或连接尝试相关的。 一个简单的例子是ICMP主机不可达或ICMPnetworking不可达。 如果连接到其他主机的连接不成功,但是这些networking或主机可能被closures,那么这些连接应该总是被引发回到我们的主机上,因此最后一个尝试到达相关站点的路由器会回复一个ICMP消息我们了解它。 在这种情况下,ICMP回复被认为是RELATED包

RELATED规则将默认处理关联的ICMP消息。 从iptables的手册页 ,在与conntrack相关的部分( http://linux.die.net/man/8/iptables ):

RELATED表示数据包正在启动一个新的连接,但与现有连接(如FTP数据传输)或ICMP错误相关联

conntrack报告的其他州是:

  • INVALID意味着数据包与没有已知的连接关联
  • ESTABLISHED表示数据包与在两个方向上看到数据包的连接相关联
  • NEW表示数据包已经启动了一个新的连接,或者是与在两个方向上没有看到数据包的连接有关
  • SNAT虚拟状态,如果原始源地址与回复目标不同,则匹配
  • DNAT虚拟状态,如果原始目标与回复源不同,则匹配

您可以使用conntrack软件包检查和pipe理conntrack表。

 $ sudo conntrack -L 

一般来说,过滤或阻止icmp是一个非常糟糕的主意,通常icmp唯一的“有效”过滤位是回显请求,在初始扫描中“出现”。

但是如果你想明确地允许它的一部分,你至less错过了两个非常重要的位,碎片需要&Source Quench:

 -A INPUT -p icmp --icmp-type fragmentation-needed -m state --state NEW -j ACCEPT -A INPUT -p icmp --icmp-type source-quench -m state --state NEW -j ACCEPT 

让我再次告诉你,过滤icmp是一个坏主意,将掩盖问题,使之难以发现。

这是DF(不分段)和自动PTMU发现所需的分段问题,并导致站点无法访问,因为中间防火墙/路由器丢弃通告端点的icmp数据包以降低MTU。

我会添加自己的答案来提供我的最终configuration,受其他答案和以下来源的启发:

  1. IETF过期草案,有用的表格显示哪些ICMPtypes允许,拒绝或限制速度;
  2. 另一个 iptables和Cisco IOS的​​最小行数的页面 ;
  3. 使用RELATED 的第三个资源 :

     iptables -P INPUT DROP iptables -A INPUT -p icmp --fragment -j DROP iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT iptables -A INPUT -p icmp --icmp-type fragmentation-needed -j ACCEPT iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT 

ICMP是一个非常重要的连接协议。 “回声请求”是帮助沟通的唯一重要的有用信息。 如果你正在运行的应用程序收到大量未知的命中,其中包括“目标无法访问”的其余部分是安全的,特别是阻止。

你最好用这样的东西,

 -A INPUT -p icmp --icmp-type echo-request -m recent --set -A INPUT -p icmp --icmp-type echo-request -m recent --update --seconds 1 --hitcount 30 -j DROP -A INPUT -p icmp --icmp-type echo-request -j ACCEPT -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT -A OUTPUT -p icmp --icmp-type destination-unreachable -j DROP -A INPUT -p icmp -j DROP 

这不仅可以接受“回应请求”,而且可以阻止大于30包/秒的ping泛洪。 任何你想添加的东西都必须被明确接受,因为RELATED子句只要连接成立就不会收到它们。