I P T A B L E S
- 一、防火墙简介
- 1.1 netfilter
- 1.2 firewalld和iptables
- 二、iptables工具简述
- 2.1 定义
- 2.2 三种报文流向
- 2.3 iptables的表、链结构(非常重要)
- 2.3.1 "四表" ----- 规则表
- 2.3.2 "五链" ----- 规则链
- 三、iptables配置
- 3.1 基本语法
- 3.1.1 管理选项部分
- 3.1.2 匹配条件部分
- 3.1.3 处理动作部分
- 3.2 查看规则
- 3.3 添加规则
- 3.4 根据规则编号删除 清空 替换规则
- 3.4.1 查看规则编号
- 3.4.2 替换
- 3.4.3 删除
- 3.4.4 清空
- 3.5 默认策略
- 3.5.1 简介
- 3.5.2 查看与配置
- 3.6 基本匹配条件
- 3.7 扩展匹配条件
- 3.7.1 隐性
- .1 端口匹配
- .2 TCP标志匹配
- .3 ICMP类型匹配
- 3.7.2 显示扩展模块
- .1 multiport扩展 多端口
- .2 iprange扩展 IP范围
- .3 mac扩展 MAC地址(一般不用)
- .4 string扩展 字符串
- .5 time模块
- .6 connlimit扩展 连接数量
- .7 state 连接状态(重要)
- 4.1 SNAT
- 4.2 DNAT
- 4.3 配置实例
- 1) 前置准备
- .1 配置内网服务器
- .2 配置外网服务器
- .3 配置网关服务器
- 2)使用SNAT,使内网能够访问外网
- 3)使用DNAT,使外网能访问内网
一、防火墙简介
1.1 netfilter
Netfilter是一个Linux内核功能,用于在网络数据包从网络堆栈进入或离开时进行包过滤和操作。
Netfilter内称为防火墙的“内核态”。
1.2 firewalld和iptables
Firewalld和Iptables都不是防火墙,是防火墙管理工具,被称为防火墙的“用户态”。
Centos 7中默认管理防火墙规则的工具是firewalld。
二、iptables工具简述
2.1 定义
由软件包iptables提供的命令行工具。
工作在用户空间,用来编写规则,写好的规则被送往netfilter,告诉内核如何去处理信息包。
2.2 三种报文流向
- 流入本机:PREROUTING --> INPUT–>用户空间进程
- 流出本机:用户空间进程 -->OUTPUT–> POSTROUTING
- 转发:PREROUTING --> FORWARD --> POSTROUTING
#查看有没有安装
iptables --version
2.3 iptables的表、链结构(非常重要)
2.3.1 “四表” ----- 规则表
规则表 | 功能 |
---|---|
filter表 | 过滤规则表,根据预定义的规则过滤符合条件的数据包,默认表 |
nat表 | 地址转换规则表 |
mangle表 | 给数据包设置标记 |
raw表 | 关闭启用的连接跟踪机制,加快封包穿越防火墙速度 |
security | 表用于强制访问控制(MAC)网络规则,由Linux安全模块(如SELinux)实现 |
规则表间的顺序: raw --> mangle–> nat–>filter
规则表的作用:容纳各种规则链。
2.3.2 “五链” ----- 规则链
规则链 | 功能 |
---|---|
INPUT链 | 处理入站数据包 |
OUTPUT链 | 处理出站数据包 |
FORWARD链 | 处理转发数据包 |
PREROUTING链 | 在进行路由选择前处理数据包 |
PROROUTING链 | 在进行路由选择后处理数据包 |
规则链的作用:容纳各种防火墙规则,对数据包进行过滤或处理。
链的分类依据:处理数据包的不同时机。
三、iptables配置
#前期准备
systemctl stop firewalld
3.1 基本语法
iptables [-t 规则表] 管理选项 [规则链] [匹配条件] [-j 处理动作]iptables -t filter -A INPUT -s 192.168.0.1 - DROP
3.1.1 管理选项部分
管理选项 | 用法示例 |
---|---|
-A | 向规则链中添加一条规则,末尾追加 |
-I | 在规则链的指定位置插入一条规则,未指定序号默认作为第一条 |
-F | 清除链中所有规则 |
-P | 设置规则链的默认策略 |
-D | 从规则链中删除一条规则 |
-R | 替换规则链中的一条规则 |
-L | 列出规则链中的所有规则 |
-n | 所有字段以数字形式显示 |
-v | 显示详细信息 |
- -line-number | 查看规则编号 |
-N | 创建一个新的自定义规则链 |
-X | 删除一个自定义规则链 |
-Z | 清空规则链中所有规则的数据包和字节数统计 |
-S | 看链的所有规则或者某个链的规则/某个具体规则后面跟编号 |
-E | 重新命名规则链 |
#允许来自192.168.1.0/24子网的数据包进入INPUT链
iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT#删除允许来自192.168.1.0/24子网的数据包进入INPUT链的规则
iptables -D INPUT -s 192.168.1.0/24 -j ACCEPT#在INPUT链的第2条规则之前插入一条允许来自192.168.1.0/24子网的数据包进入的规则
iptables -I INPUT 2 -s 192.168.1.0/24 -j ACCEPT#将INPUT链中的第2条规则替换为拒绝来自192.168.1.0/24子网的数据包的规则
iptables -R INPUT 2 -s 192.168.1.0/24 -j DROP)
#列出INPUT链中的所有规则
iptables -L INPUT#清空INPUT链中的所有规则
iptables -F INPUT#清空INPUT链的数据包和字节数统计
iptables -Z INPUT#将INPUT链的默认策略设置为DROP,即拒绝所有数据包
iptables -P INPUT DROP#将FORWARD链重命名为NFORWARD
iptables -E FORWARD NFORWARD
#创建一个名为MYCHAIN的新规则链
iptables -N MYCHAIN
#删除名为MYCHAIN的自定义规则链
iptables -X MYCHAIN
3.1.2 匹配条件部分
指定匹配条件的选项 | 功能 |
---|---|
-p | 指定要匹配的 协议类型,例如TCP、UDP、ICMP等 |
-s | 指定 源IP地址或地址范围 |
-d | 指定 目标IP地址或地址范围 |
-i <网络接口> | 指定 输入网络接口 |
-o<网络接口> | 指定 输出网络接口 |
-m | 指定 扩展模块,用于进一步定义匹配条件 |
- -icmp-type | 指定ICMP类型 |
- -sport | 指定源端口号或端口范围 |
- - dport | 指定目标端口号或端口范围 |
3.1.3 处理动作部分
处理动作 | 功能 |
---|---|
DROP | 直接 丢弃数据包,不给出任何回应信息 |
REJECT | 拒绝数据包通过,会给数据发送端一个响应信息 |
ACCEPT | 允许数据包通过(默认) |
SNAT | 修改数据包的源地址 |
DNAT | 修改数据包的目的地址 |
LOG | 在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则 |
MASQUERADE | 伪装成一个非固定公网IP地址 |
3.2 查看规则
iptables -vnL #查看所有规则表的规则-v 详细信息
-n 数字形式显示
-L 查看规则列表
iptable -vnL -t [规则表] #查看规则表的规则链,默认filter表
3.3 添加规则
#一般只对INPUT和PREROUTING规则链进行处理
#不处理OUTPUT POSTROUTING FORWARD
#新增规则,filter表为例#拒绝来自 192.168.91.101的通信
iptables [-t filter] -A INPUT -s 192.168.2.100 -j DROP/REJECT
#插入规则#将IP地址为192.168.2.101的源地址的流量丢弃
iptables -I INPUT 编号 -s 192.168.2.101 -j DROP
3.4 根据规则编号删除 清空 替换规则
3.4.1 查看规则编号
iptables -vnL --line-numbers #查看规则编号
3.4.2 替换
iptables -R <规则链> <规则编号> <新规则>
#举个例子iptables -R INPUT 3 -p tcp --dport 22 -j ACCEPT
#替换INPUT链中第3条规则,将其内容改为允许TCP协议的SSH流量(端口22)通过
3.4.3 删除
iptables -D <规则链> <要删除的规则>或者iptables -D <规则链> n #n为规则编号
3.4.4 清空
iptables -F #清空除默认策略外的所有规则
3.5 默认策略
3.5.1 简介
默认策略是指当没有明确的匹配规则时,iptables 对进出系统的网络流量采取的默认处理方式。
有3种基本的默认策略:ACCEPT、DROP 和 REJECT。
-
ACCEPT:允许所有的数据包通过防火墙。
-
DROP:阻止所有的数据包通过防火墙。
-
REJECT:默认策略为 REJECT 与 DROP 类似,阻止所有的数据包通过防火墙。但不同的是,当数据包被拦截时,会向源主机发送一个拒绝响应消息。
3.5.2 查看与配置
查看
iptables -L #查看当前 iptables 的默认策略
设置默认策略
iptables -P INPUT <策略>
iptables -P OUTPUT <策略>
iptables -P FORWARD <策略>INPUT 是针对进入系统的数据包,
OUTPUT 是针对离开系统的数据包,
FORWARD 是针对通过系统的数据包
策略可以是 ACCEPT、DROP 或 REJECT
#举个例子## 允许SSH进入
iptables -A INPUT -p tcp --dport 22 -j ACCEPT# 允许HTTP和HTTPS流量
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
清空和删除
无法直接清空或者删除默认策略,iptables -F也不行。
只能将ACCEPT改成DROP/REJECT,或者反过来,某种意义上,也等同于删除
3.6 基本匹配条件
基本匹配条件 | 功能 |
---|---|
-s | 源IP地址或者不连续的IP地址 |
-d | 目标IP地址或者不连续的IP地址 |
-p | 指定协议 |
-i | 报文流入的接口;只能应用于数据报文流入环节, |
-o | 报文流出的接口;只能应用于数据报文流出的环节 |
3.7 扩展匹配条件
3.7.1 隐性
man iptables-extensions
查看扩展帮助
.1 端口匹配
--sport
和--dport
必须配合-p <协议类型>
使用
只能用于匹配连续的端口
--sport 源端口
--dport 目的端口
可以匹配单个端口,也可以匹配端口范围,以源端口匹配为例:
格式 | 含义 |
---|---|
–sport 1000 | 匹配源端口是1000的数据包 |
–sport 1000:3000 | 匹配源端口是1000-3000的数据包 |
–sport 1000: | 匹配源端口是1000及以上的数据包 |
–sport :3000 | 匹配源端口是3000及以下的数据包 |
.2 TCP标志匹配
--tcp-flags TCP标志
TCP标志 | 功能 |
---|---|
SYN(同步) | 用于建立连接。 |
ACK(确认) | 用于确认收到的数据。 |
FIN(结束) | 用于关闭连接。 |
RST(复位) | 用于重置连接。 |
URG(紧急) | 用于指示数据中有紧急数据部分。 |
PSH(推送) | 用于强制接收方立即处理数据。 |
#iptables允许通过来自ens33接口的,具有FIN、RST、ACK和SYN标志的TCP包
#只有SYN标志的TCP包,拒绝建立连接
iptables -I INPUT -i ens33 -p tcp \--tcp-flags FIN,RST,ACK SYN -j ACCEPT
.3 ICMP类型匹配
--icmp -type 0/3/8
代码 | 含义 |
---|---|
8 | “Echo- Request” 表示请求 |
0 | “Echo- Reply” 表示回复 |
3 | "Dest ination-Unreachable"表示目标不可达 |
举个例子#丢弃icmp的包,别人ping不通本机,本机也ping不通别人iptables -A INPUT -p icmp -j DROP
#禁止其他主机ping本机iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT #当本机ping不通其它主机时提示目标不可达,此时其它主机需要配置关于icmp协议的控制类型为REJECTiptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT
3.7.2 显示扩展模块
显示扩展必须加 -m
选项
.1 multiport扩展 多端口
可用于匹配非连续的端口,以离散的方式匹配,最多支持15个端口。
iptables -A INPUT -s 192.168.2.101 -p tcp -m \
multiport --dports 22,80,3306 -j REJECT
#拒绝来自源IP地址为192.168.2.101的TCP流量,并且目标端口号为22、80和3306
.2 iprange扩展 IP范围
iprange扩展功能模块用于在防火墙规则中匹配特定的IP地址范围。
基本格式
-m iprange --src-range IP范围
iptables -A INPUT -m ip range --src-range 192.168.91.101-192.168.91.103 -j REJECT
# 拒绝来自源IP地址范围为192.168.91.101到192.168.91.103的所有流量,并且应用于INPUT链(也就是进入服务器的流量)
iptables -A FORWARD -p udp -m iprange --src-range 192.168.80.100-192.168.80.200 -j DROP
#禁止转发源地址位于192.168.80.100-192.168.80.200的udp数据包
.3 mac扩展 MAC地址(一般不用)
mac模块用于匹配和处理MAC地址相关的防火墙规则,可以限制特定MAC地址的访问或过滤特定MAC地址的流量。
基本格式
-m mac --mac-source XX:XX:XX:XX:XX:XX #根据源MAC地址匹配
-m mac --mac-destination XX:XX:XX:XX:XX:XX#根据目标MAC地址匹配
.4 string扩展 字符串
string模块用于在数据包的内容中搜索指定的字符串,并根据匹配结果执行相应的操作。
基本格式
-m string --string 字符串 --algo bm/kmp
#bm kmp为字符串检测算法
iptables -A INPUT -p tcp --dport 80 -m string --string "example" --algo bm -j DROP
#对于目标端口为80的TCP流量,在数据包的内容中搜索字符串"example"
#如果匹配成功,则使用DROP动作丢弃该数据包
.5 time模块
time模块用于根据时间条件匹配数据包,可以限制特定时间段内进出防火墙的数据包。
基本格式
-m time --匹配选项 匹配条件
匹配选项 | 含义 |
---|---|
- -timestart | 指定开始时间 |
- -timestop | 指定结束时间 |
- -datestart | 指定开始日期 |
- -datestop | 指定结束日期 |
- -days | Mon-Fri |
iptables -A INPUT -m time --timestart 08:00 --timestop 17:00 \
--datestart 2023-08-01 --datestop 2023-08-31 --days Mon-Fri -j ACCEPT#在2023年8月1日至2023年8月31日期间的每个工作日的08:00至17:00之间,接受(ACCEPT)输入的数据
#如果不在指定的日期和时间范围内或不是工作日,则不匹配该规则
.6 connlimit扩展 连接数量
connlimit扩展模块用于限制连接数量,根据活动连接数量的条件来控制数据包的流动。
基本格式
-m connlimit --connlimit-匹配选项 匹配条件
匹配选项 | 功能 |
---|---|
above n | 指定连接数量超过n个时触发匹配 |
upto n | 指定连接数量小于n个时触发匹配 |
equal n | 指定连接数量等于n个时触发匹配 |
maks | 指定连接数量的掩码来匹配连接数量 |
举个例子iptables -A INPUT -p tcp --syn --dport 80 \
-m connlimit --connlimit-above 10 -j REJECT
#对于TCP协议、目标端口为80的数据包,如果活动连接的数量超过10个,则拒绝该连接iptables -A INPUT -p tcp --syn --dport 22 \
-m connlimit --connlimit-above 5 --connlimit-mask 16 -j REJECT
#对于TCP协议、目标端口为22(SSH)的数据包
#如果同一子网的连接数量超过5个,拒绝连接
.7 state 连接状态(重要)
state模块用于匹配连接的状态,根据连接的状态来过滤数据包。
基本格式--state state 连接状态
常见连接状态 | 含义 |
---|---|
NEW | 与任何连接无关的,还没开始连接 |
ESTABLISHED | 响应请求或者已建立连接的,连接态 |
RELATED | 与已有连接有相关性的(如FTP主被动模式的数据连接),衍生态,一般与ESTABLISHED 配合使用 |
INVALID | 不能被识别属于哪个连接或没有任何状态 |
UNTRACKED | 未进行追踪的连接,如:raw表中关闭追踪 |
举个例子iptables -A INPUT -m state --state NEW,ESTABLISHED -j ACCEPT
#对于输入的数据包,如果连接状态是NEW(新建连接)或ESTABLISHED(已建立连接),允许该数据包通过
四、SNAT和DNAT
4.1 SNAT
SNAT用于在网络中修改数据包的源IP地址。
SNAT是一种单向的地址转换技术,只会修改数据包的源IP地址,不会修改目的IP地址。
SNAT转换前提条件:
- 局域网各主机已正确设置IP地址、子网掩码、默认网关地址;
- Linux网关开启IP路由转发 。
4.2 DNAT
DNAT应用环境:在Internet中发布位于局域网内的服务器
DNAT原理:目的地址转换,根据指定条件修改数据包的目的IP地址,保证了内网服务器的安全,通常被叫做目的映射。
DNAT转换前提条件:
- 局域网的服务器能够访问Internet;
- 网关的外网地址有正确的DNS解析记录;
- Linux网关开启IP路由转发。
4.3 配置实例
centos7-1(内网服务器) ens33 192.168.2.100
centos7-2 (网关服务器) ens36 仅主机 12.0.0.1 ens33 192.168.2.102
centos7-3(外网服务器) ens33 仅主机 12.0.0.10
1) 前置准备
#关闭三个虚拟机的防火墙和selinux
systemctl stop firewalld
setenforce
.1 配置内网服务器
将内网服务器的网关修改为网关服务器的IP地址
systemctl restart network #重启网络服务
.2 配置外网服务器
修改为仅主机模式
修改IP地址为12.0.0.10
systemctl restart network #重启网络服务
.3 配置网关服务器
(1)添加新网卡,改为仅主机模式
(2)配置新网卡,IP地址为12.0.0.1
systemctl restart network #重启网络服务
(3)开启网关服务器的路由转发功能
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1 #将此行写入配置文件sysctl -p #读取修改后的配置
(4)清空防火墙配置
iptables -F
2)使用SNAT,使内网能够访问外网
(1)在网关服务器添加规则
iptables -t nat -A POSTROUTING -o ens36 -s 192.168.2.0/24 -j SNAT --to 12.0.0.1
(2)内网ping外网,检测连通性
3)使用DNAT,使外网能访问内网
(1)在网关服务器添加规则
iptables -t nat -A PREROUTING -i ens36 -s 12.0.0.0/24 -p tcp --dport 80-j DNAT --to 192.168.2.100
(2)在内网服务器启动httpd服务
yum install -y httpd vim /var/www/html/index.html
byyd yyds #访问显示内容systemctl start httpd
(3)外网服务器访问网关服务器的ens36,检查DNAT是否成功
#补充知识
#字符界面 但是需要用到图形化时
yum install x11-forwarding -y #systemctl start firewalldexport DISPLAY=192.168.2.1:0.0
#真机地址yum install firewall-config -ysystem-config-firewall