我们来系统地讲解下 iptables 规则的生效原理,包括 匹配顺序、优先级、DROP 和 REJECT 的区别 等方面。
一、iptables 匹配规则的生效原理(顺序决定一切)
1. iptables 的规则是顺序匹配、先匹配先执行、匹配后就停止
-
每个
iptables
表(如filter
,nat
,mangle
)中有若干链(chain),如INPUT
,OUTPUT
,FORWARD
。 -
每条链里可以添加多条规则,它们是有顺序的,从上到下依次检查。
-
一旦有一条规则匹配成功(匹配了条件,比如 IP、端口、协议等),并执行了某个动作(ACCEPT、DROP、REJECT等)后,就不会再往下执行链中的其他规则。
举例:
iptables -A INPUT -p tcp --dport 80 -j DROP
iptables -A INPUT -p tcp --dport 80 -s 192.168.1.100 -j ACCEPT
-
虽然第二条规则允许
192.168.1.100
访问 80 端口,但由于第一条 DROP 已经匹配了所有访问 80 端口的请求(包括来自 192.168.1.100 的),所以第二条规则永远不会执行。 -
结论:先 DROP,后 ACCEPT 的话,ACCEPT 永远无效。
如果你想“有条件地允许”,应该先写 ACCEPT,再写 DROP。
# 正确写法:先允许特定 IP,再阻止所有其他
iptables -A INPUT -p tcp --dport 80 -s 192.168.1.100 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j DROP
二、DROP 和 REJECT 的区别
比较项 | DROP | REJECT |
---|---|---|
行为 | 直接丢弃数据包,不回复任何信息 | 丢弃数据包,并返回拒绝信息(如 ICMP 或 TCP RST) |
对客户端表现 | 客户端会一直等待超时 | 客户端立即收到连接被拒绝的反馈 |
安全隐蔽性 | 更隐蔽,攻击者无法确定端口是否存在 | 不隐蔽,攻击者知道端口拒绝连接 |
推荐用途 | 更安全,对不明来源的 IP 做防御 | 用于明确拒绝某些连接或做调试用 |
示例:
-
DROP
:就像对方敲门你不理他,对方不知道你家有没有人。 -
REJECT
:你直接告诉对方“别敲了,我不让你进”。
三、规则插入方式 -A
vs -I
命令 | 说明 |
---|---|
-A | 追加规则(append),加到链尾部 |
-I | 插入规则(insert),默认加在链开头或指定位置 |
所以如果你用 -A
添加规则,要特别注意顺序是否会让后续规则失效。
四、默认策略(默认行为)
可以为每个链设置默认策略,如:
iptables -P INPUT DROP
-
如果某个数据包没有被任何规则匹配到,那就走默认策略。
-
常见的做法:默认 DROP,添加具体的 ACCEPT 规则。
五、小结
场景 | 行为说明 |
---|---|
同端口,先 DROP 后 ACCEPT | DROP 生效,ACCEPT 无效 |
同端口,先 ACCEPT 后 DROP | 只要满足 ACCEPT 条件就不会被 DROP 拦截 |
DROP vs REJECT | DROP 更隐蔽;REJECT 更明确但易暴露服务 |
没有匹配规则 | 看链的默认策略,如默认 DROP 就会直接丢弃 |