美文网首页openstack网络
iptables 规则的编写

iptables 规则的编写

作者: 科举 | 来源:发表于2017-03-04 20:58 被阅读1060次

    规则的查看与清除

    如果你在安装的时候没有选择开启防火墙,那么iptables在一开始的时候应该是没有规则的,不过,如果开启了防火墙,防火墙软件会有一套默认的规则。

    shell# iptables [-t tables] [-L] [-nv]
    选项与参数:
    -t 后面接table,例如 nat 或 filter,如果省略此项目,则使用预设的 filter
    -L 列出目前的 table 的规则
    -n 不进行 IP 与 Hostname 的反查,显示信息的速度会快很多
    -v 列出更多的咨询,包括通过该规则的封包总位元数、相关的网络界面等
    

    列出的信息中关键字如下解释

    • target
      代表执行的动作,ACCEPT是放行,而 REJECT 则是拒绝,此外,还有 DROP(丢弃)。
    • prot
      代表使用的封包协议,主要有 tcp、udp 及 icmp 三种封包格式
    • source
      代表此规则是针对哪个【来源IP】 进行限制
    • destination
      代表此规则对哪个【目标IP】进行限制
    • opt
      额外的选项说明

    在输出结果中,命令行中没有添加 -t 的选项,就是默认的 filter 这个表格中的INPUT,OUTPUT,FORWARD 三条链的规则。如果只针对单条链来说,INPUT 和 FORWARD 算是比较重要的管制防火链,所以你可以发现最后一天规则是 REJECT(拒绝)。虽然 INPUT 与FORWARD 的政策是放行(ACCEPT),不过最后一条规则需要将所有的封包都拒绝!

    iptables-save

    iptabls-save 可以列出完整的防火墙规则,不过不能格式化输出

    shell# iptables-save [-t table]
    选项与参数
    -t 可以仅输出某个表,例如 nat 或 filter 等
    

    实例:

    [root@bogon ~]# iptables-save -t filter
    # Generated by iptables-save v1.4.21 on Fri Mar  3 21:28:06 2017
    *filter                                <==== 星号开头指的是表格
    :INPUT ACCEPT [0:0]                    <==== 冒号开头指的是链
    :FORWARD ACCEPT [0:0]                <==== 三条链的策略都是 ACCEPT
    :OUTPUT ACCEPT [228:39884]
    -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT            <==== 针对 INPUT 的规则
    -A INPUT -i lo -j ACCEPT            <==== 针对本机回环网卡开放
    -A INPUT -j INPUT_direct
    -A INPUT -j INPUT_ZONES_SOURCE
    -A INPUT -j INPUT_ZONES
    -A INPUT -p icmp -j ACCEPT
    -A INPUT -j REJECT --reject-with icmp-host-prohibited
    ... 省略 ...
    COMMIT
    # Completed on Fri Mar  3 21:28:06 2017
    

    清除规则

    shell# iptables [-t tables] [-FXZ]
    选项与参数
    -F 清除所有的已经定义的规则
    -X 删除掉所有自定义的 chain(或者说 tables)
    -Z 将所有的 chain 的计数与流量都归零
    

    这三条规则会将本机防火墙的所有规则都清除,但却不会改变政策(policy),所以如果你不是在本机下执行清除指令时,很可能你会被自己挡在外面。

    定义预设政策(policy)

    清除规则后,接下来警示要设定规则的策略。<font color=red><strong>当你的封包不再你设定的规则内,封包是否通过,需要根据policy设定的策略</strong></font>。

    shell# iptables [-t nat] -P [INPUT,OUTPUT,FORWARD] [ACCEPT,DROP]
    选项与参数
    -P 定义策略(Policy)
    ACCEPT 该封包可接受
    DROP 该封包直接丢弃,不会告诉 client 端为何被丢弃
    

    范例:

    shell# iptables -P INPUT DROP
    shell# iptables -P OUTPUT ACCEPT
    shell# iptables -P FORWARD ACCEPT
    shell# ipatbels-save
    * filter
    :INPUT DROP [0:0]
    :FORWARD ACCEPT [0:0]
    :OUTPUT ACCEPT [0:0]
    COMMIT
    # Completed on Fri Mar  3 21:28:06 2017
    

    如果要修改其他三条链,方法是一样的iptabels -t nat -P PREROUTING ACCEPT

    封包的基础对比:IP,网络和网卡设置

    shell# iptables [-AI chain] [-io interface] [-p Protocol] [-s Source IP/Network Segment] [-d Target IP/Network Segment] -j [ACCEPT|DROP|REJECT|LOG]
    选项与参数
    -AI chain 针对某条链进行规则的插入或累加
    -A 新增加一条规则,该规则增加在原本规则的最后面。
    -I 插入一条规则。如果没有指定此规则的顺序,预设是插入变成第一条规则。
    chain 有 INPUT,OUTPUT,FORWARD 等,此链又与 -io 参数有关。
     
    -io interface 设定封包进出的网卡的规则
    -i 封包所进入的那个网卡,例如 eth0、lo 等网卡。需要与 INPUT 链配合。
    -o 封包所出去的那个网卡,需要与 OUTPUT 链配合
     
    -p Protocol 设定这条规则用于那种封包协议
    主要的封包协议有 tcp udp icmp 和 all
     
    -s Source IP/Network Segment 设定这个封包的来源的规则,可指定单一的IP或网段,例如
    IP 192.168.1.1
    Network Segment 192.168.0.0/24 192.168.0.0/255.255.255.0 均可
    如果规则是【不允许】时,加上!即可,例如:
    -s ! 192.168.100.0/24 表示不允许 192.168.100.0/24 网段的封包来源
     
    -d Source IP/Network Segment 与 -s 同理,只是指的是目标的IP或网段
     
    -j 后面接动作,主要的动作有接收(ACCEPT)、丢弃(DROP)、拒绝(REJECT)和记录(LOG)
    

    TCP,UDP 的规则对比,针对端口的设定

    shell# iptables [-AI chain] [-io interface] [-p tcp,udp] [-s Sourec IP/Network Segment] [--sport Port Range] [-d Target IP/Network Segment] [--dport Port Range] -j [ACCEPT|REJECT|DROP]
    选项与参数
    --sport Port Range 限制来源的端口范围,端口号可以是连续的,例如 1024:65535
    --dport Port Range 限制目标的端口范围
    

    需要特别注意的是,<font color=red><strong>因为仅有 tcp 和 udp 封包具有端口,因此你想要使用 --dport--sport 时,需要加上 -p tcp-p udp 的参数才会成功</strong></font>

    iptables 外挂模组:mac 与 state

    在 kernel 以前使用 ipchains 管理防火墙时,ipchains 没有封包状态模组,因此我们必须要针对封包的进出方向进行管控。
    iptables 已经免除了这个困扰,它可以通过一个状态模组来分析【这个想要进入的封包是不是我刚才发出去的回应?】如果是刚刚发出去的封包的回应,那么就可以予以放行

    shell# iptables -A INPUT [-m state] [--state States] -j [RELATED|ESTABLISHED|DROP]
    选项与参数
    -m 一些 iptables 的外挂模组,主要常见的有:
     state 状态模组
     mac 网卡硬件地址(hardware address)
    --state 一些封包的状态,主要有
     INVALID 无效的封包,例如资料破损的封包状态
     ESTABLISHED 已经连线成功的连线状态
     NEW 想要新建立连线的封包状态
     RELATED 这个常用!表示这个封包是与我们主机发送出去的封包有关
    

    实例:

    shell# iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
    shell# iptabels -A INPUT -m state --state INVALID -j DROP
    

    针对网卡来进行放行与防御

    shell# iptables -A INPUT -m mac --mac-source aa:bb:cc:dd:ee:ff -j ACCEPT
    选项与参数
    --mac-source 就是来源主机的MAC地址
    

    ICMP 封包规则的对比:针对是否回应 ping 来设计

    shell# iptables -A INPUT [-p icmp] [--icmp-type Type] -j ACCEPT
    选项与类型
    --icmp-type 后面必须接 ICMP 的封包类型,也可以使用代号,例如 8 代表 echo request 的意思。
    

    实例:让 0,3,4,11,12,13,14,16,18 的ICMP type 可以进入本机:

    #!/bin/bash
    icmp_type="0 3 4 11 12 13 14 16 18"
    for typeicmp in $icmp_type
    do
        iptables -A INPUT -i eth0 -p icmp --icmp-type $typeicmp -j ACCEPT
    done
    

    最简单的用户防火墙设计与防火墙规则存储

    1. 规则清零:清除所有已经存在的规则(iptabels -F...);
    2. 预设政策:除了INPUT这个链设为DROP,其他预设为ACCEPT;
    3. 信任本机,由于lo对于本机来说是相当重要的,因此lo必须设为信任设备;
    4. 回应封包,让本机主动向外要求回应的封包可以进入本机(ESTABLISHED、RELATED);
    5. 信任用户:这是非必要的,如果你想要让区域的来源可用你的主机资源
    • RHEL6/CentOS6 脚本
    #!/usr/bin/env bash
    set -x
    
    # 检查 iptables 服务是否开启
    check_start=$(/etc/init.d/iptables status | grep -c filter)
    if [ $check_start -lt 1 ]; then
        /etc/init.d/iptables start
    fi
    
    # 设置 iptables 开机自启动
    check_enable=$(chkconfig --list iptables | grep -c "3:on")
    if [ $check_enable -lt 1 ]; then
        chkconfig --level 35 iptables on
    fi
        
    # 1. 清除规则
    iptables -F
    iptables -X
    iptables -Z
    
    # 2. 设定默认策略
    iptables -P INPUT DROP
    iptables -P OUTPUT ACCEPT
    iptables -P FORWARD ACCEPT
    
    # 3~5. 制定规则
    iptables -A INPUT -i io -j ACCEPT
    iptables -A INPUT -i eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
    iptables -A INPUT -i eth0 -s 192.168.1.0/24 -j ACCEPT
    
    # 6. 写入防火墙规则设定文件
    /etc/init.d/iptables save
    
    • RHEL7/CentOS7 脚本
    #!/usr/bin/env bash
    set -x
    
    # 检查 iptables-services 软件包是否安装
    if [ ! -f /usr/libexec/iptables/iptables.init ]; then
        yum -y install iptables iptables-services
    fi
    
    # 检查 firewalld 服务是否启动
    check_firewalld_start=$(systemctl is-active firewalld)
    if [ $check_firewalld_start != active ]; then
        systemctl start firewalld
    fi
    
    # 检查 firewalld 服务是否开机自动启
    check_firewalld_enable=$(systemctl is-enabled firewalld)
    if [ check_firewalld_enable != "enabled" ]; then
        systemctl enable firewalld
    fi
    
    # 检查 iptables 服务是否开机自动启
    check_iptables_enable=$(systemctl is-enabled iptables)
    if [ check_iptables_enable != "enabled" ]; then
        systemctl enable iptables
    fi
        
    # 1. 清除规则
    iptables -F
    iptables -X
    iptables -Z
    
    # 2. 设定默认策略
    iptables -P INPUT DROP
    iptables -P OUTPUT ACCEPT
    iptables -P FORWARD ACCEPT
    
    # 3~5. 制定规则
    iptables -A INPUT -i io -j ACCEPT
    iptables -A INPUT -i eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
    iptables -A INPUT -i eth0 -s 192.168.1.0/24 -j ACCEPT
    
    # 6. 防火墙开机自启动并写入防火墙规则设定文件
    /usr/libexec/iptables/iptables.init save
    

    防火墙是一个服务,可以通过checonfig --list iptables查看是否开机自启动。因此,当前设定的防火墙规则想要在下次开机后还生效,那就需要使用/etc/init.d/iptables save将当前配置防火墙配置保存到/etc/sysconfig/iptables配置文件中。

    相关文章

      网友评论

        本文标题:iptables 规则的编写

        本文链接:https://www.haomeiwen.com/subject/wxbjgttx.html