iptables 之 —— 基本操作(一文了解基本命令)

Overview

通过前面《iptables 之 —— 新手入门(图文并茂, 一文读懂 iptables)》文章的学习, 对 iptables 整体有一个比较清楚的理解了. 那接下来就是实操了, 既然 iptables 是操作表, 作为程序员都应该比较熟悉了 CRUD 对应 iptables 就是添加规则, 删除规则, 替换规则, 查看规则.

BTW: 在 iptables 的命令中有一个约定, 表名: 小写, 链: 大写, 处理动作: 大写. 不写表名, 默认是 filter 表.

查询

查询现有的table里面的规则

1iptables -t filter -nL --line-numbers
2iptables -t nat -nL --line-numbers
3iptables -t mangle -nL --line-numbers
4
5# -t 是表名, 如果是 filter 表, 这里也可以不写
6# -nL L 是 list, -n 指的是 端口和协议直接显示数字, iptables 可以把 22 直接显示成 ssh
7# --line-numbers 显示行号, 第一列. 替换规则, 插入规则, 删除规则 需要写行号的
8iptables -t mangle -nL INPUT --line-numbers
9# 如果只想查看 INPUT 链, 可以增加链名参数
 1Lion / # iptables -t filter -nL --line-numbers
 2Chain INPUT (policy DROP)
 3num  target     prot opt source               destination
 41    ACCEPT     1    --  0.0.0.0/0            0.0.0.0/0            icmptype 8
 52    ACCEPT     6    --  0.0.0.0/0            0.0.0.0/0            tcp dpt:8194
 63    ACCEPT     17   --  0.0.0.0/0            0.0.0.0/0            udp dpt:8194
 74    ACCEPT     6    --  0.0.0.0/0            0.0.0.0/0            tcp dpt:5500
 85    ACCEPT     17   --  0.0.0.0/0            0.0.0.0/0            udp dpt:5500
 96    ACCEPT     6    --  0.0.0.0/0            0.0.0.0/0            tcp dpt:5560
107    ACCEPT     17   --  0.0.0.0/0            0.0.0.0/0            udp dpt:5560
118    ACCEPT     17   --  0.0.0.0/0            0.0.0.0/0            udp dpt:4500
129    ACCEPT     6    --  0.0.0.0/0            0.0.0.0/0            tcp dpt:4500
1310   ACCEPT     17   --  0.0.0.0/0            0.0.0.0/0            udp dpt:500
1411   ACCEPT     6    --  0.0.0.0/0            0.0.0.0/0            tcp dpt:500
1512   ACCEPT     17   --  0.0.0.0/0            0.0.0.0/0            udp dpt:9901
1613   ACCEPT     6    --  0.0.0.0/0            0.0.0.0/0            tcp dpt:9901
1714   ACCEPT     17   --  0.0.0.0/0            0.0.0.0/0            udp dpt:8443
1815   ACCEPT     6    --  0.0.0.0/0            0.0.0.0/0            tcp dpt:8443
1916   ACCEPT     0    --  0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
20....
21
22Chain FORWARD (policy DROP)
23num  target     prot opt source               destination
241    DROP       0    --  0.0.0.0/0            192.168.88.0/24
252    ACCEPT     0    --  192.168.88.0/24      0.0.0.0/0
263    ACCEPT     0    --  0.0.0.0/0            192.168.88.0/24
274    ACCEPT     0    --  0.0.0.0/0            192.168.18.0/24
285    ACCEPT     0    --  0.0.0.0/0            192.168.18.0/24
296    ACCEPT     0    --  0.0.0.0/0            192.168.88.0/24
307    ACCEPT     0    --  0.0.0.0/0            0.0.0.0/0
31...
3210   TCPMSS     6    --  0.0.0.0/0            0.0.0.0/0            tcp flags:0x06/0x02 TCPMSS clamp to PMTU
33
34Chain OUTPUT (policy ACCEPT)
35num  target     prot opt source               destination
361    ACCEPT     1    --  0.0.0.0/0            0.0.0.0/0            icmptype 0
372    ACCEPT     0    --  0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
38...

-v 参数的使用

1root@Fox:~# iptables -t filter -nL INPUT -v
2Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
3 pkts bytes target     prot opt in     out     source               destination
4 839K  164M V2RAY-SERVER  all  --  *      *       0.0.0.0/0            0.0.0.0/0
5    0     0 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            policy match dir in pol ipsec proto 50
6 234K   47M ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0            /* !fw3 */
7 590K  115M input_rule  all  --  *      *       0.0.0.0/0            0.0.0.0/0            /* !fw3: Custom input rule chain */
8 586K  115M ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED /* !fw3 */
9   82  4384 syn_flood  tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp flags:0x17/0x02 /* !fw3 */

-x 精确统计数据包大小, 其实就是单位的差异.

  • pkts: 对应规则匹配到的报文个数
  • bytes: 对应规则匹配到的报文大小总和
  • target: 规则对应的 target, 可以是一个 动作(ACCEPT, DROP ...) 也可以是一个自定义规则
  • prot: 表示对应的协议
  • opt: 表示规则对应的选项
  • in: 表示数据包将由哪个接口进入
  • out: 同理, 哪个接口出去
  • source: 源地址, 可以是IP, 也可以是网段
  • destination: 目标地址, 可以是IP, 也可以是网段

上述的例子是列出 filter 表中的所有规则, 前文说过 filter 表的作用是定义防火墙的规则, 也就是说哪些包可以进入, 哪些可以出去, 哪些可以转发.

默认规则

在 INPUT, FORWARD, OUTPUT 三个链上, 是有默认规则的概念. 也就是说如果在规则表里匹配不上, 那就使用默认规则. 如上述列子中的

1Chain INPUT (policy DROP)
2Chain FORWARD (policy DROP)
3Chain OUTPUT (policy ACCEPT)

这是三条默认规则, INPUT FORWARD 都是 DROP, OUTPUT 是 ACCEPT. 如果希望自己的系统在严格保护模式下, 建议默认 INPUT 和 FORWARD 定义为 DROP. 然后使用白名单去开启你允许通过的包. OUTPUT 定义为 ACCEPT, 前面文章中说过, OUTPUT是用户空间发出来的数据包, 用户空间的应用程序都是用户安装启用的, 所以再开一次白名单貌似也意义不太大. 当然你可以把默认规则都写 ACCEPT, 对于新手来说, 这个比较友好, 否则当你的规则写错了, 可能机器就失联了. 这里提供一种防失联的方法, 把白单规则先写好, 再最后写上 iptables -P INPUT DROP . 具体的可参看《使用 Gentoo Linux 搭建简单路由器并支持IPTV功能》 文章中 iptables shell 文件的最后, 所有单名单规则写在前面, 最后再写严口径的默认规则.

清空表

正常情况下, 我个人比较习惯于把 iptables 命令写在一个shell脚本中, 机器启动后自动执行这个脚本, 所以为了省事一般我会在开头清空一下 iptables . 此外我还给xray写了一个 openrc 的脚本, restart | stop 时需要删除自定义的规则

1iptables -F # flush 清除所有链的规则
2iptables -X # delete 删除用户定义的空链
3iptables -Z # zero 将所有的 chain 计数和包大小统计都归零
1iptables -t nat -F # 清空nat表的规则
2iptables -t nat -X
3iptables -t tablename -F|X

添加规则

-A 尾部添加

在指定表的指定链的尾部添加一条规则, -A 表示在对应链的尾部添加

1iptables -t filter -A INPUT -s 192.168.1.2 -j DROP

语法: iptables -t 表名 -A 链名 匹配条件 -j 动作

-I 指定位置添加

在指定表的顶部添加一条规则, -I 表示在对应表在对应链的顶部添加一条规则. 如果在 -I 后面跟上 序号 就是在指定位置添加

1# 顶部添加
2iptables -t filter -I INPUT -s 192.168.1.2 -j DROP
3
4# 指定位置 2
5iptables -t filter -I INPUT 2 -s 192.168.1.2 -j DROP

语法: iptables -t 表名 -I 链名 [序号] 匹配条件 -j 动作

替换规则

可以直接通过 -R 来替换原有的规则, 也可以 删除原有规则再添加一条新的. 这里介绍一下 -R 来替换

1iptables -t filter -R INPUT 2 -s 192.168.1.2 -j ACCEPT

删除规则

最简单的方法是按序号来删除, 也可以按照匹配条件和动作来删除

1# 按序号删除
2iptables -t filter -D INPUT 2
3# 按匹配规则和动作来删除
4iptables -t filter -D INPUT -s 192.168.1.2 -j DROP

Posts in this series