我正在使用以下简单的iptables规则接受相关的数据包:
-A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
我让ICMP 回声请求通过这个其他的规则:
-A INPUT -p icmp --icmp-type echo-request -j ACCEPT
我是否应该明确地添加任何东西来接收“有用的”ICMP消息,如destination-unreachable , time-exceeded和parameter-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报告的其他州是:
您可以使用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,受其他答案和以下来源的启发:
使用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子句只要连接成立就不会收到它们。