iptables详解
一:Linux包过滤防火墙概述
1.1:netfilter
- 位于Linux内核中的包过滤功能体系
- 称为Linux防火墙的“内核态”
1.2:iptables
- 位于/sbin/iptables,用来管理防火墙规则的工具
- 称为Linux防火墙的“用户态”
netfilter/iptables(下文中简称为iptables)组成Linux平台下的包过滤防火墙,与大多数的Linux软件一样,这个包过滤防火墙是免费的,它可以代替昂贵的商业防火墙解决方案,完成封包过滤、封包重定向和网络地址转换(NAT)等功能。
二:iptables的表、链结构
2.1:5种规则链
- 规则的作用:对数据包进行过滤或处理
- 链的作用:容纳各种防火墙规则
- 链的分类依据:根据处理数据包的不同时机
5种规则链
- INPUT:处理入站数据包
- OUTPUT:处理出站数据包
- FORWORD:处理转发数据包
- PREROUTING:在进行路由选择前处理数据包
- POSTROUTING:在进行路由选择后处理数据包
2.2:4个规则表
- 表的作用:容纳各种规则链
- 表的划分依据:防火墙规则的作用相似
4个规则表:
- raw表:确实是否对数据包进行状态跟踪
- mangle表:拆解报文,做出修改,并重新封装 的功能
- nat表:网络地址转换功能
- filter表:包过滤功能
2.3:表、链结构示意图
三:数据包过滤的匹配流程
- 规则表之间的顺序
raw–>mangle–>nat–>filter - 规则链之间的顺序
入站:PREROUTING–>INPUT
出站:OUTPUT–>POSTROUTING
转发:PREROUTING–>FORWORD–>POSTROUTING - 规则链里的匹配顺序
按顺序依次检查、匹配即停止
若找不到相应的匹配规则,则按该链的默认策略处理
四:iptables的语法格式
4.1:语法构成
iptables [-t 表名] 选项 [链名] [条件] [-j 控制类型]
注意事项:
- 不指定表名时,默认指filter表
- 不指定链名时,默认指表内的所有链
- 除非设置链的默认策略,否则必须指定匹配条件
- 选项、链名、控制类型使用大写字母,其余均为小写
4.2:数据包的常见控制类型
- ACCEPT:允许通过
- DROP:直接丢弃,不给任何回应
- REJECT:拒绝通过,必要时会给出提示
- LOG:记录日志信息,然后传给下一条规则继续匹配
- SNAT:源地址转换
- DNAT:目标地址转换
4.3:常用选项
4.3.1:添加新的规则
- -A:在链的末尾追加一条规则
- -I:在链的开头(或指定序号)插入一条规则
[root@server ~]# iptables -t filter -A INPUT -p tcp -j ACCEPT
[root@server ~]# iptables -t filter -I INPUT -p udp -j ACCEPT
[root@server ~]# iptables -t filter -I INPUT 2 -p icmp -j ACCEPT
4.3.2:查看规则列表
- -L:列出所有规则列表
- -n:以数字形式显示地址、端口等信息
- -v:以更详细的方法显示规则信息
- –line-numbers:查看规则时,显示规则的序号
[root@server ~]# iptables -nvL INPUT --line-numbers
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 7 993 ACCEPT udp -- * * 0.0.0.0/0 0.0.0.0/0
2 0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0
3 370 23696 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0
4.3.3:删除、清空、修改规则
- -D:删除链内指定序号(或内容)的一条规则
- -F:清空所有的规则
- -R:修改规则
[root@server ~]# iptables -t filter -D INPUT 2
[root@server ~]# iptables -nvL INPUT --line-numbers
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 9 1127 ACCEPT udp -- * * 0.0.0.0/0 0.0.0.0/0
2 441 27884 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0
[root@server ~]# iptables -t filter -F INPUT
[root@server ~]# iptables -nvL INPUT --line-numbers
Chain INPUT (policy ACCEPT 6 packets, 364 bytes)
num pkts bytes target prot opt in out source destination
4.3.4:设置默认策略
- -P:为指定的链设置默认规则
[root@server ~]# iptables -nvL INPUT
Chain INPUT (policy ACCEPT 47 packets, 2804 bytes) #默认规则为ACCEPT
pkts bytes target prot opt in out source destination
[root@server ~]# iptables -P INPUT DROP #更改默认规则为DROP
[root@server ~]# iptables -nvL INPUT
Chain INPUT (policy DROP 22 packets, 1888 bytes) #默认规则变为DROP
pkts bytes target prot opt in out source destination
4.4:规则的匹配条件
4.4.1:通用匹配
可直接匹配,不依赖于其他条件或扩展,包括网络协议、IP地址、网络接口等条件。
常用的通用匹配条件:
- 协议匹配:-p 协议名
- 地址匹配:-s 源地址、-d 目的地址
- 接口匹配:-i 入站网卡、-o 出站网卡
[root@server ~]# iptables -I INPUT -s 192.168.209.138 -p icmp -j REJECT
[root@server ~]# iptables -I INPUT -i ens33 -s 192.168.209.140 -p tcp -j REJECT
使用-s选项或者-d选项即可匹配报文的源地址与目标地址,而且在指定IP地址时,可以同时指定多个IP地址,每个IP用"逗号"隔开,但是,-s选项与-d选项并不能一次性的指定一段连续的IP地址范围,如果我们需要指定一段连续的IP地址范围,可以使用下面显式匹配中的iprange扩展模块。
4.4.2:隐含匹配
要求以特定的协议匹配作为前提,包括端口、tcp标记、icmp类型等条件。
常用的隐含匹配条件:
- 端口匹配:–sport 源端口、–dport 目的端口
- ICMP类型匹配:–icmp-type ICMP类型
#拒绝来自192.168.10.10的ssh请求
[root@server ~]# iptables -t filter -I INPUT -s 192.168.10.10 -p tcp --dport 22 -j REJECT
#拒绝192.168.10.10主机访问本机的22-25端口
[root@server ~]# iptables -t filter -I INPUT -s 192.168.10.10 -p tcp --dport 22:25 -j REJECT
#拒绝192.168.10.10主机访问本机的0-25端口
[root@server ~]# iptables -t filter -I INPUT -s 192.168.10.10 -p tcp --dport :25 -j REJECT
#拒绝192.168.10.10主机访问本机的25端口以及其后的所有端口(直到65535)
[root@server ~]# iptables -t filter -I INPUT -s 192.168.10.10 -p tcp --dport 25: -j REJECT
#禁止所有icmp类型的报文进入本机
[root@server ~]# iptables -t filter -I INPUT -p icmp -j REJECT
#本主机能ping通其他主机,其他主机不能ping通本主机
[root@server ~]# iptables -t filter -I INPUT -p icmp --icmp-type 8 -j REJECT #8表示请求,0表示回应,3表示不可达
借助tcp隐含匹配的–sport或者–dport都可以指定一个连续的端口范围,但是无法同时指定多个离散的、不连续的端口,如果想要同时指定多个离散的端口,需要借助显式匹配的"multiport"多端口匹配。
4.4.3:显式匹配
要求以“-m扩展模块”的形式明确指出类型,包括多端口、MAC地址、IP范围、数据包状态等条件。
常用的显式匹配条件:
- 多端口匹配:-m multiport --sports 源端口列表
-m multiport --dports 目的端口列表 - IP范围匹配:-m iprange --src-range IP范围
- MAC地址匹配:-m mac --mac-source MAC地址
- 状态匹配:-m state --state 连接状态
#禁止来自192.168.10.10的主机上的tcp报文访问本机的22号端口、36号端口以及80号端口
[root@server ~]# iptables -t filter -I INPUT -s 192.168.10.10 -p tcp -m multiport --dports 22,36,80 -j DROP
#拒绝来自192.168.10.10至192.168.10.20之间的主机报文访问本主机
[root@server ~]# iptables -t filter -I INPUT -m iprange --src-range 192.168.10.10-192.168.10.20 -j REJECT
使用iprange扩展模块可以指定"一段连续的IP地址范围",用于匹配报文的源地址或者目标地址。
为了让"提供服务方"能够正常的"响应"我们的请求,于是在主机上开放了对应的端口,开放这些端口的同时,也出现了问题,别人利用这些开放的端口,"主动"的攻击我们,他们发送过来的报文并不是为了响应我们,而是为了主动攻击我们,
问题就是:怎样判断这些报文是为了回应我们之前发出的报文,还是主动向我们发送的报文呢?
我们可以通过iptables的state扩展模块解决上述问题。
对于state模块的连接而言,"连接"其中的报文可以分为5种状态,报文状态可以为NEW、ESTABLISHED、RELATED、INVALID、UNTRACKED。
我们只要放行状态为ESTABLISHED的报文即可。
[root@server ~]# iptables -t filter -I INPUT -m state --state ESTABLISHED -j ACCEPT
[root@server ~]# iptables -t filter -A INPUT -j REJECT
五:SNAT/DNAT策略
防火墙配置
#SNAT
iptables -t nat -I POSTROUTING -s 192.168.1.10 -o ens33 -j SNAT --to-source 12.0.0.1
#DNAT
iptables -t nat -I PREROUTING -d 12.0.0.1 -i ens33 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.10
六:iptables-save与iptables-restore
iptables-save:保存防火墙规则,上述所有操作都是临时的,重启时规则会失效,想要永久保存,可以用iptables-save重定向到/etc/sysconfig/iptables-config,也可以备份到指定文件中,如/opt/iptables.bak
iptables-restore:恢复防火墙规则,当原有的防火墙规则被破坏时,可用备份文件进行恢复
iptables-restore < /opt/iptables.bak