iptables防火墙设置-规则

  • iptables有五张表(filter,nat,mangle,raw,security),五个规则链(prerouting,input,forward,output,postrouting).要全部弄懂好像有点麻烦,不过先挑常用的来学学还是一个不错的选择.

  • 什么是表呢?用过myql数据库的应该很清楚,表是用来存放数据的.就像excel表格一样,将数据一条一条的存到数据库中.同理,这里的表也是这个作用,表里面存放的就是我们写好的规则.为什么又分了五个呢,一个不行吗?我觉得一个也不是不可以,但是那样不是就很乱了吗?分类管理还是挺好的.既然说到分类管理了,那么五条链也就比较好理解了,也是为了分类管理.

  • 在表中存放着许多规则,我们把这些规则分个类,这些类就是链.而每张表的功能又不一样,所以每张表中的链也就不一样了

    • nat表:prerouting,input,output,postrouting
    • filter表:input,forward,output
    • mangle:prerouting,iniput,forward,output,postrouting
    • raw表:prerouting,output
    • security表:input,forward,output
  • 上面这样写应该还是不好理解,到底是怎么起作用的?arch wiki上的这张图很好的展示了如何接收/发送数据.以数据的流向为依据,将这些表和链很好的连接在了一起,非常漂亮.所以又不得不夸夸arch wiki了,写的是真的好.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
                                   XXXXXXXXXXXXXXXXXX
    XXX Network XXX
    XXXXXXXXXXXXXXXXXX
    +
    |
    v
    +-------------+ +------------------+
    |table: filter| <---+ | table: nat |
    |chain: INPUT | | | chain: PREROUTING|
    +-----+-------+ | +--------+---------+
    | | |
    v | v
    [local process] | **************** +--------------+
    | +---------+ Routing decision +------> |table: filter |
    v **************** |chain: FORWARD|
    **************** +------+-------+
    Routing decision |
    **************** |
    | |
    v **************** |
    +-------------+ +------> Routing decision <---------------+
    |table: nat | | ****************
    |chain: OUTPUT| | +
    +-----+-------+ | |
    | | v
    v | +-------------------+
    +--------------+ | | table: nat |
    |table: filter | +----+ | chain: POSTROUTING|
    |chain: OUTPUT | +--------+----------+
    +--------------+ |
    v
    XXXXXXXXXXXXXXXXXX
    XXX Network XXX
    XXXXXXXXXXXXXXXXXX
  • 看这个表就知道我们主要操作的还是filter表了.下面就操作一下,秀操作的时候到了,有没有操作?(PS:老年人手速,也想有操作?)

  • iptables的规则书写是有大小写区别的

  • 首先我们不想别人ping我们的ip

    sudo iptables -A INPUT -p icmp -j DROP

    其实完整的写法是下面这样的(需要指定是那张表),但是它默认就是filter表,而我们操作的也是filter表就省略了

    sudo iptables -t filter -A INPUT -p icmp -j DROP

    可以查看一下

    sudo iptables -S

    这样虽然别人不能ping我们了,但是我们发现自己也无法ping别人了,所以得改

  • 这个iptables执行是按顺序一条一条从上向下执行的,所以我们想写在之前写的那条规则上面就要使用-I这个参数,insert将规则插入到最上面,如果后面再接一个数字的话,就是插入到指定第几条规则的上面
    看见了没,这里有两条规则,规则前面就有数字排序

  • 这里我们可以看到icmp-type对应数字的意义,icmp-type 8代表echo request,就是别人ping我们时怎么回答

    sudo iptables -I  INPUT -p icmp --icmp-type 8 -j DROP

    上面这句话就是别人ping我们时,我们不回答,直接丢弃.其实这里还是没有解决无法ping别人的问题,只是替代了上面那条规则

  • 好,这里就写怎么解决ping别人.前面是别人ping我们时,发给我们的icmp数据包直接丢弃.而我们自己ping别人时是需要别人发给我们一个icmp回应包才算ping通的,所以就要接收这个包咯,前面不是说了不接受包吗?icmp-type 0就是接受我们发给别人后回传的数据包的.通过数据包类型的不同来区分到底是别人ping我们的数据包还是回传的数据包
    我们把这条规则加到最开始

    sudo iptables -I INPUT 1 -p icmp --icmp-type 0 -j ACCEPT
  • 还记得我们添加的第一条规则吗,没有作用了,我们把它删除

    sudo iptables -D INPUT 3
  • 然后查看一下现在的规则

    sudo  iptables -S

  • 最后保存一下,以免下次开机这些规则就丢失了

    su
    iptables-save > /etc/iptables/iptables-rules