![iptables、ICMP 和相关内容](https://linux22.com/image/641765/iptables%E3%80%81ICMP%20%E5%92%8C%E7%9B%B8%E5%85%B3%E5%86%85%E5%AE%B9.png)
我正在使用以下简单的 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
条款已经接受它们?
答案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-request”是唯一有助于通信的重要有用消息。其余消息(包括“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-request”,还会阻止每秒超过 30 个数据包的 ping 泛洪。您要添加的任何其他内容都必须明确接受,因为只要通过允许其进入来建立连接,RELATED 子句就不会接收它们。