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