iptables本质上是Linux内核 Netfilter 框架在用户空间的管理入口,依托四张表(raw、mangle、nat、filter)和五条链(PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING)这一经典架构,实现数据包过滤、NAT地址转换以及流量控制等核心功能;它的规则处理机制也非常清晰:按照顺序逐条匹配,一旦命中便立即执行对应动作。

明确目标:先想清楚要拦什么、放什么
在开始编写高级防火墙规则之前,建议先把以下三个核心问题理顺,否则规则越写越多,后期维护会越来越混乱:
– 这条规则究竟用于管理入站流量(外部访问你的服务器)、出站流量(服务器主动访问外部),还是转发流量(你的设备充当网关或路由节点)?
– 匹配条件应该如何设置?是依据IP地址、端口、协议、连接状态,还是要进一步细化,结合流量内容特征进行判断,例如HTTP User-Agent、SSH版本等?
– 规则命中后要执行什么动作?是否需要记录日志、做访问限速、跳转到自定义链处理,还是直接执行DROP或REJECT?
Linux iptables:按链顺序+条件组合写真实规则
日常服务器安全加固通常集中在 filter 表的 INPUT 链,但在实际生产环境中,高级防火墙配置往往需要跨表、跨链协同完成:
- 封禁特定IP段并保留日志:
iptables -I INPUT -s 203.0.113.0/24 -j LOG --log-prefix "BLOCKED-203:" --log-level 4iptables -I INPUT -s 203.0.113.0/24 -j DROP(注意:-I 表示插入到链首,确保日志规则先于DROP规则触发) - 只允许指定IP访问SSH,并限制连接频率:
iptables -A INPUT -p tcp --dport 50022 -s 192.168.10.50 -m state --state NEW -m limit --limit 3/min --limit-burst 5 -j ACCEPTiptables -A INPUT -p tcp --dport 50022 -j DROP - 拦截已建立连接中的异常请求行为(例如SYN Flood):
iptables -A INPUT -p tcp --syn -m connlimit --connlimit-above 50 --connlimit-mask 32 -j DROP - 跳过连接跟踪以提升UDP服务性能(例如DNS或VoIP):
iptables -t raw -A PREROUTING -p udp --dport 53 -j NOTRACKiptables -A INPUT -p udp --dport 53 -j ACCEPT
Windows Defender 防火墙:靠作用域+配置文件精准生效
在Windows Defender 防火墙中,图形界面虽然直观,但配置高级过滤规则时最容易遗漏以下三个关键点:
- 方向必须选对:拦截外部扫描使用入站规则;防止本机连接恶意C2服务器则应使用出站规则
- 作用域重点填写“远程地址”:如果要封锁192.168.2.100,应填写在“远程IP地址”中,而不是本地IP
- 配置文件要全部按需勾选:例如当前网络环境是Wi-Fi(专用),但规则仅启用了“域”配置文件,那么该规则实际上不会生效
- 批量封禁IP地址更稳妥的方式是直接使用命令:
netsh advfirewall firewall add rule name="Block-Bad-ASN" dir=in action=block protocol=any remoteip=198.51.100.0/24,203.0.113.0/24
firewalld 直接规则:混用富规则与底层iptables逻辑
这种方式适合既需要细粒度控制,又不希望完全绕过 firewalld 统一管理的使用场景:
- 创建黑名单链并绑定到PREROUTING:
firewall-cmd --direct --permanent --add-chain ipv4 filter blacklist
firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 -s 192.168.5.0/24 -j blacklist - 在blacklist链中增加日志、限速与丢弃动作:
firewall-cmd --direct --permanent --add-rule ipv4 filter blacklist 0 -m limit --limit 5/sec -j LOG --log-prefix "BLACKLIST:"
firewall-cmd --direct --permanent --add-rule ipv4 filter blacklist 1 -j DROP
firewall-cmd --reload
