Linux网络服务之防火墙
目录
一.Linux防火墙的基本认识
1.1Netfilter
Linux防火墙是由Netfilter组件提供的,Netfilter工作在内核空间,集成在linux内核中,是linux内核的一个子系统。
1.2 防火墙工具介绍
1.2.1 iptables
由软件包iptables提供的命令行工具,工作在用户空间,用来编写规则,写好的规则被送往netfilter,告诉内核如何去处理信息包。
1.2.2 firewalld
从CentOS 7 版开始引入了新的前端管理工具。
1.3netfilter中五个勾子函数和三种报文流向
1.3.1五个勾子函数
Netfilter 在 Linux 内核协议栈中预设了 5 个钩子点(Hook Points),数据包经过时会触发这些钩子,从而执行相关的防火墙规则(如过滤、NAT、修改等)。
| 钩子名称 | 触发时机 | 典型用途 |
|---|---|---|
| PREROUTING | 数据包刚进入网络层(路由之前) | DNAT、raw 处理(如连接跟踪绕过) |
| INPUT | 数据包目标是本机(路由之后) | 过滤进入本机的流量(如 SSH、HTTP) |
| FORWARD | 数据包需要被转发(经过本机) | 过滤转发的流量(如路由器) |
| OUTPUT | 本机进程发出的数据包(路由之前) | 过滤本机发出的流量 |
| POSTROUTING | 数据包离开网络层(路由之后) | SNAT、MASQUERADE(IP 伪装) |
1.3.2三种报文流向

流入本机:PREROUTING --> INPUT-->用户空间进程(访问我的服务, 访问我系统中的应用)
流出本机:用户空间进程 -->OUTPUT--> POSTROUTING(我系统应用发出去的包)
转发:PREROUTING --> FORWARD --> POSTROUTING(分摊流量转发的流量)
二.iptables工具简述
2.1定义
iptables 是 Linux 系统中最经典的防火墙配置工具,基于 Netfilter 框架,用于管理内核中的网络包过滤规则。它通过定义规则(Rules)、链(Chains)和表(Tables)来控制数据包的流向、修改或丢弃,通常位于/sbin/iptables目录下。
2.2核心概念

iptables由四个表table和五个链chain以及一些规则组成
(1) 表(Tables)
iptables 使用不同的表来分类规则功能:
| 表名 | 主要功能 | 常见用途 |
|---|---|---|
| filter | 默认表,用于包过滤(允许/拒绝) | 防火墙规则(INPUT/OUTPUT/FORWARD) |
| nat | 网络地址转换(NAT) | 端口转发、IP 伪装(SNAT/DNAT) |
| mangle | 修改数据包头部(TTL、TOS 等) | 流量标记、策略路由 |
| raw | 绕过连接跟踪(conntrack) | 高性能场景或特殊包处理 |
优先级: security -->raw-->mangle-->nat-->filter
(2) 链(Chains)
每个表中包含预定义的链,对应 Netfilter 的钩子点:
| 链名 | 触发时机 | 常用表 |
|---|---|---|
| PREROUTING | 数据包进入网络层(路由前) | nat, mangle, raw |
| INPUT | 目标为本机的数据包 | filter, mangle |
| FORWARD | 经过本机转发的数据包 | filter, mangle |
| OUTPUT | 本机进程发出的数据包 | filter, nat, mangle |
| POSTROUTING | 数据包离开网络层(路由后) | nat, mangle |
三.iptables配置
注意:CentOS7默认使用firewalld防火墙,没有安装iptables,若想使用iptables防火墙。必须先关闭firewalld防火墙,再安装iptables。
3.1基本语法
iptables [-t 规则表] 管理选项 [规则链] [匹配条件] [-j 处理动作]
参数说明
| 参数 | 作用 |
|---|---|
-t 规则表 | 指定操作的表(filter、nat、mangle、raw),默认 filter |
| 管理选项 | 对规则或链的操作(如添加、删除、查看等) |
| 规则链 | 指定规则所属的链(INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING) |
| 匹配条件 | 指定规则匹配的数据包特征(如源IP、目标端口、协议等) |
-j 动作 | 匹配规则后的处理动作(ACCEPT、DROP、REJECT、LOG 等) |
3.1.1 管理选项部分
| 管理选项 | 用法示例 |
|---|---|
| -A | 在指定链末尾追加一条 iptables -A INPUT (操作) |
| -I | 在指定链中插入一条新的,未指定序号默认作为第一条 iptables -I INPUT 编号 |
| -P | 指定默认规则 iptables -P OUTPUT ACCEPT (操作) |
| -D | 删除 iptables -t nat -D INPUT 2 (操作) |
| -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 (操作) |
| -N | 新加自定义链 |
| -X | 清空自定义链的规则,不影响其他链 iptables -X |
| -Z | 清空链的计数器(匹配到的数据包的大小和总和)iptables -t filter -Z INPUT |
| -E | 修改自定义链的名称 |
| -S | 看链的所有规则或者某个链的规则/某个具体规则后面跟编号 |
3.1.2 匹配条件部分(基础)
| 匹配类型 | 用法示例 |
|---|---|
协议 (-p) | 指定要匹配的 协议类型,例如TCP、UDP、ICMP等 |
源/目标IP (-s, -d) | 指定 源/目标P地址或地址范围 |
接口 (-i, -o) | 指定 输入/输出网络接口 |
3.1.3 处理动作部分
| 处理动作 | 用法示例 |
|---|---|
ACCEPT | 允许数据包通过 |
DROP | 静默丢弃数据包 |
REJECT | 拒绝并返回错误 |
LOG | 记录日志 |
DNAT | 目标地址转换(端口转发) |
SNAT | 源地址转换(共享上网) |
MASQUERADE | 伪装成一个非固定公网IP地址 |
REDIRECT | 端口重定向(透明代理) |
RETURN | 返回上一级链 |
iptables -t filter -A INPUT -s 192.168.91.101 -j DROP
#拒绝所有来自IP地址192.168.91.101的入站流量,且不返回任何响应
iptables -I INPUT 2 -s 192.168.91.101 -j DROP
#在INPUT链的第2条位置插入一条规则,丢弃来自192.168.91.101的所有入站数据包。
iptables -I INPUT -s 192.168.91.101 -j DROP
#在INPUT链的最前面(第1条位置)插入一条规则,丢弃来自192.168.91.101的所有入站数据包。
iptables -D INPUT 2
#删除INPUT链中的第2条规则(按规则序号删除)。
iptables -D INPUT -s 192.168.91.101 -j REJECT
#删除INPUT链中匹配条件为 -s 192.168.91.101 -j REJECT的规则(按规则内容删除)。
iptables -t 表名 -F
#清空指定表(-t)中所有链的规则(Flush)
iptables -t filter -R INPUT 1 -s 192.168.91.0/24 -j ACCEPT
#替换filter表中INPUT链的第1条规则,将其修改为允许来自192.168.91.0/24网段的所有入站流量
iptables -P INPUT DROP
#设置 INPUT 链的默认策略为 DROP。
iptables -t filter -P FORWARD DROP
#设置 filter 表中 FORWARD 链的默认策略为 DROP。
iptables -P OUTPUT ACCEPT
#设置 OUTPUT 链的默认策略为 ACCEPT。
iptables -vnL
#显示filter表中所有规则 v详细信息 n是数字形式显示
iptables -vnL --line-numbers
#显示规则编号
3.2默认策略
默认策略是 iptables 链(Chain) 的最终处理动作,当数据包不匹配任何规则时,将按照默认策略执行。默认策略是防火墙的最后一道防线,直接影响未明确允许或拒绝的流量。
有3种基本的默认策略:ACCEPT、DROP 和 REJECT。
| 策略 | 效果 |
|---|---|
ACCEPT | 允许 未匹配的数据包通过(宽松模式,不安全)。 |
DROP | 静默丢弃 未匹配的数据包(不返回任何响应,推荐用于安全防护)。 |
REJECT | 拒绝并返回错误(如 ICMP port unreachable,适用于调试)。 |
3.2.1查看默认策略
iptables -L #查看当前 iptables 的默认策略
3.2.2设置默认策略
#设置默认策略的命令格式
iptables -P <链名> <默认动作>
<链名>:可以是 INPUT、OUTPUT、FORWARD 等内置链。
<默认动作>:通常是 ACCEPT(允许)、DROP(丢弃)或 REJECT(拒绝并返回错误)。
3.2.3删除默认策略
在 iptables 中,默认策略(Default Policy) 并不是一条具体的规则,而是链的默认行为。因此无法直接清空或者删除默认策略,iptables -F也不行。
只能将原本ACCEPT改成DROP/REJECT,原本DROP/REJECT改成ACCEPT,某种意义上,也等同于删除
3.3扩展匹配条件
在 iptables 中,匹配条件用于定义哪些数据包会被规则处理,主要分为 基础匹配条件 和 扩展匹配条件 两类。它们的核心区别在于 是否需要额外内核模块支持 以及 功能的复杂度。
3.3.1基础和扩展匹配条件的区别
| 对比项 | 基础匹配条件 | 扩展匹配条件 |
|---|---|---|
是否需要 -m | 否 | 是(如 -m conntrack) |
| 功能复杂度 | 简单(IP/端口/协议) | 复杂(状态、内容、时间、限速等) |
| 性能影响 | 低(内核原生支持) | 中高(需额外模块处理) |
| 典型用途 | 基础流量放行/拒绝 | 高级安全策略、流量整形、防攻击 |
而扩展模块中又分为显式和隐式
3.3.2显式和隐式的关键区别
| 特性 | 显式扩展 | 隐式扩展 |
|---|---|---|
| 加载方式 | 必须用 -m 声明 | 自动加载 |
| 使用场景 | 复杂功能(如状态跟踪) | 基础功能(如端口、协议) |
| 示例 | -m conntrack --ctstate | -p tcp --dport |
为什么需要区分?
-
显式扩展:明确告知管理员使用了哪些高级功能,便于审计和调试。
-
隐式扩展:简化基础规则的编写,降低学习成本。
3.3.3隐式扩展模块
在 iptables 中,隐式扩展模块(Implicit Match Extensions)是指那些无需通过 -m 或 --match 显式加载,而是由 iptables 根据协议(-p)或特定选项自动调用的匹配模块。
1. TCP 模块 (-p tcp)
当使用 -p tcp 时,iptables 会自动加载 tcp 模块,支持以下隐式匹配选项:
常用选项
-
--sport或--source-port:匹配源端口(或端口范围,如--sport 1000:2000)。 -
--dport或--destination-port:匹配目标端口。 -
--tcp-flags:匹配 TCP 标志(如SYN,ACK,FIN,RST)。 -
--syn:匹配SYN=1,ACK=0的数据包(用于阻止新连接)。(了解)
注意:端口范围的表达方式
以sport为例
--sport 1000 匹配源端口是1000的数据包
--sport 1000:3000 匹配源端口是1000-3000的数据包
--sport :3000 匹配源端口是3000及以下的数据包
--sport 1000: 匹配源端口是1000及以上的数据包
iptables -A INPUT -p tcp --sport 5000:6000 -j ACCEPT
#允许来自外部网络端口在[5000, 6000]内的目标设备发送至本机的数据包通过
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
#允许所有通过TCP协议访问本机80端口的入站流量
iptables -A INPUT -p tcp --tcp-flags SYN,ACK,FIN,RST SYN -j DROP
#丢弃所有 TCP 协议的初始连接请求(SYN 包)
2. UDP 模块 (-p udp)
当使用 -p udp 时,iptables 会自动加载 udp 模块,支持以下隐式匹配选项:
常用选项
-
--sport/--source-port:匹配源端口。 -
--dport/--destination-port:匹配目标端口。
iptables -A INPUT -p udp --dport 53 -j ACCEPT
#允许接收UDP协议53端口的数据包
iptables -A INPUT -p udp --sport 0:1024 -j DROP
#丢弃源端口为0-1024的所有UDP流量
3. ICMP 模块 (-p icmp)
当使用 -p icmp 时,iptables 会自动加载 icmp 模块,支持以下隐式匹配选项:
常用选项
-
--icmp-type:匹配 ICMP 类型(如8=ping 请求,0=ping 回复)。
#A可以ping通B B 不可以ping通A
iptables -A INPUT -s 192.168.91.101 -j REJECT 双方都不可以ping拒绝请求包
iptables -A INPUT -s 192.168.91.101 -p icmp --icmp-type 8 -j REJECT
允许A向B发送ping请求
iptables -A OUTPUT -d 192.168.91.101 -p icmp --icmp-type 8 -j DROP
阻止B主动向A发送ping请求
4. 多端口匹配(multiport 模块的特殊情况)
虽然 multiport 通常是显式扩展(-m multiport),但在某些情况下,iptables 允许直接使用 --dports 或 --sports 进行多端口匹配(部分版本支持隐式调用)
3.3.4显示扩展模块
1. 状态跟踪(state )
state模块用于跟踪和管理网络连接的状态
基本格式
--state state 连接状态
| 连接状态 | 含义 |
|---|---|
NEW | 新发起的连接(如 TCP 的 SYN 包) |
ESTABLISHED | 已建立的连接(完成握手,如 TCP 的 SYN-ACK) |
RELATED | 与现有连接相关的辅助连接(如 FTP 数据通道、ICMP 错误) |
INVALID | 无效或异常的数据包(如伪造的 SYN-ACK) |
UNTRACKED | 没有进行跟踪的连接 如:raw表中关闭追踪 |
iptables -A INPUT -p tcp --dport 80 -m state --state NEW -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -m state --state NEW -j ACCEPT
# 允许新的HTTP(80)和HTTPS(443)连接请求
2.多端口匹配(multiport)
multiport模块用于同时匹配多个端口(避免写多条规则),其中端口必须是非连续的,以离散的方式匹配,最多支持15个端口。
基本格式
-m multiport --dports /--sports 端口号,端口号,端口号
# 允许访问目标端口80(HTTP)、443(HTTPS)、22(SSH)
iptables -A INPUT -p tcp -m multiport --dports 22,80,443 -j ACCEPT
# 允许源端口为5000-6000或8000的UDP流量
iptables -A INPUT -p udp -m multiport --sports 5000:6000,8000 -j ACCEPT
3.IP 范围匹配(iprange)
iprange模块用于匹配源或目标 IP 地址范围。
常用选项:
--src-range(源 IP 范围)、--dst-range(目标 IP 范围)。
基本格式
-m iprange --src-range IP范围
-m iprange --dst-range IP范围
# 允许 192.168.1.100 ~ 192.168.1.200 访问本机 SSH(22端口)
iptables -A INPUT -p tcp --dport 22 -m iprange --src-range 192.168.1.100-192.168.1.200 -j ACCEPT
# 阻止本机访问 10.0.0.1 ~ 10.0.0.50 的 HTTP(80端口)
iptables -A OUTPUT -p tcp --dport 80 -m iprange --dst-range 10.0.0.1-10.0.0.50 -j DROP
4.限速控制(limit)
limit模块用于限制数据包的匹配速率(防止洪水攻击)。
基本格式
-m limit --limit (单位时间内允许的包数,如 5/sec)
iptables -A INPUT -p tcp --dport 22 -m limit --limit 3/minute -j ACCEPT
#每分钟最多允许3个SSH连接尝试
5.MAC 地址匹配(mac)(不常使用)
MAC模块用于处理与MAC地址有关的防火墙规则,可以限制特定MAC地址的访问或过滤特定MAC地址的流量。
基本格式
-m mac --mac-source MAC地址 #根据源MAC地址匹配
-m mac --mac-destination MAC地址 #根据目标MAC地址匹配
iptables -A INPUT -p tcp --dport 22 -m mac --mac-source 00:1A:2B:3C:4D:5E -j ACCEPT
#允许MAC地址为00:1A:2B:3C:4D:5E的设备连接SSH(22 端口)
6.字符串匹配(string)
string模块用于匹配数据包中的特定字符串。
基本格式
-m string --string "要匹配的字符串" --algo bm/kmp
#bm kmp为字符串检测算法
iptables -A OUTPUT -p udp --dport 53 -m string --string "blocked.com" --algo bm -j DROP
#阻止本机向 DNS 服务器查询 "blocked.com"
iptables -A FORWARD -p tcp -m string --string "BitTorrent" --algo bm -j REJECT
iptables -A FORWARD -p udp -m string --string "BitTorrent" --algo bm -j REJECT
#阻止包含 "BitTorrent" 字符串的 TCP/UDP 流量
7. 时间匹配(time)
time模块用于基于时间段的规则,可以限制特定时间段内进出防火墙的数据包。
基本格式
-m time --匹配选项 时间
| 匹配选项 | 含义 | 格式示例 |
|---|---|---|
--timestart | 规则生效的起始时间 | --timestart 09:00 |
--timestop | 规则生效的结束时间 | --timestop 18:00 |
--weekdays | 指定生效的星期(可单日或范围) | --weekdays Mon,Fri 或 --weekdays Mon-Fri |
--monthdays | 指定生效的日期(每月几号) | --monthdays 1,15 或 --monthdays 10-20 |
--datestart | 规则生效的起始日期(年月日) | --datestart 2025-01-01 |
--datestop | 规则生效的结束日期(年月日) | --datestop 2025-01-02 |
--utc | 使用 UTC 时间(默认使用系统本地时间) | --utc |
--localtz | 使用系统本地时区(默认行为,与 --utc 互斥) | --localtz |
8. 连接数限制(connlimit)
connlimit模块用于限制单个 IP 的连接数(防止 DDoS)。
基本格式
-m connlimit --connlimit-匹配选项 匹配条件
| 选项 | 作用 |
|---|---|
-above | 限制大于指定数量的连接(触发动作) |
-mask | 按IP段限制(掩码位数,类似子网划分) |
-upto | 限制 小于 指定数量的连接(触发动作) |
-equal | 限制 等于 指定数量的连接(触发动作) |
iptables -A INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 -j DROP
#每个 IP 最多允许 3 个 SSH 连接,超过的直接丢弃。
四.SNAT和DNAT
4.1定义
SNAT (源地址转换)
定义:修改数据包的源IP地址,通常用于内网设备访问外网。
DNAT (目的地址转换)
定义:修改数据包的目的IP地址,通常用于将外部请求转发到内网特定设备。
4.2SNAT技术
要求:当192.168.52.100去访问外网服务器12.0.0.100时会将内网地址换成外网地址12.0.0.254

4.3SNAT功能实现
1.关闭三个虚拟机的防火墙和selinux
systemctl stop firewalld
setenforce 0
2 .下载apache2和httpd
apt install apache2 -y #在外网服务器
apt install apache2 -y #在网关服务器
yum install httpd -y #在内网服务器
3.配置IP地址和网关
配置对象:外网服务器
#外网服务器
vim /etc/netplan/00-installer-config.yaml
network:
ethernets:
ens33:
dhcp4: no
addresses:
- 12.0.0.100/24
gateway4: 12.0.0.254
nameservers:
addresses: [218.2.135.1,114.114.114.114]
version: 2
netplan apply #加载并应用新配置


配置虚拟网络适配器

完成以上操作后Xshell会断开,使用远程登录命令:ssh 12.0.0.100 可以重新连接上Xshell

配置对象:网关服务器
首先添加一块网卡,网络连接为仅主机模式

vim /etc/netplan/00-installer-config.yaml
network:
ethernets:
ens33:
dhcp4: no
addresses:
- 192.168.52.31/24
gateway4: 192.168.52.31 #自己就是网关
nameservers:
addresses: [8.8.8.8,114.114.114.114]
ens37: #注意网关名称,我的是ens37
dhcp4: no
addresses:
- 12.0.0.254/24
gateway4: 12.0.0.254 #自己就是网关
nameservers:
addresses: [8.8.8.8,114.114.114.114]
version: 2
netplan apply
同理使用ssh 192.168.52.31 重新登录Xshell
配置对象:内网服务器
vim /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=ecb1bac7-1759-49fc-93f5-f377338d02a2
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.52.100
NETMASK=255.255.255.0
GATEWAY=192.168.52.31 #修改网关
DNS1=218.2.135.1
DNS2=8.8.8.8
systemctl restart network #重启网络

4.开启网关服务器的路由转发功能
vim /etc/sysctl.conf #打开系统内核参数配置文件
net.ipv4.ip_forward = 1 #将此行写入配置文件,,启用 IPv4 数据包转发功能
sysctl -p #重新加载/etc/sysctl.conf中的配置,使修改立即生效


5.修改Apache2的配置文件
cd /var/www/html #进入Apache的默认网站根目录。
ls #会显示默认文件index.html
echo "dhf dhf dhf" > index.html #向index.html文件写入内容 "dhf dhf dhf",覆盖原有内容
curl 127.0.0.1 #测试Apache是否返回新修改的index.html
#会显示 dhf dhf dhf
6. 在网关服务器添加规则
iptables -t nat -A POSTROUTING -o ens37 -s 192.168.52.0/24 -j SNAT --to-source 12.0.0.254
为了更好呈现实验结果,还需要在外网客户端添加一条访问监控命令
tail -f /var/log/apache2/access.log
#是一个用于实时监控Apache访问日志的Linux命令,主要用于查看网站的访问情况。
7.配置完毕,进行访问操作
curl 12.0.0.100 #在内网服务器,通过curl命令访问内网的HTTP请求

4.4DNAT技术

要求:
- 当12.0.0.100去访问网关服务器12.0.0.254的80端口等于访问内网服务器192.168.52.100的80端口
- 当12.0.0.100去访问网关服务器12.0.0.254的80端口等于访问内网服务器192.168.52.100的8080端口
4.5DNAT功能实现
实现要求一:
1.配置内网服务器
systemctl start httpd #开启之前下载的httpd
cd /var/www/html #切换到Apache的默认网站根目录
vim index.html #创建index.html文件。
dhf2025
dhf2025
dhf2025
dhf2025

2.在网关服务器添加规则
iptables -t nat -F #清空已有规则
iptables -t nat -A PREROUTING -i ens37 -d 12.0.0.254 -p tcp --dport 80 -j DNAT --to 192.168.52.100
#用于配置DNAT(目标地址转换)规则,将进入指定接口的TCP 80端口流量转发到内部服务器

3.实验验证
#在外网服务器
curl 12.0.0.254
#向IP地址12.0.0.254的默认HTTP端口(80)发送GET请求。
curl 192.168.52.100
#向内网IP地址192.168.52.100的默认HTTP端口(80)发送GET请求。
实现要求二:
1.在内网服务器配置
vim /etc/httpd/conf/httpd.conf
#编辑Apache的主配置文件
Listen 8080
#将 Apache 的监听端口从默认的 80 改为 8080
systemctl restart httpd.service
#重启服务

2.在网关服务器
iptables -t nat -A PREROUTING -i ens37 -d 12.0.0.254 -p tcp --dport 80 -j DNAT --to 192.168.52.100:8080
#将从ens37网卡进入、目标为12.0.0.254:80的TCP流量,转发到内网服务器192.168.52.100:8080
iptables -t nat -D PREROUTING 1
#因为新添加的规则匹配条件和上一条规则相同,所以必须删除上一条添加的DNAT规则,不然新添加的规则不会生效

3.实验证明
在内网服务器
curl 12.0.0.254
#向网关服务器的8080端口发送GET请求。
curl 192.168.52.100:8080
#向内网服务器的8080端口发送GET请求。

更多推荐
所有评论(0)