这篇文章上次修改于 2354 天前,可能其部分内容已经发生变化,如有疑问可询问作者。

iptables 结构:

五链:

链的作用:容纳各种防火墙规则,相当于容器
链的分类依据:处理数据包的不同时机
系统默认自带的5种规则链:
INPUT:处理入站数据包
OUTPUT:处理出站数据包
FORWARD:处理转发数据包
POSTROUTING:在进行路由选择后处理数据包(出站过滤)
PREROUTING:在进行路由选择前处理数据包(入站过滤)
注:POSTROUTING、PREROUTING在做NAT时所使用

四表:

表的划分依据:和链相似,按功能进行划分
默认包括4个规则表:

raw表:包含了PREROUTINGOUTPUT

在这里进行跟踪。

mangle表:包含了:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING

在这里做标记。

nat表:包含了:PREROUTING,INPUT,OUTPUT,POSTROUTING.

在这里进行ip或端口修改。

filter表:包含了INPUTFORWARDOUTPUT.

在这里进行过滤数据。

(默认使用filter。raw:优先级最高,设置raw时一般是为了不再让iptables做数据包的链接跟踪处理,提高性能)

状态

4大包状态:INVALID,ESTABLISHED,NEW和RELATED

动作

处理动作除了 ACCEPT、REJECT、DROP、REDIRECT 和 MASQUERADE 以外,还多出 LOG、ULOG、DNAT、SNAT、MIRROR、QUEUE、RETURN、TOS、TTL、MARK 等

包流程

iptables和策略路由类似,先链后表,在链路上分别顺序查表做匹配.
规则表之间的顺序:raw→mangle→nat→filter,即先做状态跟踪→在做标记→在做修改源目IP或端口→在做是否过滤
规则链之间的顺序:
入站:PREROUTING→INPUT 路由前发现是自己的,直接进站
出站:OUTPUT→POSTROUTING
转发:PREOUTING→FORWARD→POSTROUTING
注意:PREROUTING和POSTROUTING是最外围,规则链是靠时机分的,分为了入站,出站,转发三个时机

规则链内的匹配顺序:
按顺序依次检查,匹配即停止(LOG策略外)
若找不到相匹配规则,按该链的默认策略处理

以本机为目标地址的包:

入站:数据包发来,路由前,先做跟踪,再做标记,修改,查看路由,如果是发往本机的直接往上走,进站前标记,然后出站过滤
出站:出站和路由后,指的是最上面的路由选择,本机选择之后先经过跟踪→标记→修改→是否过滤,出站之后是mangle表的路由后→nat表的路由.

PREROUTING(raw,mangle,nat,filter)
POSTROUTING(raw,mangle,nat,filer)

路由转发包:

转发:数据进来以后,经过路由前raw、mangle、nat,路由前完成之后进行选择,发现此数据是需要发到别的地方,非本地,通过forward,经过mangle的forward,filter的forward,还要经过路由后标记、修改IP及端口,结束

PREROUTING(raw,mangle,nat,filter)
FORWARD(mangle,filter)
POSTROUTING(raw,mangle,nat,filer)
tables_traverse.jpg
iptables-guides.png

dnat/snat

NAT.jpg
SNAT.jpg
SNAT_1.jpg

iptables -t nat -A POSTROUTING -d 192.168.0.101 -j SNAT --to 192.168.0.1

DNAT.jpg
DNAT_1.jpg

iptables -t nat -A PREROUTING -d 202.202.202.1 -j DNAT --to-destination 192.168.0.101

参考
https://www.frozentux.net/iptables-tutorial/cn/iptables-tutorial-cn-1.1.19.html