参考资料
- Iptables Essentials: Common Firewall Rules and Commands
- The Beginner’s Guide to iptables, the Linux Firewall
- A Deep Dive into Iptables and Netfilter Architecture
几个图
都说一图胜千言,先上几个个人认为不错的图吧
第一个图是将网络流量来了以后,Linux内核是如何流转的
第二个图是其他的人做的一个思维导图
基本概念
iptables的结构:iptables -> Tables -> Chains -> Rules. 简单地讲,tables由chains组成,而chains又由rules组成。
规则表
iptables具有内建表包含:
- raw
- mangle
- nat
- filter
- security
规则链
iptables具有内建规则链包含:
- PREROUTING
- INPUT
- FORWARD
- OUTPUT
- POSTROUTING
规则
iptables中的规则有以下三个要点:
- Rules包括一个条件和一个目标(target)
- 如果满足条件,就执行目标(target)中的规则或者特定值
- 如果不满足条件,就判断下一条Rules
target里指定的特殊值包含(待确定):
- ACCEPT: 接收数据包
- DROP: 丢弃,不会给回应
- QUEUED: 将数据包移交到用户空间
- REJECT: 拒绝,但是会给数据包请求方回应
规则参数
每条规则都对数据包的一些属性进行了描述,用于匹配数据包。常用规则参数有:
- [!]
-p
或者--protocol
,可选协议有`tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp, mh or all - [!]
-s
或者--source
,表示源地址,可以是一个ip,也可以是一个网段 - [!]
-d
或者--destination
,表示目的地址,可以是一个ip,也可以是一个网段 - [!]
-i
或者--in-interface
,表示接收数据包的网卡名字(一般适用于INPUT,FORWARD和PREROUTING链) - [!]
-o
或者--out-interface
,表示发送数据包的网卡名字(一般适用于FORWARD,OUTPUT和POSTROUTING链) -j
或者--jump
,描述target,表示当数据包符合规则时执行的操作。值可以是用户定义的规则链、内建target或者是一个extension--sport
,表示源端口(source port)针对 -p tcp 或者 -p udp--dport
,表示目的端口(destination port)针对-p tcp 或者 -p udp
小结
每个规则表包含的数据链情况如下:
raw: PREROUTING OUTPUT
mangle: PREROUTING INPUT FORWARD OUTPUT POSTROUTING
dnat: PREROUTING OUTPUT
filter: INPUT FORWARD OUTPUT
security: INPUT FORWARD OUTPUT
snat: INPUT POSTROUTING
当数据包来到机器后,数据包流程规则表的顺序为:
raw -> mangle -> dnat -> filter -> security -> snat
数据包流经规则链的顺序为:
PREROUTING -> INPUT -> FORWARD -> OUTPUT -> POSTROUTING
对于机器内的数据包,可以根据其流入/流出方向触发的规则链:
- 外部发过来的包,并且目的地就是本机器:PREROUTING -> INPUT
- 外部发过来的包,但目的地址不是本机器:PREROUTING -> FORWARD -> POSTROUTING
- 本机器产生的包, :OUTPUT -> POSTROUTING
常用操作
查看现有规则
- 可以通过
-L
或者--list
来查看所有规则 - 操作规则时通过
-t
参数指定要查看的数据表名 - 不指定默认为filter表,后面操作都有这个隐式说明
- 可以通过添加参数
-n
来将域名解析为ip地址 - 可以通过添加参数
--line-number
来将规则在规则链中的位置打印出来
# iptables -t filter|nat|mangle|raw -L
保存现有规则
# iptables-save
清除所有规则
和查看所有规则一致,也可以通过-t
指定表,默认是filter表
# iptables -t filter|nat|mangle|raw -F
查看默认规则
- 每个规则链都有自己默认的规则
- 当有数据包来了,但是没有匹配的现有规则的话,iptables采用默认规则
# iptables -L | grep policy
设置默认规则
- 可以通过
-P
或者--policy
选项来设置默认规则 - 默认规则的target只能为
ACCEPT
或者DROP
# iptables --policy INPUT DROP
# iptables --policy OUTPUT DROP
# iptables --policy FORWARD DROP
创建规则链
可以通过-N
或者--new-chain
选项来创建新的规则链,创建后可以通过-L
查看所有规则链
# iptables -N custom_chain
# iptables -L
删除规则链
可以通过-X
或者--delete-chain
选项来删除规则链,创建后可以通过-L
查看所有规则链
# iptables -X custom_chain
# iptables -L
重命名规则链
可以通过-E
或者--rename-chain
选项来重命名规则链,创建后可以通过-L
查看所有规则链
# iptables -E custom_chain custom
# iptables -L
添加规则
- 可以通过
-A
、--append
或者-I
、--insert
来添加规则 -A
或者-I
后面紧跟需要添加规则的链名称-A
将规则添加到最后面,-I
则可以根据参数指定插入的位置
# iptables -I INPUT 0 -p tcp -dport 22 -s 10.0.0.1 -j ACCEPT
# iptables -A INPUT -p tcp -dport 22 -j DROP
删除规则
通过-D
或者--delete
选项可以删除规则
# iptables -D INPUT 1
# iptables -D -p tcp -dport 22 -j DROP
替换/修改规则
可以通过-R
或者--replace
选项来修改规则
# iptables -R INPUT 1 -p tcp -dport 22 -s 10.0.0.1 -j DROP
未包含内容
对于根据数据包在数据链接中的状态来进行规则的创建并未覆盖,有兴趣的可以参考资料[3]