1 iptables介绍
iptables的文章很多,作者的写法也都不一样,下面的内容从好几篇文章总结而来
1.1 用途
iptables是Linux下的防火墙软件,用于实现Linux下的网络访问控制,即针对网络包(packet)进行检测、转发、丢弃、修改、流控等控制。
1.2 工作层次
主要在L2、L3、L4层。
1.3 工作空间
规则配置在用户空间(由/sbin/iptables配置,iptables规则信息在/etc/sysconfig/iptables)
规则执行在内核空间(由内核模块netfilter执行)
1.4 iptables的主要功能
包过滤(packet filtering)
连接跟踪(connection track)
网络地址转换(NAT)
重整包头(Mangling packet header fields)
2 iptables的工作模型
2.1 参考资料
iptables的权威资料是“man iptables”。
学习iptables最重要的是理解iptables的工作原理,下文旨在总体上把握iptables的工作模型,然后给出部分典型应用,对具体参数的用法不作过多阐述。实际应用中,用到哪一部分再去仔细阅读权威资料的相关部分,然后去实践调试,即可达到目的。
2.2 命令模型
注:该表较宽,切换到WEB版式视图查看。
命令 |
控制点 |
匹配条件 |
执行动作 |
||||||||
表(控制类型) |
链(控制点) |
规则号 |
通用匹配 |
扩展匹配 |
|||||||
--sport P1[-P2] |
|||||||||||
-L |
[chain] -n -x |
tcp |
--dport P1[-P2] |
||||||||
-S |
[chain] -v |
--tcp-flags SYN,ACK,FIN,RST |
REDIRECT |
||||||||
-F |
[chain] |
--syn |
RETURN |
||||||||
-Z |
[chain][n]] |
udp |
--sport P1[-P2] |
MARK |
|||||||
-P |
chain target |
-S IP/net |
--dport P1[-P2] |
LOG |
--log-prefix |
||||||
[-t filter] |
-A |
INPUT |
-d IP/net |
icmp |
--icmp-type {8|0} |
ACCEPT |
|||||
iptables |
-t nat |
-I |
OUTPUT |
rulenum |
-p {tcp|udp|icmp} |
-m |
multiports |
--dports PORT[,PORT,...] |
-j |
DROP |
|
-t mangle |
-R |
FORWARD |
-i if -o of |
--ports PORT[,PORT,...] |
REJECT |
||||||
-t raw |
-X |
PREROUTING |
iprange |
--src-range IP1-IP2 |
自定义链 |
||||||
POSTROUTING |
--dst-range IP1-IP2 |
SNAT |
--to-source |
||||||||
-D |
chain rulenum |
string |
--string STR --algo {kmp|bm} |
DNAT |
--to-destination |
||||||
-N |
自定义链 |
--hex-string |
MASQUERADE |
--to-port |
|||||||
-E |
旧名 新名 |
connlimit |
--conlimit-above [n] |
TPROXY |
--on-port |
||||||
limit |
--limit rate --limit-burst b |
||||||||||
state |
--state NEW,ESTABLISHED,RELATED |
-m :扩展匹配, 扩展匹配的模块见2.5介绍
如: 匹配tcp目的端口123: -p tcp -m tcp --dport 123, 当有通用匹配参数-p {tcp|udp|icmp}时,可不加“-m {tcp|udp|icmp}”,即:-p tcp -m tcp --dport 123 ==> -p tcp --dport 123
理解iptables对包的控制,就要掌握控制的三个要素:
1、在哪里?——控制点,对应table+chain+rule
2、对哪些?——匹配条件,对应match
3、怎么做?——执行动作,对应target
2.3 表和链(控制点)
包在表和链中的流转图,如下图所示。
5种链:PREROUTING、INPUT、OUTPUT、FORWAD、POSTROUTING
4种表:优先级raw > mangle > nat > filter
【请求-响应流程】
如本机收到一个HTTP请求,然后发送一个HTTP响应,根据流转图可知流程为:
raw.PREROUTING -> mangle.PREROUTING -> nat.PREROUTING
-> mangle.INPUT -> filter.INPUT
-> raw.OUTPUT -> mangle.OUTPUT -> nat.OUTPUT -> filter.OUTPUT
-> mangle.POSTROUTING -> nat.POSTROUTING
【转发流程】
如本机作为代理/路由器来转发包,根据流转图可知流程为:
raw.PREROUTING -> mangle.PREROUTING -> nat.PREROUTING
-> mangle.FORWARD -> filter.FORWARD
-> mangle.POSTROUTING -> nat.POSTROUTING
【如何理解表和链】
1、“table”、“chain”的命名让人有些费解,理解时可先不管其原本含义。
2、参照上图来理解表和链代表的控制点。
3、链对应包的流转阶段:如PREROUTING指从网卡进入系统的最开始阶段。
4、表对应包的控制/操作类型:
表 |
操作 |
raw |
不进行连接跟踪(conntrack),常-j NOTRACK |
mangle |
修改包头字段 |
nat |
NAT转换 |
filter |
允许或禁止 |
2.4 规则rule与策略 policy(链尾动作)
设定规则时,要指定所在的表和链,如iptables -t nat -A PREROUTING …。
链内可有多条规则,内置链的最后有一个策略,即链尾动作。
【包在链内的匹配流程】:
进入链后从第一条规则开始,依次匹配。
若包与规则不匹配,则与链中下一条规则进行匹配。
若匹配到一条规则就执行该规则的target动作(允许、拒绝、改写包头、NAT等),然后按该动作的“后续操作”(NextRule、NextChain、NextPacket、Return)继续。
如果包与链中的任何规则都不匹配,即到达链尾,则执行该链的策略(链尾动作)。
2.5 match(匹配条件)
可分为通用匹配和扩展匹配(隐式和显示),其差异仅体现在指定参数的方式上,在功能本质上是统一的。
匹配类型 |
说明 |
参数方式 |
通用匹配 |
最常用的匹配条件,仅包括入站网卡、出站网卡、源IP、目的IP、协议等条件 |
直接给出参数(-s, -d, -i, -o, -p) |
扩展匹配 |
每种匹配方式对应一个模块,以-m来设置 |
-m <匹配模块> <模块参数> 例:-m tcp --dport 80 |
隐式扩展匹配 |
当有通用匹配参数-p {tcp|udp|icmp}时,可不加“-m {tcp|udp|icmp}”,直接给出相关协议的参数,此为隐式匹配,实际上就是扩展匹配的一种省略“-m”的简化写法。 |
tcp:--sport --dport --tcp-flags udp:--sport --dport icmp:--icmp-type 例:-p tcp [-m tcp] --dport 80 |
SuSE12sp1自带的iptables 1.4.21,共有60种扩展匹配,列举常用的18种如下:
扩展匹配 |
说明 |
addrtype |
地址类型:本地、广播等 |
comment |
注释 |
connlimit |
连接数 |
icmp |
ICMP协议 |
length |
IP净荷长度 |
limit |
流量(以包个数计) |
mac |
MAC地址 |
mark |
标志(U32整形数) |
multiport |
多端口 |
sctp |
SCTP协议 |
socket |
内核socket |
state |
TCP连接状态(NEW、ESTABLISHED、RELATED、INVALID) |
string |
字符串 |
tcp |
TCP协议 |
tcpmss |
建链时的TCP最大净荷参数 |
time |
时间 |
u32 |
包数据看做是U32数组 |
udp |
UDP协议 |
iptables -m tcp --help
可以查看tcp模块 详情, 其他模块 类似
2.6 target(执行动作)
target就是iptables规则匹配之后执行的动作,分三类:
1、内置target(3个:ACCEPT/DROP/RETURN)
2、自定义链target
3、扩展target(40个)
target的“后续操作”是指执行完其本身动作后的下一步操作,分为以下4种:
1、【NextRule】匹配本链的下一条规则,若已到达本链末尾,则执行本链Policy。
2、【NextChain】结束本链(不受本链Policy约束),进入下一链。
3、【NextPacket】终止本包处理,继续处理一下个包。
4、【Return】自定义链中的-j RETURN返回调用链,内置链中的-j RETURN执行内置链中的Policy。
内置target和常用扩展target如下:
target |
本次操作 |
后续操作 |
-j ACCEPT(内置) |
允许 |
NextChain |
-j RETURN(内置) |
Return |
|
-j DROP(内置) |
丢弃,无回应 |
NextPacket |
-j REJECT |
丢弃,给出ICMP回应 |
NextPacket |
-j SNAT |
SNAT |
NextChain |
-j MASQUERADE |
源IP修改为网卡IP(SNAT特例) |
NextChain |
-j DNAT |
DNAT |
NextChain |
-j REDIRECT |
重定向到另一个端口(DNAT特例) |
NextRule |
-j MARK |
打标记 |
NextRule |
-j LOG |
写日志/var/log/message |
NextRule |
-j TPROXY |
转发到本机端口 |
NextChain |
下面的web链接的介绍也很详细
https://www.cnblogs.com/davidwang456/p/3540837.html