上一篇介绍了iptables是如何工作,现在记录下iptables一些实用的命令
语法
iptables [-t 表名] -命令 匹配规则 动作
语法说明:
- 表名: 即那四表: raw、mangle、nat、filter,该参数可以忽略,忽略时默认为filter表
- 命令: 用来增删规则,常用的命令如下:
- -P –policy <链名> 定义默认策略
- -L –list <链名> 查看iptables规则列表
- -A –append <链名> 在规则列表的最后增加1条规则
- -I –insert <链名> 在指定的位置插入1条规则
- -D –delete <链名> 从规则列表中删除1条规则
- -R –replace <链名> 替换规则列表中的某条规则
- -F –flush <链名> 删除表中所有规则
- -Z –zero <链名> 将表中数据包计数器和流量计数器归零
- -X –delete-chain <链名> 删除自定义链
- -v –verbose <链名> 与-L他命令一起使用显示更多更详细的信息
- 匹配规则: 用来对数据包进行匹配,常用如下:
- -i –in-interface 网络接口名> 指定数据包从哪个网络接口进入
- -o –out-interface 网络接口名> 指定数据包从哪个网络接口输出
- -p —proto 协议类型 指定数据包匹配的协议,如TCP、UDP和ICMP等
- -s –source 源地址或子网> 指定数据包匹配的源地址
- –sport 源端口号> 指定数据包匹配的源端口号
- –dport 目的端口号> 指定数据包匹配的目的端口号
- -m –match 匹配的模块 指定数据包规则所使用的过滤模块
- 动作,在上一篇中已经列出来了,常用的如下:
- DROP: 直接丢弃该数据包,且对端不会有任何提示,对端可能在超时时才会知道
- ACCEPT: 接受数据包
- REJECT: 拒绝该数据包,会在对端进行提示
- LOG: 记录该数据包然后把该数据包传递到下一规则链中
常用命令
查看当前iptables设置
1
2
3
4
5
6
7
8iptables -L -n -v --line-numbers
-L: 查看iptables规则列表
-n: 直接以ip的形式显示ip地址,不进行名称转换
-v: 显示更多更详细的信息
--line-numbers: 显示每条规则所在行号
当然也可以指定查看具体的表
iptables -t filter -L -nv --line-numbers说明:
chain INPUT: 指明正在查看的链为INPUT
policy ACCEPT: 指明INPUT默认的策略为ACCEPT
0 packets: 指明当前链使用默认策略匹配到的所有包的数量
0 bytes: 明当前链使用默认策略匹配到的所有包的字节大小
参数-Z就是用来清空这两个值
插入一条规则:
1
2
3
4
5
6
7
8
9
10iptables -t filter -I INPUT -s 192.168.1.10 -j DROP
-t: 指定规则应用于表filter
-I: 表明这条规则需要插入到INPUT链中,默认在开头位置插入
-s: 匹配数据包中源ip地址为192.168.1.10
-j: 指定动作为丢弃
上面这条命令用来丢弃从192.168.1.10发送过来的数据包
也可指定插入的位置
iptables -t filter -I INPUT 3 -s 192.168.1.10 -j DROP
在表filter中的INPUT链中的第3条规则之前插入该规则增加一条规则(在规则列表的最后增加):
1
2
3
4
5
6iptables -t filter -A INPUT -s 192.168.1.10 -j DROP
-t: 指定规则应用于表filter
-A: 表明这条规则需要增加到INPUT链中,在最后位置增加
-s: 匹配数据包中源ip地址为192.168.1.10
-j: 指定动作为丢弃
上面这条命令用来丢弃从192.168.1.10发送过来的数据包删除一条规则:
1
2
3
4
5
6
7
8
9
10
11
12
13
14iptables -t filter -D INPUT -s 192.168.1.10 -j DROP
删除使用-D命令,其它命令参数跟3相同
这条命令用来删除在表filter的INPUT链中,源地址为192.168.1.10且动作为DROP的规则
我们也可以直接使用行号来删除规则
iptables -t filter -D INPUT 3
删除在表filter的INPUT链中的第3行规则
那如果我们要删除指定表中的所有规则呢
iptables -t filter -F
-F: (flush)清空指定表上的所有规则
清空所有表的规则
iptables -F修改规则(用来修改动作)
1
2
3
4
5iptables -t filter -R INPUT -s 192.168.1.10 -j ACCEPT
-R:(replace):如果使用-R来修改规则,则需要指定原本规则的匹配条件
-R一般用来修改规则的动作
如果要修改规则,则更靠谱的办法是删除原来的规则,新增一条新规则保存规则
1
2
3
4
5
6把规则保存为文件中
iptables-save > /etc/sysconfig/iptables
直接保存
service iptables save
加载规则
iptables-restore < /etc/sysconfig/iptables常用的清空所有规则
1
2
3
4
5iptables -F
iptables -X
iptables -Z
下面增加其它规则
...
常用模块
我们使用-m 参数来指定使用到的iptables模块,常用的模块如下:
最开头匹配条件中,有些我们可以直接使用,能直接使用的属于基本条件匹配,还有些是不能直接使用的,不能直接使用的就需要借助模块来使用了,比如–sport/–dport,比较常用的模块如下:
tcp模块
1
2
3
4
5
6
7iptables -t filter -I INPUT -s 192.168.1.10 -p tcp -m tcp --dport 80 -j ACCEPT
-p: 指明协议为tcp
-m: 指明智使用tcp模块
--dport: 这个参数是属于tcp模块的,所以必须使用-m tcp指定,且--dport 必须指定-p参数
如果使用的协议跟模块是一个名字的话,则可以省略-m,如上面的命令等价于
iptables -t filter -I INPUT -s 192.168.1.10 -p tcp --dport 80 -j ACCEPT
但是建议大家还是尽量不要省略,因为那么多模块,有时你不能确定协议名跟模块名是否一致multiport模块
1 | iptables -t filter -I INPUT -s 192.168.1.10 -p tcp -m multiport --dport 22,80 -j ACCEPT |
string模块
1
2
3iptables -t filter -I INPUT -p tcp --sport 80 -m string --algo bm --string "helloworld" -j REJECT
algo: 指定对应的匹配算法,有bm,kpm,为必需项
string: 用来匹配数据包中包含有hellowworldstate模块
1
2
3
4
5
6
7
8
9
10state模块用来追踪连接的状态
常用的状态有如下几种:
1. NEW: 建立连接中的第一个包
2. ESTABLISHED: TCP三次连接成功后为ESTABLISHED
3. RELATED: 相关边的数据连接为RELATED,如FTP的22跟23端口之间的控制连接
4. INVALID: 无法识别状态的数据包为INVALID
5. UNTRACKED: 未被追踪的包为UNTRACKED
iptables -t filter -I INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
只有状态是RELATED,ESTABLISHED的才通过iprange模块
1
2iptables -t filter -I INPUT -m iprange --src-range 192.168.1.1-192.168.1.10 -j DROP
iprange: 指定一个ip范围
白名单/黑名单机制
这两种说法其实是一个意思,关键在于默认的策略是什么?
如果默认的策略为ACCEPT,如果在匹配完所有的规则之后还是无法匹配,该数据包会被ACCEPT
如果默认的策略为DROP,如果在匹配完所有的规则之后还是无法匹配,该数据包会被DROP
所以,正常情况下,
如果默认的策略为ACCEPT,则链中的规则匹配上的数据包动作应该指定为DROP/REJECT,这是黑名单机制
如果默认的策略为DROP,则链中的规则匹配上的数据包动作应该指定为ACCEPT,这是白名单机制
考虑如下这种情况:
假如使用了默认规则为DROP
突然有一天,管理员使用了iptables -F
清空了所有规则,这个时候你会发现管理员自己也登录不上去了,因为默认使用的是DROP,其它能够匹配的规则都被删除了,这个时候所有的数据包都会被DROP掉,这就是黑名单的缺点
那如果我们使用了默认规则为ACCEPT
就算我们清空了其它规则,那管理员还能能够登录上去,因为默认接受所有数据包.
所以我们一般会这样设置:
把默认规则设置为ACCEPT,然后在规则链的最后加一条规则:
1
2
3我们希望数据包能够匹配的规则
...
iptables -t filter -j REJECT这样的话,如果我们想要的数据包能够匹配前面已有的规则,不匹配的数据包执行到最后这条的时候会被拒绝.
就算是我们使用了
iptables -F
清空了规则,也能够使用默认的ACCEPT我们可以复用crontab的定时执行机制写一条规则(允许通过指定ip登录的规则),让它每隔几份钟执行一次,这样不管我现在是什么规则导致我登录不了,过了几份钟后新规则生效,管理员就可以登录了, 不至于永远登录不了.