iptables

iptables 是 Linux 防火墙系统的重要组成部分,iptables 的主要功能是实现对网络数据包进出设备及转发的控制。当数据包需要进入设备、从设备中流出或者由该设备转发、路由时,都可以使用 iptables 进行控制。

简介

iptables 是集成在 Linux 内核中的包过滤防火墙系统。使用 iptables 可以添加、删除具体的过滤规则,iptables 默认维护着 4 个表和 5 个链,所有的防火墙策略规则都被分别写入这些表与链中。

“四表”是指 iptables 的功能,默认的 iptable s规则表有 filter 表(过滤规则表)、nat 表(地址转换规则表)、mangle(修改数据标记位规则表)、raw(跟踪数据表规则表):

四表:

表名 含义
filter 过滤规则表: 包含INPUT、FORWARD、OUTPUT三条链
nat 地址转换规则表: 包含PREROUTING、INPUT、OUTPUT、POSTROUTING四条链
mangle 修改数据标记位规则表: 包含PREROUTING、INPUT、OUTPUT、POSTROUTING、FORWARD五条链
raw 跟踪数据表规则: 包含PREROUTING、OUTPUT两条链
  • filter 表:控制数据表是否允许进出及转发,可以控制的链路有:INPUT、FORWARD、OUTPUT。

  • nat 表:控制数据包的地址转换,可以控制的链路有:PREROUTING、INPUT、OUTPUT、POSTROUTING。

  • mangle 表:修改数据包中的原数据,可以控制的链路有:PREROUTING、INPUT、OUTPUT、FORWARD、POSTROUTING。

  • raw 表:控制nat表中连接追踪机制的启用状况,可以控制的链路有:PREROUTING、OUTPUT。

“五链”是指内核中控制网络的 NetFilter 定义的 5 个规则链。每个规则表中包含多个数据链:INPUT(入站数据过滤)、OUTPUT(出站数据过滤)、FORWARD(转发数据过滤)、PREROUTING(路由前过滤)和POSTROUTING(路由后过滤),防火墙规则需要写入到这些具体的数据链中。

五链:

链名 含义
INPUT 进来的数据包应用此规则链中的策略
OUTPUT 出去的数据包应用此规则链中的策略
FORWARD 转发数据包应用此规则链中的策略
PREROUTING 对数据包作路由选择前应用此链中的规则(所有的数据包进来的时侯都先由这个链处理)
POSTROUTING 对数据包作路由选择后应用此链中的规则(所有的数据包出去的时候都先由这个链处理)

iptables传输数据包的过程

  1. 当一个数据包进入网卡时,它首先进入PREROUTING链,内核根据数据包目的IP判断是否需要转送出去。

  2. 如果数据包就是进入本机的,它就会沿着图向下移动,到达INPUT链。数据包到了INPUT链后,任何进程都会收到它。本机上运行的程序可以发送数据包,这些数据包会经过OUTPUT链,然后到达POSTROUTING链输出。

  3. 如果数据包是要转发出去的,且内核允许转发,数据包就会如图所示向右移动,经过FORWARD链,然后到达POSTROUTING链输出。

规则表之间的优先顺序:
Raw——mangle——nat——filter 规则链之间的优先顺序(分三种情况):

第一种情况:入站数据流向
从外界到达防火墙的数据包,先被PREROUTING规则链处理(是否修改数据包地址等),之后会进行路由选择(判断该数据包应该发往何处),如果数据包 的目标主机是防火墙本机(比如说Internet用户访问防火墙主机中的web服务器的数据包),那么内核将其传给INPUT链进行处理(决定是否允许通 过等),通过以后再交给系统上层的应用程序(比如Apache服务器)进行响应。

第二冲情况:转发数据流向
来自外界的数据包到达防火墙后,首先被PREROUTING规则链处理,之后会进行路由选择,如果数据包的目标地址是其它外部地址(比如局域网用户通过网 关访问QQ站点的数据包),则内核将其传递给FORWARD链进行处理(是否转发或拦截),然后再交给POSTROUTING规则链(是否修改数据包的地 址等)进行处理。

第三种情况:出站数据流向
防火墙本机向外部地址发送的数据包(比如在防火墙主机中测试公网DNS服务器时),首先被OUTPUT规则链处理,之后进行路由选择,然后传递给POSTROUTING规则链(是否修改数据包的地址等)进行处理。

安装

$ yum install iptables-services

启动关闭

# 启动|关闭|重启
$ systemctl start|stop|restart iptables
或者
$ service iptables start|stop|restart

# 查看状态
$ systemctl status iptables
或者
$ service iptables status

# 开机启动|禁用
$ systemctl enable|disable iptables
或者
$ chkconfig iptables on|off

语法

iptables [-t 表名] 管理选项 [链名] [匹配条件] [-j 目标动作]

    管理选项:
        -A:在指定链的末尾添加(append)一条新的规则
        -D:删除(delete)一条已有的规则
        -I:在指定链的头部插入(insert)一条新的规则
        -R:修改、替换(replace)已有的规则,可以按规则序号和内容替换
        -L:显示(list)指定链中的所有规则
        -E:重命名用户定义的链,不改变链本身
        -F:清空(flush)指定链中的所有规则
        -N:新建一个用户自定义的链
        -X:删除指定表中用户自定义的规则链(delete-chain)
        -P:设置指定链的默认策略(policy)
        -Z:将所有表的所有链的字节和数据包计数器清零
        -n:使用数字形式(numeric)显示输出结果
        -v:查看规则表详细信息(verbose)的信息
        -V:查看版本信息
        -h:获取帮助

    匹配条件:
        -p:指定协议,如tcp、udp、icmp
        -s:指定源地址,如192.168.1.1/24(IP地址、网络地址、网络地址段)
        -d:指定目标地址
        -i:指定数据包的入站接口
        -o:指定数据包的出站接口
        -m:指定要使用的扩展匹配,如多播、IP范围、IP列表、IP域等

    目标动作:
        ACCEPT:接收数据包
        DROP:丢弃数据包
        REJECT:拒绝数据包,必要时会给数据发送端一个响应信息
        SNAT:源地址转换
        DNAT:目标地址转换
        MASQUERADE:地址伪装
        REDIRECT:重定向
        LOG:日志记录

实例

规则的保存与恢复

# 指定规则保存至文件
$ iptables-save > /etc/sysconfig/iptables
或者
$ service iptables save     # 自动把规则保存在/etc/sysconfig/iptables中。

iptables-save把规则保存到文件中,再由目录rc.d下的脚本(/etc/rc.d/init.d/iptables)自动装载。

当计算机启动时,rc.d下的脚本将用命令iptables-restore调用这个文件,从而就自动恢复了规则。

或者用命令手动恢复:

# 恢复规则
$ iptables-restore < /etc/sysconfig/iptables

规则查看

$ iptables -L

添加规则

注意先拒绝再允许

允许

允许防火墙转发除ICMP协议以外的所有数据包
$ iptables -A FORWARD -p ! icmp -j ACCEPT

说明:使用!可以将条件取反。

允许防火墙转发所有数据包
$ iptables -A FORWARD -j ACCEPT
只允许防火墙接收来自192.168.1.0/16网段的SSH数据
$ iptables -A INPUT -p tcp --dport 22 -j DROP       # 拒绝所有人访问22端口
$ iptables -A INPUT -p tcp --dport 22 -s 192.168.1.0/16 -j ACCEPT

说明:这个用法比较适合对设备进行远程管理时使用,比如位于分公司中的SQL服务器需要被总公司的管理员管理时。

允许本机开放从tcp端口20-1024提供的应用服务
$ iptables -A INPUT -p tcp --dport 20:1024 -j ACCEPT
$ iptables -A OUTPUT -p tcp --sport 20:1024 -j ACCEPT
允许防火墙本机对外开放TCP端口20、21、25、110以及被动模式FTP端口1250-1280
$ iptables -A INPUT -p tcp -m multiport --dport 20,21,25,110,1250:1280 -j ACCEPT

说明:这里用“-m multiport –dport”来指定目的端口及范围。

只开放本机的web服务(80)、FTP(20、21、20450-20480),放行外部主机发往服务器其它端口的应答数据包,将其他入站数据包均予以丢弃处理
$ iptables -I INPUT -p tcp -m multiport --dport 20,21,80 -j ACCEPT
$ iptables -I INPUT -p tcp --dport 20450:20480 -j ACCEPT
$ iptables -I INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT
$ iptables -P INPUT DROP

拒绝

拒绝进入防火墙的所有ICMP协议数据包
$ iptables -I INPUT -p icmp -j REJECT
丢弃从外网接口(eth1)进入防火墙本机的源地址为私网地址的数据包
$ iptables -A INPUT -i eth1 -s 192.168.0.0/16 -j DROP
$ iptables -A INPUT -i eth1 -s 172.16.0.0/12 -j DROP
$ iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP
封堵网段(192.168.1.0/24),两小时后解封
$ iptables -I INPUT -s 192.168.1.0/24 -j DROP
$ iptables -I FORWARD -s 192.168.1.0/24 -j DROP
$ at now 2 hours at> iptables -D INPUT 1 at> iptables -D FORWARD 1

说明:at now 2 hours表示在当前时间2小时后执行at>后面的命令。

禁止其他主机ping防火墙主机,但允许从防火墙主机ping其他主机
$ iptables -I INPUT -p icmp --icmp-type Echo-Request -j DROP        # 拒绝进入防火墙的所有ICMP协议数据包
$ iptables -I INPUT -p icmp --icmp-type Echo-Reply -j ACCEPT
$ iptables -I INPUT -p icmp --icmp-type Destination-Unreachable -j ACCEPT       # 允许通知发送方目标主机不可达
禁止转发来自MAC地址为00:0C:29:27:55:3F的和主机的数据包
$ iptables -A FORWARD -m mac --mac-source 00:0C:29:27:55:3F -j DROP

说明:iptables中使用“-m 模块关键字”的形式调用显示匹配。咱们这里用“-m mac –mac-source”来表示数据包的源MAC地址。

禁止转发源IP地址为192.168.1.20-192.168.1.99的TCP数据包
$ iptables -A FORWARD -p tcp -m iprange --src-range 192.168.1.20-192.168.1.99 -j DROP

说明:此处用“-m –iprange –src-range”指定IP范围。

禁止转发与正常TCP连接无关的非—syn请求数据包。
$ iptables -A FORWARD -m state --state NEW -p tcp ! --syn -j DROP

说明:-m state表示数据包的连接状态,“NEW”表示与任何连接无关的。

拒绝访问防火墙的新数据包,但允许响应连接或与已有连接相关的数据包
$ iptables -A INPUT -p tcp -m state --state NEW -j DROP
$ iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT

说明:ESTABLISHED表示已经响应请求或者已经建立连接的数据包,“RELATED”表示与已建立的连接有相关性的,比如FTP数据连接等。

删除规则

清除所有规则

$ iptables -t nat -F

删除INPUT链的第一条规则

$ iptables -D INPUT 1