本篇文章整理了 Iptables 的基本概念及入门知识,旨在帮助大家快速了解和使用 iptables。
1 什么是Iptables
认识Netfilter
在讲Iptables之前我们必须要先认识一下Netfilter;
Netfilter是由Rusty Russell提出的Linux 2.4内核防火墙框架,该框架既简洁又灵活, 可实现安全策略应用中的许多功能,如数据包过滤、数据包处理、地址伪装、透明代理、动态网络地址转换(Network Address Translation,NAT),以及基于用户及媒体访问控制(Media Access Control,MAC)地址的过滤和基于状态的过滤、包速率限制等。
Netfilter是Linux操作系统核心层内部的一个数据包处理模块,它具有如下功能:
- 网络地址转换(Network Address Translate) - 数据包内容修改 - 数据包过滤防火墙
Netfilter 平台中制定了数据包的五个挂载点,这5个挂载点分别是PRE_ROUTING
、INPUT
、OUTPUT
、FORWARD
、POST_ROUTING
Netfilter 所设置的规则是存放在内核内存中的,通过 Netfilter 放出的接口来对存放在内核内存中的 XXtables(Netfilter的配置表)进行修改。这个XXtables由表tables,链chains,规则rules组成。
认识Iptables
Iptables 是 Linux 防火墙工作在用户空间的管理工具,用来设置、维护和检查 Linux 内核的 IP 数据包过滤规则.
那么Iptables和Netfilter到底什么关系;
简单来说就是Iptables配置规则,而Netfilter执行规则。 Iptables会把配置好的防火墙策略交给内核层的Netfilter网络过滤器来处理.
2 iptables主要特点
iptables主要特点
- 列出数据包过滤器规则集的内容 - 添加 / 删除 / 修改数据包过滤器规则集中的规则 - 列出 / 清零数据包过滤器规则集的每个规则计数器
基本概念
iptables 可以检测、修改、转发、重定向和丢弃 IP 数据包。 其代码已经内置于内核中,并且按照不同的目的被组织成表(table)的集合。表由一组预先定义的链 (chain) 组成,链包含遍历顺序规则。 每一条规则包含条件匹配和相应的动作(称为目标),如果条件匹配为真,该动作会被执行。
下图简要描述了网络数据包通过 iptables 的过程
查看源图像
当一个数据包进入网卡时,数据包首先进入PREROUTING链,内核根据数据包目的IP判断是否需要转送出去. 如果数据包是进入本机的,数据包就会沿着图向下移动,到达INPUT链。数据包到达INPUT链后,任何进程都会收到它。 本机上运行的程序可以发送数据包,这些数据包经过OUTPUT链,然后到达POSTROUTING链输出. 如果数据包是要转发出去的,且内核允许转发,数据包就会向右移动,经过FORWARD链,然后到达POSTROUTING链输出.
3 四表五链
表(tables)
iptables 包含 4 张表(优先级为:raw > mangle > nat > filter): filter 表:用于存放所有有防火墙相关操作的默认表。 nat 表:用于网络地址转换(例如:DNAT 和 SNAT) mangle 表:用于对特定数据包的修改 raw 表:用于配置数据包,raw 中的数据包不会被系统跟踪。
在大多数情况下仅需要使用 filter 和 nat,不会用到 raw,mangle,这2张表用于更复杂的情况——包括多路由和路由判定。
链(chains)
链就是位置:共有五个
进路由(PREROUTING) 进系统(INPUT) 转发(FORWARN) 出系统(OUTPUT) 出路由(POSTROUTING)
表由链组成,链是一些按顺序排列的规则的列表。Iptables 一共包含 5 条链:
INPUT 链:用于处理进入本机的数据包 OUTPUT 链:用于处理从本机输出的数据包 FORWARD 链:用于转发数据包 PREROUTING 链:用于在路由决策前对数据包做相关操作,经常用来做 DNAT POSTROUTING 链:用于在路由决策后对数据包做相关操作,经常用来做 SNAT
filter 表包含 INPUT、OUTPUT 和 FORWARD 3 条内建的链,
nat 表包含 PREROUTING、POSTROUTING 和 OUTPUT 链。
mangle 表包含 PERROUTING、POSTROUTING、INPUT、OUTPUT 和 FORWARD 链。raw 表包含 PREROUTING 和 OUTPUT 链。
默认情况下,任何链中都没有规则。可以向链中添加自己想用的规则。
四表五链之间的关系如图
4 规则
规则(rules)
数据包的过滤基于规则。规则由一个目标(数据包包匹配所有条件后的动作)和很多匹配(导致该规则可以应用的数据包所满足的条件)指定。
一个规则的典型匹配事项是数据包进入的端口(例如:eth0 或者 eth1)、数据包的类型(ICMP、TCP 或者 UDP)和数据包的目的端口。
数据包通过防火墙的时候是按顺序匹配规则的,从上往下依次匹配,一个包不符合某条规则,就会由后面的规则来处理,如果都不符合,就由缺省的规则处理。
规则注意事项:
规则表示一条链上某个表的一些匹配条件,比如拒绝某个 IP 访问 一个链上某个表可以设置多条规则 规则的顺序很重要,一旦有一个规则匹配成功了,后面的规则将会被忽略 如果所有规则没有匹配,那么会有一个默认规则 修改规则的逻辑最好是先删除某条规则,再加入新的规则 iptables 所有的规则都保存在 /etc/sysconfig/iptables 设置了新的规则后,必须使用 service iptables save 进行保存或者使用iptable-save > /etc/sysconfig/iptables,否则重启后,新设置的规则将失效 一个规则中存在多个匹配条件时,这些条件默认规则是与的关系,比如端口,IP必须满足才算匹配
5 处理动作
处理动作(target)
ACCEPT:允许数据包通过。 DROP:直接丢弃数据包,不给任何回应信息。 REJECT:拒绝数据包通过,必要时会给数据发送端一个响应的信息,客户端刚请求就会收到拒绝的信息。 REDIRECT:在本机做端口映射。 SNAT:源地址转换,解决内网用户用同一个公网地址上网的问题。 MASQUERADE:是SNAT的一种特殊形式,适用于动态的、临时会变的ip上。 DNAT:目标地址转换。 LOG:在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则,也就是说除了记录以外不对数据包做任何其他操作,仍然让下一条规则去匹配。
6 iptables命令格式
命令格式(options)
iptables -t filter -I INPUT -d 192.168.1.100 -p tcp --dport 80 -j ACCEPT
语法选项(options)
[-t 表名]:该规则所操作的哪个表,可以使用filter、nat等,如果没有指定则默认为filter
-A:新增一条规则,到该规则链列表的最后一行 -I:插入一条规则,原本该位置上的规则会往后顺序移动,没有指定编号则为1 -D:从规则链中删除一条规则,要么输入完整的规则,或者指定规则编号加以删除 -R:替换某条规则,规则替换不会改变顺序,而且必须指定编号。 -P:设置某条规则链的默认动作 -nL:-L、-n,查看当前运行的防火墙规则列表
chain名:指定规则表的哪个链,如INPUT、OUPUT、FORWARD、PREROUTING等
[规则编号]:插入、删除、替换规则时用,--line-numbers显示号码
[-i|o 网卡名称]:i是指定数据包从哪块网卡进入,o是指定数据包从哪块网卡输出 [-p 协议类型]:可以指定规则应用的协议,包含tcp、udp和icmp等 [-s 源IP地址]:源主机的IP地址或子网地址 [--sport 源端口号]:数据包的IP的源端口号 [-d目标IP地址]:目标主机的IP地址或子网地址 [--dport目标端口号]:数据包的IP的目标端口号
-m:extend matches,这个选项用于提供更多的匹配参数,如:
-m state --state ESTABLISHED,RELATED -m tcp --dport 22 -m multiport --dports 80,8080 -m icmp --icmp-type 8
<-j 动作>:处理数据包的动作,包括ACCEPT、DROP、REJECT等
ACCEPT:允许数据包通过 DROP:直接丢弃数据包,不给任何回应信息 REJECT:拒绝数据包通过,必要时会给数据发送端一个响应的信息。 SNAT:源地址转换。在进入路由层面的route之后,出本地的网络栈之前,改写源地址,目标地址不变,并在本机建立NAT表项,当数据返回时,根据NAT表将目的地址数据改写为数据发送出去时候的源地址,并发送给主机。 MASQUERADE,是SNAT的一种特殊形式,适用于像adsl这种临时会变的ip上 DNAT:目标地址转换。和SNAT相反,IP包经过route之前,重新修改目标地址,源地址不变,在本机建立NAT表项,当数据返回时,根据NAT表将源地址修改为数据发送过来时的目标地址,并发给远程主机。 REDIRECT:是DNAT的一种特殊形式,将网络包转发到本地host上(不管IP头部指定的目标地址是啥),方便在本机做端口转发。 LOG:在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则
7 常见实例
保存防火墙规则
iptables-save #保存防火墙规则
默认查看 filter 表
iptables –nvL –t [filter|nat|mangle|raw] #默认查看 filter 表 cat /etc/sysconfig/iptables #查看已保存的防火墙规则
重启iptables
service iptables restart #重启iptables
清除 iptables 规则
iptables -F -t [filter|nat|mangle|raw] #默认清除 filter 表 清空规则链中的数据包计算器和字节计数器 iptables -Z -t [filter|nat|mangle|raw] #默认清除 filter 表
定义规则链中的默认目标(动作)
iptables -P INPUT DROP #定义 filter 表的 INPUT 链默认目标为 DROP iptables -P FORWARD ACCEPT #定义 filter 表的 FORWARD 链默认目标为 ACCEPT iptables -P OUTPUT ACCEPT #定义 filter 表的 OUTPUT 链默认目标为 ACCEPT
开放 IP / 协议 / port
iptables -A INPUT -s 192.168.1.100 -j ACCEPT #允许源 192.168.1.100 的数据包进入本机 iptables -A INPUT -p ospf -j ACCEPT #允许所有 ospf 协议数据包进入本机 iptables -A INPUT -p icmp -j ACCEPT #允许所有 icmp 协议数据包进入本机 iptables -A INPUT -s 127.0.0.1/32 -d 127.0.0.1/32 -j ACCEPT #允许本地回环 iptables -A INPUT -p tcp --dport 22 -j ACCEPT #允许访问 22 端口 iptables -A INPUT -p tcp --dport 80 -j ACCEPT #允许访问 80 端口
记录日志
iptables -A PREROUTING -s 172.1.0.0/16 -i eth0 -j LOG #所有从 eth0 网卡进入的源 172.1.0.0/16 的数据包记录在 log 日志中
启动网络转发规则
iptables -t nat -A POSTROUTING -s 192.168.188.0/24 -j SNAT --to-source 210.14.67.127 #让内网192.168.188.0/24使用公网 IP 210.14.67.127上网
限速
iptables -I INPUT -p tcp -s 192.168.1.100 -m limit --limit=5000/s --limit-burst=100 -j ACCEPT iptables -I INPUT -p tcp -s 192.168.1.100 -j DROP