Z.S.K.'s Records

iptables学习二(iptables常用命令)

上一篇介绍了iptables是如何工作,现在记录下iptables一些实用的命令

语法

iptables [-t 表名] -命令 匹配规则 动作

语法说明:

  • 表名: 即那四表: raw、mangle、nat、filter,该参数可以忽略,忽略时默认为filter表
  • 命令: 用来增删规则,常用的命令如下:
    1. -P –policy <链名> 定义默认策略
    2. -L –list <链名> 查看iptables规则列表
    3. -A –append <链名> 在规则列表的最后增加1条规则
    4. -I –insert <链名> 在指定的位置插入1条规则
    5. -D –delete <链名> 从规则列表中删除1条规则
    6. -R –replace <链名> 替换规则列表中的某条规则
    7. -F –flush <链名> 删除表中所有规则
    8. -Z –zero <链名> 将表中数据包计数器和流量计数器归零
    9. -X –delete-chain <链名> 删除自定义链
    10. -v –verbose <链名> 与-L他命令一起使用显示更多更详细的信息
  • 匹配规则: 用来对数据包进行匹配,常用如下:
    1. -i –in-interface 网络接口名> 指定数据包从哪个网络接口进入
    2. -o –out-interface 网络接口名> 指定数据包从哪个网络接口输出
    3. -p —proto 协议类型 指定数据包匹配的协议,如TCP、UDP和ICMP等
    4. -s –source 源地址或子网> 指定数据包匹配的源地址
    5. –sport 源端口号> 指定数据包匹配的源端口号
    6. –dport 目的端口号> 指定数据包匹配的目的端口号
    7. -m –match 匹配的模块 指定数据包规则所使用的过滤模块
  • 动作,在上一篇中已经列出来了,常用的如下:
    1. DROP: 直接丢弃该数据包,且对端不会有任何提示,对端可能在超时时才会知道
    2. ACCEPT: 接受数据包
    3. REJECT: 拒绝该数据包,会在对端进行提示
    4. LOG: 记录该数据包然后把该数据包传递到下一规则链中

常用命令

  1. 查看当前iptables设置

    1
    2
    3
    4
    5
    6
    7
    8
    iptables -L -n -v --line-numbers
    #-L: 查看iptables规则列表
    #-n: 直接以ip的形式显示ip地址,不进行名称转换
    #-v: 显示更多更详细的信息
    #--line-numbers: 显示每条规则所在行号

    #当然也可以指定查看具体的表
    iptables -t filter -L -nv --line-numbers

    iptables4

    说明:

    chain INPUT: 指明正在查看的链为INPUT

    policy ACCEPT: 指明INPUT默认的策略为ACCEPT

    0 packets: 指明当前链使用默认策略匹配到的所有包的数量

    0 bytes: 明当前链使用默认策略匹配到的所有包的字节大小

    参数-Z就是用来清空这两个值

  2. 插入一条规则:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    iptables -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条规则之前插入该规则
  3. 增加一条规则(在规则列表的最后增加):

    1
    2
    3
    4
    5
    6
    iptables -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发送过来的数据包
  4. 删除一条规则:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    iptables -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
  5. 修改规则(用来修改动作)

    1
    2
    3
    4
    5
    iptables -t filter -R INPUT -s 192.168.1.10 -j ACCEPT
    #-R:(replace):如果使用-R来修改规则,则需要指定原本规则的匹配条件
    #-R一般用来修改规则的动作

    #如果要修改规则,则更靠谱的办法是删除原来的规则,新增一条新规则
  6. 保存规则

    1
    2
    3
    4
    5
    6
    #把规则保存为文件中
    iptables-save > /etc/sysconfig/iptables
    #直接保存
    service iptables save
    #加载规则
    iptables-restore < /etc/sysconfig/iptables
  7. 常用的清空所有规则

    1
    2
    3
    4
    5
    iptables -F
    iptables -X
    iptables -Z
    #下面增加其它规则
    ...

常用模块

我们使用-m 参数来指定使用到的iptables模块,常用的模块如下:

最开头匹配条件中,有些我们可以直接使用,能直接使用的属于基本条件匹配,还有些是不能直接使用的,不能直接使用的就需要借助模块来使用了,比如–sport/–dport,比较常用的模块如下:

  1. tcp模块

    1
    2
    3
    4
    5
    6
    7
    iptables -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
    #但是建议大家还是尽量不要省略,因为那么多模块,有时你不能确定协议名跟模块名是否一致
  2. multiport模块

1
2
iptables -t filter -I INPUT -s 192.168.1.10 -p tcp -m multiport --dport 22,80 -j ACCEPT
#multiport: 用来指定多端口
  1. string模块

    1
    2
    3
    iptables -t filter -I INPUT -p tcp --sport 80 -m string --algo bm --string "helloworld" -j REJECT
    #algo: 指定对应的匹配算法,有bm,kpm,为必需项
    #string: 用来匹配数据包中包含有hellowworld
  2. state模块

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #state模块用来追踪连接的状态
    #常用的状态有如下几种:
    #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的才通过
  3. iprange模块

    1
    2
    iptables -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

就算我们清空了其它规则,那管理员还能能够登录上去,因为默认接受所有数据包.

所以我们一般会这样设置:

  1. 把默认规则设置为ACCEPT,然后在规则链的最后加一条规则:

    1
    2
    3
    #我们希望数据包能够匹配的规则
    ...
    iptables -t filter -j REJECT

    这样的话,如果我们想要的数据包能够匹配前面已有的规则,不匹配的数据包执行到最后这条的时候会被拒绝.

    就算是我们使用了iptables -F清空了规则,也能够使用默认的ACCEPT

  2. 我们可以复用crontab的定时执行机制写一条规则(允许通过指定ip登录的规则),让它每隔几份钟执行一次,这样不管我现在是什么规则导致我登录不了,过了几份钟后新规则生效,管理员就可以登录了, 不至于永远登录不了.

参考文章:

转载请注明原作者: 周淑科(https://izsk.me)


 wechat
Scan Me To Read on Phone
I know you won't do this,but what if you did?