iptables、ICMP 和相关内容

iptables、ICMP 和相关内容

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

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

我正在让 ICMP回显请求遵循另一条规则:

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

我是否应该明确添加任何内容来接收“有用的”ICMP 消息(如destination-unreachabletime-exceeded和)parameter-problem,或者该RELATED条款已经接受它们?

答案1

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

ICMP 的另一个非常重要的部分是它用于告诉主机特定 UDP 和 TCP 连接或连接尝试发生了什么。出于这个简单的原因,ICMP 回复通常会被识别为与原始连接或连接尝试相关。一个简单的例子是 ICMP 主机不可达或 ICMP 网络不可达。如果我们的主机尝试与其他主机建立不成功的连接,但相关网络或主机可能已关闭,则应始终将这些回复回主机,因此尝试访问相关站点的最后一个路由器将回复 ICMP 消息告诉我们此事。在这种情况下,ICMP 回复被视为相关数据包

答案2

RELATED 规则将默认处理相关的 ICMP 消息。iptables 手册页,在与连接跟踪http://linux.die.net/man/8/iptables):

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

conntrack 报告的其他状态有:

  • INVALID 表示数据包与任何已知连接均不相关
  • ESTABLISHED 表示该数据包与一个已在两个方向上看到数据包的连接相关联
  • NEW 表示数据包已启动新连接,或与尚未在两个方向上看到数据包的连接相关联
  • SNAT 虚拟状态,如果原始源地址与回复目标不同则匹配
  • DNAT 虚拟状态,如果原始目的地与回复源不同则匹配

您可以使用该包检查和管理 conntrack 表conntrack

$ sudo conntrack -L

答案3

一般来说,过滤或阻止 icmp 是一个非常糟糕的主意,通常要过滤的 icmp 的唯一“有效”位是 echo 请求,以便在简单扫描中“出现”。

但是如果你想要明确允许它的某些部分,那么你至少会缺少两个非常重要的部分,即需要碎片化和源抑制:

-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。

答案4

ICMP 是一种非常重要的连接协议。“echo-r​​equest”是唯一有助于通信的重要有用消息。其余消息(包括“destination-unreachable”)都可以安全阻止,特别是当您运行的应用程序收到大量未知点击时。

你最好这样做,

-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

这不仅会接受“echo-r​​equest”,还会阻止每秒超过 30 个数据包的 ping 泛洪。您要添加的任何其他内容都必须明确接受,因为只要通过允许其进入来建立连接,RELATED 子句就不会接收它们。

相关内容