iptables规则的查看、添加、删除和修改[教程]

在 Linux 中 iptables 实际上只是一个操作 Linux 内核 Netfilter 子系统的“界面”。顾名思义,Netfilter 子系统的作用,就是 Linux 内核里挡在“网卡”和“用户态进程”之间的一道“防火墙”。 也就是说 iptables 工作在用户态,它和我们平时开发的应用程序完全一样的,只是它的作用是用来操作 NetFilter 的一个工具。而 NetFilter 工作在内核态,它们的关系,可以用如下的示意图来表示:

图来自极客时间

在 iptables 中存在四表五链的概念。

表分别为 filternatrawmangle ,当数据包抵达防火墙时,将依次应用 raw、mangle、nat、和 filter 表中对应链内的规则,其中表的应用顺序为:raw -> mangle -> nat -> filter,而表中链的规则自上向下依次执行,执行中有可能跳转到其它链中继续执行。

iptables Processing Flowchart

如果按七层网络协议的话,则 ipables 中的数据流向为

(来自Netfilter 官方的原理图)Packet flow in Netfilter and General Networking

其中每一层又分为”INPUT PATH“、“FORWARD PATH” 和 “OUTPUT PATH” 三种。对于”INPUT PATH” 和 “OUTPUT PATH“包含四个表,而对于” FORWARD PATH“而言只包含两个表。

如果想查看指定类型的表通过 -t 参数指定,如

$ iptables -t nat -L

可以显示所有 nat 表的规则,如果不指定 -t 参数,则默认只显示 filter 表规则。

四表:

filter 负责过滤功能。对应 iptables_filter 模块
nat  网络地址转换。对应 iptable_nat 模块
mangle 对数据报文拆解、修改、重新封装的功能;对应 iptable_mangle 模块
raw 关闭nat表上启用的连接追踪机制;对应 iptable_raw 模块

五个链:

PREROUTING 是在包进入防火墙之后(入站)、路由决策之前做处理
POSTROUTING 是在路由决策之后(出站),做处理
INPUT  在包被路由到本地之后,但在出去用户控件之前做处理
OUTPUT在去顶包的目的之前做处理
FORWARD 在最初的路由决策之后,做转发处理

详细的请查看man iptables,下面我们只对常用的 filter 介绍一下其用法,这里省略了参数 -t filter

1、查看

iptables -nvL –line-number

-L 查看当前表的所有规则,默认查看的是 filter 表,如果要查看 NAT 表,可以加上 -t NAT 参数
-n 不对ip地址进行反查,加上这个参数显示速度会快很多
-v 输出详细信息,包含通过该规则的数据包数量,总字节数及相应的网络接口
–line-number 显示规则的序列号,这个参数在删除或修改规则时会用到

2、添加
添加规则有两个参数:-A-I 。其中 -A 是添加到规则的末尾;-I 可以插入到指定位置,没有指定位置的话默认插入到规则的首部。

当前规则:

[root@test ~]# iptables -nL --line-number
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination
1    DROP       all  --  192.168.1.1          0.0.0.0/0
2    DROP       all  --  192.168.1.2          0.0.0.0/0
3    DROP       all  --  192.168.1.4          0.0.0.0/0

添加一条规则到尾部:

[root@test ~]# iptables -A INPUT -s 192.168.1.5 -m comment --comment "comment info"  -j DROP

再插入一条规则到第三行,将行数直接写到规则链的后面:

[root@test ~]# iptables -I INPUT 3 -s 192.168.1.3 -j DROP

查看:

[root@test ~]# iptables -nL --line-number
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination
1    DROP       all  --  192.168.1.1          0.0.0.0/0
2    DROP       all  --  192.168.1.2          0.0.0.0/0
3    DROP       all  --  192.168.1.3          0.0.0.0/0
4    DROP       all  --  192.168.1.4          0.0.0.0/0
5    DROP       all  --  192.168.1.5          0.0.0.0/0       /* comment info */

可以看到 192.168.1.3 插入到第三行,而原来的第三行 192.168.1.4 变成了第四行。

这时使用了注释功能, -m 表示启用注释功能 —comment 指定注释内容

3、删除
删除用-D参数

删除之前添加的规则(iptables -A INPUT -s 192.168.1.5 -j DROP):

[root@test ~]# iptables -D INPUT -s 192.168.1.5 -j DROP

有时候要删除的规则太长,删除时要写一大串,既浪费时间又容易写错,这时我们可以先使用–line-number找出该条规则的行号,再通过行号删除规则。

[root@test ~]# iptables -t filter -nL --line-number
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination
1    DROP       all  --  192.168.1.1          0.0.0.0/0
2    DROP       all  --  192.168.1.2          0.0.0.0/0
3    DROP       all  --  192.168.1.3          0.0.0.0/0

删除第二行规则

[root@test ~]# iptables  -t filter -D INPUT 2

4、修改
修改使用-R参数

先看下当前规则:

[root@test ~]# iptables -nL --line-number
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination
1    DROP       all  --  192.168.1.1          0.0.0.0/0
2    DROP       all  --  192.168.1.2          0.0.0.0/0
3    DROP       all  --  192.168.1.5          0.0.0.0/0

将第三条规则改为ACCEPT:

[root@test ~]# iptables -R INPUT 3 -j ACCEPT

再查看下:

[root@test ~]# iptables -nL --line-number
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination
1    DROP       all  --  192.168.1.1          0.0.0.0/0
2    DROP       all  --  192.168.1.2          0.0.0.0/0
3    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0

第三条规则的 target 已改为ACCEPT。

5、保存规则

# iptables-save > iptable.txt

如果直接执行 iptables-save 则会直接在终端屏幕中输出当前的规则

6、恢复规则

上面我们已经实现了规则备份,如果要想恢复,则可以通过 ipables-restore 命令

# iptables-restore iptable.txt

7、删除链 chain 下面的所有规则

# iptables -t filter -F

会删除 filter 表中所有链的规则,如果要删除chain 链,则需要使用 -X 参数

8、创建用户自定义链 chain

# iptables -t filter -N TEST_REDIRECT

9、删除链 chain

# iptables -t filter -X TEST_REDIRECT

此命令只允许删除用户自定义的链,且无法删除包含规则的链,只能删除空链

参考:

推荐阅读:Iptables之nf_conntrack模块