iptables详解使用
1、介绍
1.1简介
iptables是一个linux下的防火墙工具,它能帮助我们基于规则进行网络流量控制。使用 iptables 可以添加、删除具体的过滤规则,iptables 默认维护着 4 个表和 5 个链,所有的防火墙策略规则都被分别写入这些表与链中。它可以做到,但不限于以下功能:
- 允许/拒绝某种协议的链接建立,比如TCP,UDP
- 允许/拒绝 来自某个ip的访问
- 允许/拒绝某个端口被访问
- ….
2、linux内核处理流程
2.1 简化的流程介绍
2.1.1 一般流程介绍
这个流程是简化过的流程,但是对于整个流程的梳理是重要的,简单介绍这个流程:
- 首先是数据包从网卡进入, 已经路由预处理链路(PREROUTING), 这个预处理可以用来修改ip包的目的地址等信息
- 路由决策(Routing Decision)就是判断ip的目的地址是不是本机的ip
- 按照一般情况, 再进入输入链路(INPUT)这个链路,这个主要是决定进入上层应用层的处理前的链路
- 上层应用处理,这个就是实际流入上层应用的数据包,例如用java或者Python构建的web服务就能接收到
- 再就是上层应用会做出响应的数据包进入输出链路(OUTPUT)
- 路由决策这里根据目的ip选择将数据包发给哪个网卡
- 进入路由后处理链路(POSTROUTING), 这个后处理可以用来修改ip地址的源ip信息等
- 输出到网卡发送出去
2.1.2 转发流程
假如当前主机是网关(例如路由器),那么从网卡上就会接收到目的ip不是本机ip的数据包
这个时候路由预处理(PREROUTING)之后的路由决策就会进入路由路由转发(FORWARD)线路
然后到最终经过路由决策到路由后处理(POSTROUTING)
路由后处理(POSTROUTING)这里十分重要,一般路由器就会在这里将源ip地址换成路由器自己的外网ip,这样内网机器就可以通过路由器上网了
iptabels将这个操作称为SNAT,是可以通过命令简单配置下就能配好的
2.2 表、链、规则介绍
2.2.1 规则(rule)
来自192.168.2.31的访问,就要将其拒绝`,这即是一条规则
一个规则一般分为两大部分:
- 匹配: 即哪些数据包会命中这个规则,比如一个指定的ip,即是一个匹配规则
- 动作: 匹配到规则之后,需要做什么动作,是放行,还是拒绝。动作分为以下几种:
- ACCEPT: 直接接受该数据包,不会再走其他链条和规则。比如filter中的input表中的某个规则命中后,动作是ACCEPT,那么该数据包将被直接送达目标进程端口。
- DROP: 直接抛弃该数据包,并且没有任何返回。且不会再走其他链和规则
- REJECT: 跟DROP类似,但好歹还是会跟请求方返回一些拒绝信息,比如我们拒绝掉ICMP协议后,ping该主机,会返回“destination host unreachable”
- RETURN: 当前规则不做任何处理,返回。让给下一个规则处理
- LOG : 同RETURN类似,但只是会将请求信息记录到系统日志中,记录路径
2.2.2 链(chain)
往往我们的安全策略不只一条规则,除了 来自192.168.2.31的访问,就要将其拒绝
这条规则之外,我们还有其它规则,比如: 来自192.168.43.22的访问,也要将其拒绝
甚至,我们可能还有多个互斥的规则,这多个规则,哪个规则先执行? 这就涉及到链这个概念。简单来讲,链就是将多个规则从上大小串起来的一个集合单位。规则按从上倒下依次进行匹配
2.2.3 表(table)
链条可以有多个。将多个链条再规整在一起的集合,叫做表。
2.2.4 四表五链
以上流程中还涉及到表(表是对功能的封装,例如filter专门用于防火墙),按照官方文档也有5张表
- filter 配置防火墙的规则, 可以决定一个数据包是否可以到达目标进程端口
- nat 配置转发包的规则,可以修改源和目标的ip地址,从而进行包路由。
- raw(不常用) 用来标记包让免于系统跟踪,能基于数据包的状态进行规则设定
- mangle(不常用) 用于对特定数据包的修改, 可以修改数据包的内容,比如ttl
- security(不常用) 用于访问控制。
链就是数据包传输过程中经过的各个链路,有5个,包括路由PREROUTING(预处理),INPUT(输入),OUTPUT(输出),POSTROUTING(路由后处理),**FORWARD(转发)**这五条链路
PREROUTING 链
PREROUTING 一般用作对包进行目标地址修改。比如将该包的目标地址,修改为非本机的另外的网络ip,一般通过
DNAT
规则进行修改。(例如虚机访问外网时,回包需要原链路返回需要DNAT
)路由决策(Routing Decision)
决定一个包该走哪个链。如果上述PREROUTING 链对包进行了目标网络ip更改。那么决策会觉得这个是一个需要转发的数据包,于是会将该包转发给 FORWARD 链。否则, 该包会走INPUT链
FORWARD 链
FORWARD在各表中生效的优先顺序是:mangle(FORWARD) —-> filter(FORWARD) 处理路由决策派发发过来的包,到这里的包一般目标网络地址在PREROUTING链被修改过
INPUT 链
其生效顺序是: mangle(INPUT) —-> filter(INPUT) 处理路由决策派发发过来的包,到这里的包一般目标网络地址在PREROUTING链没有被修改过。
OUTPUT 链
在目标进程端口接收到输入数据包后,输出的数据包,将在这里进行规则应用。OUTPUT链在各表中生效的先后顺序是: raw(OUTPUT) —-> mangle(OUTPUT) —-> nat(OUTPUT) —-> filter(OUTPUT)
POSTROUTING
POSTROUTING一般用作对包进行源地址修改,一般通过
SNAT
规则进行修改
表能控制的链路关系如下
表名/链名 | raw | filter | nat | mangle | security |
---|---|---|---|---|---|
PREROUTING | √ | √ | √ | ||
INPUT | √ | √ | √ | √ | |
OUTPUT | √ | √ | √ | √ | √ |
POSTROUTING | √ | √ | |||
FORWARD | √ | √ | √ |
3、iptables命令说明
iptables的命令格式较为复杂,一般的格式如下:
iptables [-t 表] -命令 匹配 操作
3.1 -t 表
表选项用于指定命令应用于哪个iptables内置表。
3.2 命令
命令选项用于指定iptables的执行方式,包括插入规则,删除规则和添加规则,如下表所示
-P --policy <链名> 定义默认策略
-L --list <链名> 查看iptables规则列表
-A --append <链名> 在规则列表的最后增加1条规则
-I --insert <链名> 在指定的位置插入1条规则
-D --delete <链名> 从规则列表中删除1条规则
-R --replace <链名> 替换规则列表中的某条规则
-F --flush <链名> 删除表中所有规则
-Z --zero <链名> 将表中数据包计数器和流量计数器归零
-X --delete-chain <链名> 删除自定义链
-v --verbose <链名> 与-L他命令一起使用显示更多更详细的信息
3.3 匹配规则
匹配选项指定数据包与规则匹配所具有的特征,包括源地址,目的地址,传输协议和端口号,如下表所示
-i --in-interface 网络接口名> 指定数据包从哪个网络接口进入,
-o --out-interface 网络接口名> 指定数据包从哪个网络接口输出
-p ---proto 协议类型 指定数据包匹配的协议,如TCP、UDP和ICMP等
-s --source 源地址或子网> 指定数据包匹配的源地址
--sport 源端口号> 指定数据包匹配的源端口号
--dport 目的端口号> 指定数据包匹配的目的端口号
-m --match 匹配的模块 指定数据包规则所使用的过滤模块
3.4 动作
- REJECT 拦阻该数据包,并返回数据包通知对方,可以返回的数据包有几个选择:ICMP port-unreachable、ICMP echo-reply 或是tcp-reset(这个数据包包会要求对方关闭联机),进行完此处理动作后,将不再比对其它规则,直接中断过滤程序。范例如下:
iptables -A INPUT -p TCP --dport 22 -j REJECT --reject-with ICMP echo-reply
DROP 丢弃数据包不予处理,进行完此处理动作后,将不再比对其它规则,直接中断过滤程序。
REDIRECT 将封包重新导向到另一个端口(PNAT),进行完此处理动作后,将会继续比对其它规则。这个功能可以用来实作透明代理 或用来保护web 服务器。例如:
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT--to-ports 8081
- MASQUERADE 改写封包来源IP为防火墙的IP,可以指定port 对应的范围,进行完此处理动作后,直接跳往下一个规则链(mangle:postrouting)。这个功能与 SNAT 略有不同,当进行IP 伪装时,不需指定要伪装成哪个 IP,IP 会从网卡直接读取,当使用拨接连线时,IP 通常是由 ISP 公司的 DHCP服务器指派的,这个时候 MASQUERADE 特别有用。范例如下:
iptables -t nat -A POSTROUTING -p TCP -j MASQUERADE --to-ports 21000-31000
3.5 常用示例
查看防火墙的状态
iptables -L -n -v --line-numbers
启动/停止/重启防火墙
service iptables stop
service iptables start
service iptables restart
删除一条规则
iptables -L INPUT -n --line-numbers
iptables -L OUTPUT -n --line-numbers
iptables -L OUTPUT -n --line-numbers | less
iptables -L OUTPUT -n --line-numbers | grep 202.54.1.1
# 删除 如果想要删除一条规则,那么可以直接使用序号,例如 INPUT 的第 1 条可以直接这么删除
iptables -D INPUT 1
插入一条规则
# 插入前面
iptables -I INPUT 2 -s 202.54.1.2 -j DROP # 在第二条位置插入一条规则
# 添加后面
iptables -A INPUT -s 202.54.1.2 -j DROP
保存防火墙规则
service iptables save
加载防火墙规则
iptables-restore < /root/my.active.firewall.rules
删除公共接口上的私有地址
iptables -A INPUT -i eth1 -s 192.168.0.0/24 -j DROP
iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP
屏蔽 ip 地址
iptables -A INPUT -s 1.2.3.4 -j DROP
iptables -A INPUT -s 192.168.0.0/24 -j DROP
屏蔽入站端口
iptables -A INPUT -p tcp -s 1.2.3.4 --dport 80 -j DROP
iptables -A INPUT -i eth1 -p tcp -s 192.168.1.0/24 --dport 80 -j DROP
屏蔽出站ip
iptables -A OUTPUT -d 192.168.1.0/24 -j DROP
iptables -A OUTPUT -o eth1 -d 192.168.1.0/24 -j DROP
记录并删除包
iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j LOG --log-prefix "IP_SPOOF A: "
iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP
通过 mac 地址过滤数据
iptables -A INPUT -m mac --mac-source 00:0F:EA:91:04:08 -j DROP
只接收MAC地址为00:0F:EA:91:04:07的TCP流量
iptables -A INPUT -p tcp --destination-port 22 -m mac --mac-source 00:0F:EA:91:04:07 -j ACCEPT
过滤 ICMP ping 请求
iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
iptables -A INPUT -i eth1 -p icmp --icmp-type echo-request -j DROP
开启范围端口
iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 7000:7010 -j ACCEPT
开启范围 ip
iptables -A INPUT -p tcp --destination-port 80 -m iprange --src-range 192.168.1.100-192.168.1.200 -j ACCEPT
改变某个链的默认规则
以filter表的三个链为例,默认是ACCEPT。 但是我们可以改变这个模型规则,比如默认规则就是DROP
iptables -t filter -P INPUT DROP
在使用某个网络时,不响应请求
iptables -A OUTPUT -o wlan0 -d 121.18.238.0/29 -j DROP
规则的取反配置
上述规则配置,一般都是满足某某条件,做什么动作。除此之外,我们还可以配置,如果不满足某某条件,则做某个动作。
iptables -A INPUT -p tcp -m multiport ! --dports 22,80,443 -j DROP
这个不满足则
的取动作,是通过感叹号来实现的。 上述命令的含义是:非22,80,443的端口,我们直接丢弃。
当然这条命令之前,应该要配置一条规则:
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
因为通过22或80建立的连接,可能会衍生出一些RELATED的连接,他们的端口可能不是22或80,那样也就被拒掉了。会导致通信出问题。
3.6 规则持久化
- 第一步,在修改iptables配置后,将其导出到某个文件,比如: /etc/iptables.conf 。命令为:
iptables-save > /etc/iptables.conf
这一步,每次修改后都要做 - 第二步,在
/etc/rc.local
中添加命令iptables-restore < /etc/iptables.conf
。从此之后,每次重启,系统会自动从/etc/iptables.conf
恢复对应的iptables配置。这一步只需要做一次