目录
1.3.3 数据包在规则表、链间的匹配流程(与匹配顺序配合理解)
一、Linux防火墙基础
Linux的防火墙体系主要工作在网络层,针对TCP/IP数据包实施过滤和限制。属于典型的包过滤防火墙。linux系统的防火墙体系基于内核编码实现,具有非常稳定的性能和极高的效率,因此获得广泛的应用
1.1 iptables结构概述
简述:
IP 信息包过滤系统,它实际上由两个组件netfilter和 iptables组成
主要工作在网络层,针对IP数据包,体现在对包内的IP地址、端口等信息的处理
netfilter与iptables关系:
- netfilter:linux内核中实现包过滤防火墙的内部结构,不以程序或文件的形式存在。属 于“内核态”又称内核空间的防火墙功能体系
- iptables:用来管理Linux防火墙的命令程序,是为包过滤机制的实现提供规则,通过 各种不同的规则,让netfilter对源的过滤。属于“用户态”(User Space, 又 称为用户空间)的防火墙管理体系
1.2 iptables 的表、链结构
简单叙述:(四表五链)
每个规则表相当于内核空间的一个容器,根据规则集的不同用途划分为默认的四个表
在每个表容器内又包括不同的规则链,根据处理数据包的不同时机划分为五种链
- 规则表的作用:容纳各种规则链
- 表的划分依据:防火墙规则的作用相似
- 规则链的作用:容纳各种防火墙规则
- 规则的作用:对数据包进行过滤或处理
- 链的分类依据:处理数据包的不同时机
四表:
- raw:主要用来决定是否对数据包进行状态跟踪 包含两个规则链,OUTPUT、PREROUTING
- mangle : 修改数据包内容,用来做流量整形的,给数据包设置标记。包含五个规则链, INPUT、 OUTPUT、 FORWARD、 PREROUTING、 POSTROUTING
- nat:负责网络地址转换,用来修改数据包中的源、目标IP地址或端口。包含三个规则链, OUTPUT、PREROUTING、POSTROUTING。
- filter:负责过滤数据包,确定是否放行该数据包(过滤)。包含三个链,即INPUT、 FORWARD、 OUTPUT
五链:
- INPUT:处理入站数据包,匹配目标IP为本机的数据包。(处理进入本机的数据包)
- OUTPUT:处理出站数据包,一般不在此链上做配置。(处理从本机发出的数据包)
- FORWARD: 处理转发数据包,匹配流经本机的数据包。(处理转发数据包)
- PREROUTING链: 在进行路由选择前处理数据包,用来修改目的地址,用来做DNAT。相当于把内网服务器的IP和端口映射到路由器的外网IP和端口上。 (路由前,处理数据包)
- POSTROUTING链: 在进行路由选择后处理数据包,用来修改源地址用来做SNAT。相当于内网通过路由器NAT转换功能实现内网主机通过一个公网IP地址上网。(路由后,处理数据包)
1.3 数据包控制的匹配流程(数据包→防火墙)
1.3.1 规则链之间的匹配顺序
优先顺序
规则表应用顺序:raw→mangle→nat→filter
主机型防火墙:
- 入站数据(来自外界的数据包,且目标地址是防火墙本机) : PREROUTING --> INPUT --> 本机的应用程序
- 出站数据(从防火墙本机向外部地址发送的数据包):本机的应用程序-->OUTPUT-.>POSTROUTING
网络型防火墙:
转发数据(需要经过防火墙转发的数据包) :
PREROUTING --> FORWARD --> POSTROUTING
1.3.2 规则链内的匹配顺序
- 自上向下按顺序依次进行检查,找到相匹配的规则即停止(LOG策略例外,表示记录相关日志)要么放行 要么丢弃
- 若在该链内找不到相匹配的规则,则按该链的默认策略处理(未修改的状况下,默认策略为允许)
注:-F清空链时,默认策略不受影响
1.3.3 数据包在规则表、链间的匹配流程(与匹配顺序配合理解)
入站数据流向:
- 来自外界的数据包到达防火墙后,首先被 PREROUTING 链处理(是否修改数据包地址等),然后进行路由选择(判断该数据包应发往何处)
- 如果数据包的目标地址是防火墙本机(如 Internet 用户访问网关的 Web 服务端口),那么内核将其传递给 INPUT 链进行处理(决定是否允许通过等)
- 通过以后再交给系统上层的应用程序 (如 httpd 服务器)进行响应
转发数据流向:
- 来自外界的数据包到达防火墙后,首先被 PREROUTING 链处理
- 然后再进行路由选择,如果数据包的目标地址是其他外部地址(如局域网用户通过网关访问 QQ 服务器),则内核将其传递给 FORWARD 链进行处理(允许转发或拦截、丢弃)
- 最后交给 POSTROUTING 链(是否修改数据包的地址等)进行处理
出站数据流向:
- 防火墙本机向外部地址发送的数据包(如在防火墙主机中测试公网 DNS服务时)
- 首先进行路由选择,确定了输出路径后,再经由 OUTPUT 链处理,
- 最后再交 POSTROUTING 链(是否修改数据包的地址等)进行处理
二、编写防火墙规则
基本安装:
①关闭firewalld防火墙
systemctl stop firewalld.service
systemctl disable firewalld.service
②安装iptables 防火墙
yum -y install iptables iptables-services
③设置iptables开机启动
systemctl start iptables.service
systemctl enable iptables.service
2.1 基本语法、控制类型
2.2.1 语法构成
iptables [-t 表名] 管理选项 [链名] [匹配条件] [-j 控制类型]
- 表名、链名:用来指定 iptables 命令所操作的表和链,未指定表名时将默认使用 filter 表
- 管理选项:表示iptables规则的操作方式,如插入、增加、删除、查看等
- 匹配条件:用来指定要处理的数据包的特征,不符合指定条件的数据包将不会处理
- 控制类型:指的是数据包的处理方式,如允许、拒绝、丢弃等
注:
- 不指定表名时,默认指filter表
- 不指定链名时,默认指表内的所有链
- 除非设置链的默认策略,否则必须指定匹配条件
- 选项、链名、控制类型使用大写字母,其余均为小写
管理选项 | 用法示例 |
-A | 在指定链末尾追加一条 iptables -A INPUT (操作) |
-I | 在指定链中插入一条新的,未指定序号默认作为第一条 iptables -I INPUT (操作) |
-P | 指定默认规则 iptables -P OUTPUT ACCEPT (操作) |
-D | 删除 iptables -t nat -D INPUT (操作) |
-R | 修改、替换某一条规则 iptables -t nat -R INPUT (操作) |
-L | 查看 iptables -t nat -L (查看) |
-n | 所有字段以数字形式显示 (比如任意ip地址是0.0.0.0而不是anywhere,比如显示协议端口号而不是服务名) iptables -L -n,iptables -nL,iptables -vnL (查看) |
-v | 查看时显示更详细信息,常跟-L一起使用 (查看) |
--line-number | 规则带编号 iptables -t nat -L -n --line-number /iptables -t nat -L --line-number |
-F | 清除链中所有规则 iptables -F (操作) |
-X | 清空自定义链的规则,不影响其他链 iptables -X |
-Z | 清空链的计数器(匹配到的数据包的大小和总和)iptables -Z |
-S | 查看链的所有规则或者某个链的规则/某个具体规则后面跟编号 iptables -t nat -S、iptables -t nat -S POSTROUTING 1 |
常见控制类型 | |
对于防火墙,数据包的控制类型非常关键,直接关系到数据包的放行、封堵及做相应的日志记录等 | |
ACCEPT | 允许数据包通过 |
DROP | 直接丢弃数据包,不给出任何回应信息 |
REJECT | 拒绝数据包通过,必要时会给数据发送端一个响应信息 |
LOG | 在/var/log/messages 文件中记录日志信息 然后将数据包传递给下一条规则 |
SNAT | 修改数据包的源地址 |
DNAT | 修改数据包的目的地址 |
MASQUERADE(mɑːskəˈreɪd) | 伪装成一个非固定公网IP地址 |
注:
防火墙规则的“匹配即停止”对于 LOG 操作来说是一个特例,因为 LOG 只是一种辅助
动作,并没有真正处理数据包
iptables各字段解读
- pkts:对应规则匹配到的报文的个数。
- bytes:对应匹配到的报文包的大小总和。
- target:规则对应的target,往往表示规则对应的"动作",即规则匹配成功后需要采取的措施。
- prot:表示规则对应的协议,是否只针对某些协议应用此规则。
- opt:表示规则对应的选项。
- in:表示数据包由哪个接口(网卡)流入,我们可以设置通过哪块网卡流入的报文需要匹配当前规则。
- out:表示数据包由哪个接口(网卡)流出,我们可以设置通过哪块网卡流出的报文需要匹配当前规则。
- source:表示规则对应的源头地址,可以是一个IP,也可以是一个网段。
- destination:表示规则对应的目标地址。可以是一个IP,也可以是一个网段。
- packages:匹配到的包数量
- bytes:匹配到的总字节数
2.2 添加、查看、删除规则
2.2.1 添加
1|iptables -t filter -A INPUT -p icmp -j REJECT
2|如不指定表则默认时filter表
1|iptables -I INPUT 2 -p tcp --dport 22 -j ACCEPT
2|允许TCP22端口的目的地址通过
2.2.2 查看
iptables [-t表名] -n -L [链名] |[-- line-numbers]
iptables -vnL INPUT --line-numbers
2.2.3 删除
iptables -D INPUT 5
直接对对应编号进行删除,即可删除相应的规则
iptables -t filter -D INPUT -p icmp - j REJECT
将添加或插入时的命令换成-D即可(管理选项)
清空
iptables -F INPUT
注意:
- 若规则列表中有多条相同的规则时,按内容匹配只删除的序号最小的一条
- 按号码匹配删除时,确保规则号码小于等于已有规则数,否则报错
- 按内容匹配删数时,确保规则存在,否则报错
- 使用管理选项“-F”时,允许省略链名而清空指定表所有链的规则
- -F仅仅是清空链中的规则,并不影响-P设置的默认规则,默认规则需要手动进行修改
- -P设置了DROP后,使用-F 一定要小心!防止把允许远程连接的相关规则清除后导致无法远程连接主机,此情况如果没有保存规则可重启主机解决
- 如果不写表名和链名,默认清空filter表中所有链里的所有规则
2.2.4 设置默认策略
iptables [-t表名] -P <链名> <控制类型>
iptables -P INPUT DROP ##设置默认策略,丢弃
iptables -F ##输入没显示,表示删除所有规则
则xshell将连接不了
我这里之前清空过,则直接断链
注:
使用管理选项“-F”清空链时,默认策略不受影响。因此若要修改默认策略,必须通过管理选项“-P”重新进行设置。另外,默认策略并不参与链内规则的顺序编排, 因此在其他规则之前或之后设置并无区别。
2.3 规则的匹配条件
- 通用匹配
- 隐含匹配
- 显示匹配
2.3.1 通用匹配
可直接使用,不依赖于其他条件或扩展,包括网络协议、IP地址、网络接口等条件。
协议匹配: -p 协议名
地址匹配:-s 源地址、-d目的地址#可以是IP、网段、域名、空(任何地址)
接口匹配: -i入站网卡、-o出站网卡
iptables -A FORWARD ! -p icmp -j ACCEPT #除了icmp协议其他都可以转发
iptables -A INPUT -s 192.17.20.66 -j DROP #来着这个IP的数据包直接丢弃
iptables -I INPUT -i ens33 -s 192.168.80.0/24 -j DROP
#来自这个网段的网卡的数据包直接丢弃
iptables -I INPUT -p icmp -j DROP
iptables -I INPUT -p tcp --dport 22 -i ACCEPT
iptables -P INPUT
iptables -A FORWARD ! -p icmp -j ACCEPT
2.3.2 隐含匹配
要求以特定的协议匹配作为前提,包括端口、TCP标记、ICMP类型等条件
端口匹配:--sport 源端口、--dport 目的端口
#可以是个别端口、端口范围
--sport 1000 匹配源端口是1000的数据包
--sport 1000:3000 匹配源端口是1000-3000的数据包
--sport :3000 匹配源端口是3000及以下的数据包
--sport 1000: 匹配源端口是1000及以上的数据包
注意: --sport和--dport 必须配合-p <协议类型>使用
iptables -A INPUT -p tcp --sport 1000:3000 -j REJECT
#行尾添加端口号为1000-3000的tcp入站数据包可以通过
iptables -A INPUT -p tcp --dport 20:21 -j ACCEPT
iptables -I FORWARD -d 192.168.80.0/24 -p tcp --dport 24500:24600 -j DROP
iptables -A FORWARD -s 192.168.4.0/24 -p udp --dport 53 -j ACCEPT
扩展控制位(了解就行)
TCP标记匹配: --tcp-flags TCP标记
iptables -I INPUT -i ens33 -p tcp --tcp-flags SYN,RST,ACK SYN -j ACCEPT
#丢弃SYN请求包,放行其他包ICMP类型匹配: --icmp-type ICMP类型
#可以是字符串、数字代码
"Echo- Request" (代码为8)表示请求
"Echo- Reply" (代码为0)表示回显
"Dest ination-Unreachable" (代码为3)表示目标不可达
关于其它可用的ICMP协议类型,可以执行“iptables -p icmp -h”命令,查看帮助信息
2.3.3 显示匹配
要求以“-m扩展模块”的形式明确指出类型,包括多端口、MAC地址、IP范围、数据包状态等条件
多端口匹配:
- -m multiport --sport 源端口列表
- -m multiport --dport 目的端口列表
IP范围匹配:
- -m iprange --src-range IP范围
MAC地址匹配:
- -m mac --mac-source MAC地址
状态匹配:-m state --state 连接状态
常见的连接状态:
- NEW :与任何连接无关的,还没开始连接
- ESTABLISHED :响应请求或者已建立连接的,连接态
- RELATED :与已有连接有相关性的(如FTP主被动模式的数据连接),衍生态,一般与ESTABLISHED 配合使用
- INVALID:不能被识别属于哪个连接或没有任何状态S
2.4 控制类型(SNAT,DNAT)
2.4.1 SNAT
策略概述:
SNAT(Source Network Address Translation,源地址转换)是Linux防火墙的一种地址转换操作,也是iptables命令中的一种数据包控制类型,其作用是根据特定的条件修改数据包的源IP地址
应用环境:
局域网主机共享单个公网IP地址接入Internet (私有IP不能在Internet中正常路由)
SNAT原理:
源地址转换,根据指定条件修改数据包的源IP地址,通常被叫做源映谢
SNAT转换的前提条件:
- 局域网各主机已正确设置IP地址、子网掩码、默认网关地址
- Linux网关开启IP路由转发
注:linxu想系统本身是没有转发功能,只有路由发送数据
临时打开:
echo 1 > /proc/sys/net/ipv4/ip_forward
或
sysctl -w net.ipv4.ip_forward=1
永久打开:
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1 ##将此行写入配置文件
sysctl -p ##查看
SNAT转换1:固定的公网IP地址:
#配置SNAT策略,实现snat功能,将所有192.168.100.0这个网段的ip的源ip改为10.0.0.1
iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o ens33 -j SNAT --to 10.0.0.1
192.168.100.0/24:可换成单独IP
-o: 出站
ens33: 外网网卡
10.0.0.1: 外网IP
SNAT转换2:非固定的公网IP地址(共享动态IP地址):
iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o ens33 -j MASQUERADE
tips:一个IP地址做SNAT转换,一般可以让内网100到200 台主机实现上网
2.4.2 DNAT
应用环境:
在Internet中发布位于局域网内的服务器
原理:
目的地址转换,根据指定条件修改数据包的目的IP地址,保证了内网服务器的安全,通常被叫做目的映射
DNAT转换前提条件:
- 局域网的服务器能够访问Internet
- 网关的外网地址有正确的DNS解析记录
- Linux网关开启IP路由转发
Linux网关开启IP路由转发
vim /etc/sysctl.conf net.ipv4.ip_forward = 1 sysctl -p
DNAT转换1:发布内网的Web服务
#把从ens37进来的要访问web服务的数据包目的地址转换为192.168.100.13
iptables -t nat -A PREROUTING -i ens37 -d 10.0.0.1 -p tcp --dport 80 -j DNAT --to 192.168.100.13 或 iptables -t nat -A PREROUTING -i ens37 -d 10.0.0.1 -p tcp --dport 80 -j DNAT --to-destination 192.168.100.13
回包
iptables -t nat -A POSTROUTING -s 192.168.100.13 -o ens37 -j SNAT --to 10.0.0.1
入站外网网卡外网IP
内网服务器IP
iptables -t nat -A PREROUTING -i ens37 -p tcp --dport 80 -j DNAT --to 192.168.100.13-192.168.100.20
示例:
首先准备三台虚拟机,一台客户端,一台服务端,一台防火墙两网卡分别对应C/S。并且相互ping通
先启动Linux路由转发
DNAT转换2:发布时修改目标端口
#发布局域网内部的OpenSSH服务器,外网主机需使用250端口进行连接
iptables -t nat -A PREROUTING -i ens37 -d 10.0.0.1 -p tcp --dport 250 -j DNAT --to 192.168.100.13:22
入站外网网卡————外网IP————外网远程端口——————内网IP和远程端口号
#在外网环境中使用SSH测试
ssh -p 250 root@10.0.0.1 yum -y install net-tools #若没有ifconfig 命令可提前使用yum 进行安装 ifconfig ens33 iptables -nvL -t nat 查看
注意:
使用DNAT时,同时还有配合SNAT使用,才能实现响应数据包的正确返回
2.5 扩展
- 主机型防火墙:主要使用 INPUT、OUTPUT 链,设置规则时一般要详细的指定到端口
- 网络型防火墙:主要使用 FORWARD 链,设置规则时很少去指定到端口,一般指定到IP地址或者到网段即可
2.6 防火墙规则的备份和还原
导出(备份)所有表的规则
iptables-save > /opt/ipt.txt
导入(还原)规则
iptables-restore > /opt/ipt.txt
iptables自动还原
将iptables规则文件保存在/etc/sysconfig/iptables 中,iptables服务启动时会自动还原规则
- iptables-save > /etc/ sysconfig/ iptables
- systemctl stop iptables . #停止iptables服务会清空掉所有表的规则
- systemctl start iptables #启动iptables服务会自动还原/etc/sysconfig/iptables中的规则
示例详解
tcp | ip、icmp、arp、rarp和tcp、udp、icmp这些选项等都要放到第一个参数的位置,用来过滤数据报的类型 |
-i ens33 | 只抓经过接口ens33的包 |
-t | 不显示时间戳 |
-s 0 | 抓取数据包时默认抓取长度为68字节。加上-s0后可以抓到完整的数据包 |
-c100 | 只抓取100个数据包 |
dst port ! 22 | 不抓取目标端口是22的数据包 |
src net 192.168.1.0/24 | 数据包的源网络地址为192.168.1.0/24 |
-w ./target.cap | 保存成cap文件, 方便用ethereal (即wireshark)分析 |