Linux防火墙需按TCP有连接、UDP无连接特性差异化设计:TCP依赖conntrack状态(NEW/ESTABLISHED),UDP须用ctstate或速率限制;UDP更需防反射攻击,禁用REJECT改用DROP,并配合hashlimit限流。

Linux防火墙(如iptables/nftables)对TCP和UDP协议的处理逻辑存在本质差异,根源在于二者协议特性不同——TCP有连接状态,UDP无连接。安全策略必须据此分别设计,否则容易出现放行漏洞或误拦截。
基于连接状态的规则设计差异
TCP通信具备明确的连接生命周期(SYN→ESTABLISHED→FIN),防火墙可依赖conntrack模块精准识别连接状态:
- 允许新连接:-m state --state NEW -p tcp --dport 22 -j ACCEPT
- 仅放行已建立连接:-m state --state ESTABLISHED,RELATED -j ACCEPT
- UDP无法使用--state NEW判断“首次请求”,因为没有SYN握手;所有UDP包默认被视为“NEW”,需改用--ctstate NEW,ESTABLISHED或直接按端口/频率控制
端口与流量控制策略不同
UDP无连接特性使其极易被用于反射放大攻击(如DNS、NTP洪水),因此规则需更严格:
- TCP服务(如HTTP/HTTPS)通常只需放行目标端口(80/443),并依赖三次握手自然限流
- UDP服务(如DNS 53端口)必须叠加速率限制:-p udp --dport 53 -m limit --limit 10/sec --limit-burst 20 -j ACCEPT
- 禁止非必要UDP端口泛洪:-p udp -m multiport --dports 137,138,161,162 -j DROP
ICMP与错误响应的处理区别
UDP在收到不可达报文(如Port Unreachable)时不会重传,但该ICMP响应可能被攻击者利用:
- TCP连接失败时,内核通常不主动发ICMP错误;防火墙可安全启用--reject-with tcp-reset
- UDP场景下,-j REJECT会触发ICMP port-unreachable响应,可能成为反射攻击跳板;高防环境应统一使用-j DROP替代
- 若需调试,可临时添加:-p icmp --icmp-type port-unreachable -j LOG --log-prefix "UDP-ICMP-DROP: "
高并发与缓冲区相关的隐性风险
UDP接收缓冲区满会导致静默丢包,而防火墙本身不感知该问题:
- 需同步调优内核参数:net.core.rmem_max=16777216,避免因缓冲区溢出造成业务层误判为网络中断
- TCP连接数受net.ipv4.ip_local_port_range和net.ipv4.tcp_fin_timeout影响,可通过connlimit模块限制单IP连接数:-m connlimit --connlimit-above 100 -j DROP
- UDP无连接数概念,但可结合hashlimit模块限制单IP单位时间请求数:-p udp -m hashlimit --hashlimit-above 50/sec --hashlimit-burst 100 --hashlimit-mode srcip --hashlimit-name udp_flood -j DROP
不复杂但容易忽略









