linux防火墙规则核心在于理清数据包流向、匹配条件与动作逻辑,需先明确放行/拒绝策略及处理环节;iptables由Filter、nat、mangle三表及五链构成,链内规则顺序匹配且命中即止,未匹配时依默认策略处理;配置前须查规则、备份、设超时回滚。

Linux防火墙规则的核心是理解数据包流向、匹配条件和动作逻辑,不是死记命令。真正写好规则,关键在“想清楚要放行什么、拒绝什么、在哪一环处理”。下面从基础概念到实际配置,一步步讲透。
iptables基础结构:三张表+五条链
iptables不是单一工具,而是由表(table)和链(chain)组成的规则容器:
- filter表:最常用,负责过滤(ACCEPT/DROP/REJECT),含input、OUTPUT、FORWARD链
- nat表:做地址转换(SNAT/DNAT/端口映射),主要用PREROUTING、POSTROUTING、OUTPUT链
- mangle表:改写数据包头(如TTL、QoS标记),较少日常使用
每条链按顺序逐条匹配,一旦命中即执行动作并停止后续匹配(除非用-j跳转)。默认策略(policy)决定未匹配时的行为,比如iptables -P INPUT DROP表示INPUT链默认丢弃所有包——这很安全,但必须先放通ssh等必要流量,否则可能锁死远程连接。
写规则前必做的三件事
别急着敲命令,先确认环境、理清需求、留好退路:
- 查当前规则:
iptables -L -n -v(-n禁dns解析,-v看包/字节计数);更清晰用iptables-save - 备份现有规则:
iptables-save > /root/iptables-backup-$(date +%F).rules - 设置超时自动回滚(防误锁):
(sleep 300; iptables-restore ,5分钟后若没手动确认,自动恢复
典型场景规则写法(附说明)
以下规则均基于filter表,假设你已设iptables -P INPUT DROP,需显式放行:
- 允许本地回环通信:
iptables -A INPUT -i lo -j ACCEPT(-i指定入接口,lo是loopback) - 允许已建立的连接返回流量:
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT(现代内核推荐用-m conntrack --ctstate替代state模块) - 开放SSH(仅限某IP段):
iptables -A INPUT -p tcp --dport 22 -s 192.168.1.0/24 -j ACCEPT(-s指定源IP,–dport目标端口) - 限制SSH暴力尝试:
iptables -A INPUT -p tcp --dport 22 -m recent --name ssh --rcheck --seconds 60 --hitcount 4 -j REJECT,再加一行-A INPUT -p tcp --dport 22 -m recent --name ssh --set -j ACCEPT(首次访问记录,1分钟内超3次就拒绝) - 拒绝特定IP扫描行为:
iptables -A INPUT -s 203.0.113.45 -j DROP(DROP静默丢弃,REJECT会发RST/ICMP提示)
进阶技巧:持久化、日志与调试
重启后规则消失?被拒绝却不知原因?这些是真实运维痛点:
- 保存规则到文件并开机加载:debian/ubuntu用
iptables-persistent,运行netfilter-persistent save;centos/RHEL 7+用service iptables save或直接写入/etc/sysconfig/iptables - 给规则加日志便于排查:
iptables -A INPUT -p tcp --dport 80 -j LOG --log-prefix "http-DENIED: ",日志出现在/var/log/messages或journalctl -k | grep HTTP-DENIED - 用tcpdump辅助验证:比如
tcpdump -i eth0 port 22看SSH包是否真被拦截,再对比iptables计数器变化(-v输出里的pkts字段) - 注意规则顺序!:-A是追加到末尾,-I是插入开头。想让某规则优先生效,用
iptables -I INPUT 1 ...插到第1位
基本上就这些。规则不在多,在准;不求炫技,但求可读、可维护、可回滚。真正上线前,在测试机上模拟攻击(如用nmap扫端口、hydra试爆SSH)、关掉再开网络服务验证连通性,比背一百条命令都管用。