防火墙概述
文章目录
防火墙是位于内部网络与外部网络之间的安全防护系统,依据预设规则审查、允许或拒绝数据传输。
防火墙种类及使用说明
硬件防火墙(企业级网络入口防护)
- 定位:部署在企业网络的核心入口,承担大规模流量的安全过滤,属于物理设备级的防护。
- 细分组件:
- 三层路由 :负责网络层的路由转发,代表厂商有H3C、华为、Cisco(思科),这些厂商的设备具备强路由性能,是企业骨干网络的基础组件。
- 专业防火墙 :专注于安全策略执行,代表厂商有深信服、奇安信、绿盟 ,还有国际厂商Juniper,这类设备性能强劲,能处理高吞吐量的网络流量并抵御复杂攻击。
二、软件防火墙(开源 / 终端级防护,部署灵活)
- 定位:以软件形式安装在服务器或终端系统中,成本低、配置灵活,适用于小型网络或特定设备的精细化防护。
- 代表工具:
- iptables:Linux 内核级的防火墙工具,直接写入内核层,对性能影响小,还能为 Docker 容器服务(主要工作在网络 4 层,即传输层)。
- firewalld :CentOS 7 系统的默认防火墙工具,底层依赖 iptables,操作更轻量化,适合 CentOS 生态的服务器。
- nftables:为替代 iptables 设计的新一代工具,在 CentOS 8、9 中应用,性能和易用性更优。
- ufw(Ubuntu Firewall):Ubuntu 系统的专用防火墙工具,配置简单,面向 Ubuntu 服务器或桌面用户。
- 典型场景:网站内部的 IP 封禁、小型业务系统的访问控制等。
三、云防火墙(公有云场景下的弹性防护)
- 定位:部署在公有云平台上,无需本地硬件,按需付费且弹性扩容,适配云端资产和分布式网络架构。
- 以阿里云为例的组件:
- 安全组:最基础的云防火墙功能,通过 "封 IP、封端口" 的规则,控制云服务器的出入流量。
- NAT 网关:实现云端的 "共享上网、端口映射",同时隐藏内部网络结构,提升安全性。
- WAF 应用防火墙:集成在云平台的 Web 应用防护层,防御针对网站的应用层攻击。
- DDoS 高防:专门抵御分布式拒绝服务攻击,保障云端业务的可用性。
四、WAF 防火墙(Web 应用层 7 层防护)
- 定位 :专注于 Web 应用的7 层(应用层)攻击防御,针对 HTTP/HTTPS 协议,抵御 SQL 注入、XSS(跨站脚本)、恶意爬虫等攻击。
- 核心要求:需要 "书写规则"------ 即通过定义攻击特征(如 SQL 注入的语法模式、XSS 的脚本特征),精准识别并拦截攻击行为,规则需描述 "攻击过程、关键提示、关键操作" 以确保防护有效性。
SQL注入
SQL 注入是一种常见的 Web 应用安全漏洞,指攻击者通过构造恶意 SQL 语句,利用应用程序对用户输入验证不足的缺陷,非法操作数据库(如读取、篡改、删除数据,甚至控制服务器)。
一、核心原理
应用程序在拼接 SQL 语句时,若直接将用户输入的内容嵌入语句中,且未做过滤或转义,攻击者可通过构造特殊输入(如包含 SQL 关键字、逻辑运算符的字符串),让数据库执行非预期的 SQL 命令。
bash
企业选型建议:
中小企业:使用公有云,安全组,waf防火墙,态势感知
访问量巨大:使用硬件防火墙,waf防火墙,硬件服务器+云服务器
必须熟悉的名词
| 概念 | 定义 |
|---|---|
| 容器 | 可理解为链是规则的容器 ,表是链的容器 |
| 表(table) | 是功能分类的容器,每个表负责一类网络功能,包含多条 "链"。 |
| 链(chain) | 是规则的容器,是一组规则的有序集合,数据包会按链的顺序依次匹配规则 |
| 规则(policy) | 链中的具体策略,由 "匹配条件" 和 "动作" 组成。 |
iptables执行过程

工作流程:
- 防火墙是层层过滤的,实际是按照配置规则的顺序从上到下,从前到后过滤的
- 如果匹配成功规则,及明确表示是拒绝(DROP)还是接受(ACCEPT),数据包就不再向下匹配新的规则。
- 如果规则中没有明确表面是阻止还是通过的,也就是没有匹配规则,向下进行匹配,直到匹配默认规则得到明确的阻止还是通过.
- 防火墙的默认规则是所有规则都匹配完才会匹配的。
表与链
包含 4 类核心表:
-
filter:最常用,负责流量过滤(允许 / 拒绝),含INPUT/OUTPUT/FORWARD链; -
nat:处理网络地址转换(如端口映射、IP 伪装),含PREROUTING/POSTROUTING/OUTPUT链; -
mangle:修改数据包头部(如 TTL、优先级),用于流量标记; -
raw:关闭连接跟踪,提升高吞吐量场景(如 DNS)性能。
在 iptables 中,5 条核心内置链是数据包处理流程的关键节点,分别对应 "入站预处理、入站过滤、转发、出站过滤、出站后处理" 五个阶段,以下是详细说明:
| 链名称 | 所属主要表 | 功能说明 |
|---|---|---|
| PREROUTING | nat、mangle、raw |
数据包到达网卡后、路由判断前 执行的规则,用于修改目的地址 / 端口(如端口映射) |
| INPUT | filter、mangle |
处理目标地址是本机的数据包,决定是否允许数据包进入本机服务 |
| FORWARD | filter、mangle |
处理流经本机转发的数据包(本机作为路由器时生效) |
| OUTPUT | nat、filter、mangle |
处理本机主动发起的数据包,决定是否允许数据包从本机发出 |
| POSTROUTING | nat、mangle |
数据包离开网卡前、路由判断后 执行的规则,用于修改源地址 / 端口(如 IP 伪装) |
filter表
-
iptables默认的表,filter表示过滤 -
实现防火墙功能:(对数据包的filter过滤)屏蔽或准许,端口,ip
| filter 表 | 主要和主机自身相关,真正负责主机防火墙功能(过滤流入流出主机的数据包)。是 iptables 默认使用的表,定义了三个链。企业场景:主机防火墙 |
|---|---|
| INPUT | 负责过滤所有目标地址是本机地址的数据包,通俗来说就是过滤进入主机的数据包(能否让数据包进入服务器) |
| FORWARD | 负责转发流经主机的数据包,起转发作用,和 NAT 关系很大(如 LVS NAT 模式,涉及 net.ipv4.ip_forward=0 配置) |
| OUTPUT | 处理所有源地址是本机地址的数据包,通俗的讲就是处理从主机发出去的数据包 |
nat表
- 实现共享上网(内网服务器上外网)
- 端口映射和ip映射
| 概念 | 说明 |
|---|---|
| nat | 负责网络地址转换,即来源与目的 IP 地址和 port 的转换。应用:和主机本身无关,一般用于局域网共享上网或者特殊的端口转换服务相关。工作场景:1. 用于企业路由(zebra)或网关(iptables),共享上网(POSTROUTING);2. 做内部外部 IP 地址一对一映射(dmz),硬件防火墙映射 IP 到内部服务器,ftp 服务(PREROUTING);3.WEB,单个端口的映射,直接映射 80 端口(PREROUTING)。这个表定义了 3 个链,nat 功能相当于网络的 acl 控制,和网络交换机 acl 类似。 |
| OUTPUT | 和主机放出去的数据包有关,改变主机发出数据包的目的地址。 |
| PREROUTING | 在数据包到达防火墙时,进行路由判断之前执行的规则,作用是改变数据包的目的地址、目的端口等。就是收信时,根据规则重写收件人的地址。例如:把公网 IP:xxx.xxx.xxx.xxx 映射到局域网的 xx.xx.xx.xx 服务器上。如果是 web 服务,可以将 80 转换为局域网的服务器 9000 端口上(如 10.0.0.61 8080 (目标端口) ---nat→ 10.0.0.7 22)。 |
| POSTROUTING | 在数据包离开防火墙时进行路由判断之后执行的规则,作用改变数据包的源地址,源端口等。写好发件人的地址,要让家人回信时能够有地址可回。例如:默认笔记本和虚拟机都是局域网地址,在出网的时候被路由器将源地址改为了公网地址。生产应用:局域网共享上网。 |
4表5链规则

- 流程起点:封包进入
数据包首先进入nat 表的 PREROUTING 链 ------ 这是在 "路由判断" 前的地址转换环节,可修改数据包的目的 IP / 端口(比如将公网 IP 映射到内网服务器的端口)。
- 路由判断:决定数据包流向
路由判断是核心分支点,根据数据包的目标地址,决定其走向:
- 路径 A(目标是本机) :进入 filter 表的 INPUT 链 ,过滤 "进入本机" 的数据包(比如判断是否允许外部访问本机的 80 端口)。通过后,数据包访问
Linux本机的资源(如本机的 Web 服务、数据库)。 - 路径 B(需要转发) :进入 filter 表的 FORWARD 链,过滤 "流经本机转发" 的数据包(比如本机作为路由器时,转发内网到外网的流量)。
- 路径 C(本机发起) :若数据包是
Linux本机的资源主动发起的,经过路由判断后,进入 nat 表的 OUTPUT 链 (修改本机发出数据包的目的地址 ),再进入 filter 表的 OUTPUT 链,过滤 "从本机发出" 的数据包。
- 最终出口:封包传出
无论数据包是 "转发流量(FORWARD)" 还是 "本机出站流量(OUTPUT)",最终都会进入 nat 表的 POSTROUTING 链 ------ 在数据包离开防火墙前,修改源 IP / 端口(比如局域网共享上网时,将内网 IP 伪装成公网 IP),最终 "封包传出" 到目标网络。
最详细

iptables
iptables 是 Linux 系统中基于内核 netfilter 框架实现的防火墙工具,用于管理网络流量的访问控制(允许、拒绝、转发等),是 Linux 网络安全的核心组件。其核心逻辑是通过 "表(Table)→ 链(Chain)→ 规则(Rule)" 的层级结构,对数据包进行精准过滤和处理。
bsah
yum install -y iptables-services
apt install -y iptables-services
环境准备及命令
| 节点 | ip |
|---|---|
| m01 | 10.0.0.61/172.16.1.61 |
| web01 | 10.0.0.51/172.16.1.51 |
bash
[root@lx ~]# rpm -qa | grep iptables
iptables-1.8.5-2.ky10.x86_64
iptables-help-1.8.5-2.ky10.noarch
iptables-libs-1.8.5-2.ky10.x86_64
[root@lx ~]# rpm -ql iptables
/etc/sysconfig/ip6tables
/etc/sysconfig/iptables #防火墙配置文件
/usr/lib/systemd/system/ip6tables.service
/usr/lib/systemd/system/iptables.service #防火墙服务配置文件(命令)
/usr/sbin/iptables #iptables 命令 添加/删除查看 规则
/usr/sbin/iptables-restore #恢复
/usr/sbin/iptables-save #iptables 规则 输出(保存)
#防火墙相关模块 加载到内核中
#写入到开机自启动.
modprobe ip_tables
modprobe iptable_filter
modprobe iptable_nat
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
modprobe ipt_state
#永久
chmod +x /etc/rc.d/rc.local
cat >>/etc/rc.local<<EOF
modprobe ip_tables
modprobe iptable_filter
modprobe iptable_nat
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
modprobe ipt_state
EOF
#关闭已有的firewalld防火墙
systemctl stop firewalld
systemctl disable firewalld
#检查是否加载防火墙iptables 模块
lsmod |egrep 'filter|nat|ipt'
nf_nat_ftp 12770 0
nf_conntrack_ftp 18638 1 nf_nat_ftp
iptable_nat 12875 0
nf_nat_ipv4 14115 1 iptable_nat
nf_nat 26787 2 nf_nat_ftp,nf_nat_ipv4
nf_conntrack 133053 6 nf_nat_ftp,nf_nat,xt_state,nf_nat_ipv4,nf_conntrack_ftp,nf_conntrack_ipv4
iptable_filter 12810 0
ip_tables 27126 2 iptable_filter,iptable_nat
libcrc32c 12644 3 xfs,nf_nat,nf_conntrack
systemctl enable --now iptables

这些modprobe命令用于加载 Linux 内核中与iptables相关的内核模块,以扩展防火墙的功能支持。以下是每个模块的作用说明:
| 模块名称 | 功能作用 | 关键场景 |
|---|---|---|
ip_tables |
iptables 工具的核心模块 ,是使用 iptables 配置防火墙的基础。 |
所有 iptables 功能的前提,必须加载才能使用 iptables 命令。 |
iptable_filter |
加载 filter 表的支持模块,负责流量过滤(允许 / 拒绝数据包)。 |
配置 INPUT/OUTPUT/FORWARD 链的过滤规则时依赖此模块。 |
iptable_nat |
加载 nat 表的支持模块,负责网络地址转换(端口映射、IP 伪装等)。 |
配置端口转发(如将公网端口映射到内网服务)、共享上网(IP 伪装)时依赖此模块。 |
ip_conntrack |
连接跟踪模块,记录网络连接的状态(如新建连接、已建立连接等)。 | iptables 使用 --state 匹配连接状态(如 ESTABLISHED)时依赖此模块,是状态防火墙的核心。 |
ip_conntrack_ftp |
FTP 协议的连接跟踪模块,识别 FTP 主动 / 被动模式的动态连接。 | 若防火墙需放行 FTP 流量,必须加载此模块,否则会因 FTP 动态端口协商被拦截。 |
ip_nat_ftp |
FTP 协议的NAT 支持模块 ,配合 ip_conntrack_ftp 实现 FTP 流量的地址转换。 |
当内网 FTP 服务器通过 NAT 对外提供服务时,需加载此模块保证 FTP 数据连接正常。 |
ipt_state |
状态匹配模块,提供 --state 选项的匹配能力。 |
简化基于连接状态的规则配置(如 iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT)。 |
iptables命令参数
- 指定表与链的指令
| 参数 | 说明 |
|---|---|
-t 表名 |
指定操作的表(默认 filter,可选 nat/mangle/raw) |
-A 链名 |
向链末尾追加一条规则 |
-I 链名 [序号] |
向链指定位置插入规则(无序号则插入到开头) |
-D 链名 [序号/匹配条件] |
删除链中的规则(可按序号或完整匹配条件) |
-R 链名 序号 规则 |
替换链中某条规则 |
-F [链名] |
清空链中所有规则(无链名则清空所有表的链) |
-Z [链名] |
清空链的数据包 / 字节计数器 |
-N 自定义链名 |
创建自定义链 |
-X [自定义链名] |
删除自定义链(需先清空规则) |
-P 链名 策略 |
设置链的默认策略 (如 ACCEPT/DROP) |
- 匹配条件参数
| 参数 | 说明 |
|---|---|
-p 协议 |
指定网络协议(tcp/udp/icmp/all) |
--dport 端口 |
目标端口(仅tcp/udp有效) |
--sport 端口 |
源端口(仅tcp/udp有效) |
-s 源IP/网段 |
源 IP 地址或网段 |
-d 目标IP/网段 |
目标 IP 地址或网段 |
-i 网卡 |
入站网卡(如eth0/lo) |
-o 网卡 |
出站网卡(如eth0/lo) |
-m state --state 状态 |
匹配连接状态(NEW/ESTABLISHED/RELATED) |
-m multiport --dports 端口列表 |
匹配多个目标端口(逗号分隔) |
-m limit --limit 速率 |
速率限制(如10/s表示每秒 10 个包) |
- 指定是准许还是拒绝
| 参数 | 含义 |
|---|---|
| -j | jump,满足条件后的动作:DROP (拒绝)/ACCEPT (准许)/REJECT (拒绝) |
| DROP:丢弃数据包,不返回任何信息; REJECT:拒绝并返回错误信息 |
| 参数 | 含义 | |
|---|---|---|
| -F(flush) | 清除指定表中所有的规则,可用于规则备份操作 | |
| -X | 删除用户自定义的链 | |
| -Z(zero) | 链的计数器清零(包括数据包计数器和数据包字节计数器) | |
| -v | 显示数据包数量、数据量等详细信息 |
| iptables 命令及选项 | 指定表 | 指定链 (插入 / 追加 / 删除) | ip | 具体要求 (端口,ip, 协议) | 端口 | 动作 |
|---|---|---|---|---|---|---|
| iptables | -t filter | -A INPUT | -s | -p tcp/udp/icmp | --dport 目标端口 | -j DROP |
| -I | -d | --sport 源端口 | -j REJECT | |||
| -D | -j ACCEPT |
查看表规则
- 默认查看的是filter表
bash
iptables -nL
- 查看指定表中的规则
bash
iptables -t nat -nL
- 查看规则并加上序号
bash
iptables -nL --line-number

删除规则
- 删除所有规则
bash
iptables -F
- 根据序号删除
bash
iptables -D INPUT 1
配置filter表规则
- 正式配置之前,先备份,清空规则
bash
iptables -F
iptables -X
iptables -Z
[root@lx ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
禁止访问22端口
bash
#拒绝用户访问22端口
iptables -A INPUT -p tcp --dport 22 -j DROP
封ip,屏蔽某个ip⭐
- 发出DOS攻击,某几个/IP对网站发出大量请求
bash
iptables -I INPUT -s 10.0.0.7 -j DROP
iptables -I INPUT -s 172.16.1.7 -j DROP

禁止网段连入(禁止10.0.0.0/24网段访问22端口)⭐
bash
iptables -I INPUT -s 10.0.0.0/24 -p tcp --dport 22 -j DROP
只允许指定网段连入
- 实现阿里云白名单功能:默认是拒绝,开发端口,网段
bash
#方法1 利用 ! 进行排除
iptables -I INPUT ! -s 172.16.1.0/24 -j DROP
#源ip不是172.16.1.0/24网段,则拒绝
#只允许10.0.0.0/24访问,除了10.0.0.0/24都拒绝
iptables -I INPUT ! -s 10.0.0.0/24 -j DROP
# 允许192.168.0.0/24网段所有访问
iptables -A INPUT -s 192.168.0.0/24 -j ACCEPT
# 仅允许10.0.0.0/16网段访问3306端口(MySQL)
iptables -A INPUT -s 10.0.0.0/16 -p tcp --dport 3306 -j ACCEPT
#方法2 修改链默认规则 修改为拒绝,添加准许
#修改默认规则
iptables -f filter -I INPUT -s 10.0.0.1 -j ACCEPT
iptables -f filter -I INPUT -s 172.16.1.0/24 -j ACCEPT
iptables -t filter -P INPUT DROP
#恢复
iptables -t filter -P INPUT ACCEPT
匹配ICMP类型,禁止ping⭐
- 方案1:防火墙实现
bash
#精确写法
iptables -I INPUT -p icmp --icmp-type 8 -j DROP
#简单写法
iptables -I INPUT -p icmp -j DROP
- 方案2:通过内核参数,禁止被ping /etc/sysctl.conf
bash
[root@lx ~]# cat /etc/sysctl.conf
net.ipv4.icmp_echo_ignore_all=1
#生效
sysctl -p
指定多个端口⭐
bash
iptables -I INPUT -p tcp --dport 8888 -j DROP
iptables -I INPUT -p tcp --dport 9999 -j DROP
#指定多个端口
iptables -A INPUT -m multiport -p tcp --dport 80,443 -j ACCEPT
iptables -A INPUT -p tcp --dport 1:1024 -j ACCEPT
#书写防火墙则准许任何地址访问80和443端口
iptables -A INPUT -m multiport -p tcp --dport 80,443 -j ACCEPT
#书写防火墙规则只准许172.16.1.0/24访问3306和6379(! -s)
iptables -I INPUT ! -s 172.16.1.0/24 -p tcp -m multiport --dport 3306,6379 -j DROP
#公司的云服务器22端口只能在公司访问(在防火墙设置只准许公网ip访问22端口)
iptables -I INPUT ! -s 221.218.215.241 -p tcp --dport 22 -j DROP
iptables -I INPUT -s 221.218.215.241 -p tcp --dport 22 -j ACCEPT
匹配网络状态(TCP/IP连接状态)
-m state -state
NEW: 已经或将启动新的连接
ESTABLISHED:已建立的连接
RELATED:正在启动的新连接
INVALID:非法或无法识别的
bash
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
限制并发及速率
bash
防火墙limit模块和ngx limit_req,limit_conn模块都可以进行访问,请求频率的限制
可以辅助预防DDOS攻击
- -m limit 限制模块
bash
-m limit --limit 10/minute #每分钟只能有10个数据包 每6秒生成
- -m limit -limit n(second/minute/hour)
解释:指定时间内的请求速率"n"为速率,后面为时间分别为:秒,分,时
bash
-m limit --limit 10/minute --limit-burst 5 #每6秒释放工牌,给别人使用
#10个数据包
前5个 1个1个工牌 从第6个开始 每6秒 才能释放1个工牌
- 测试
bash
iptables -F
iptables -I INPUT -p icmp -m limit --limit 10/minute --limit-burst 5 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -P INPUT DROP
从5秒开始,间隔6秒

防火墙规则的保存与恢复⭐⭐⭐
-
iptables-save 进行备份,默认输出到屏幕
-
iptables-restore 进行恢复,加上文件
-
写入到/etc/sysconfig/iptables
bash
[root@lx ~]# iptables-save >/etc/sysconfig/iptables
[root@lx ~]# cat /etc/sysconfig/iptables
# Generated by iptables-save v1.8.5 on Fri Nov 7 20:44:41 2025
*filter
:INPUT DROP [62:6432]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [94:7800]
-A INPUT -p icmp -m limit --limit 10/min -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
COMMIT
# Completed on Fri Nov 7 20:44:41 2025
[root@lx ~]# iptables -D INPUT 1
[root@lx ~]# iptables -nL --line-numbers
Chain INPUT (policy DROP)
num target prot opt source destination
1 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
Chain FORWARD (policy ACCEPT)
num target prot opt source destination
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
[root@lx ~]# iptables-restore </etc/sysconfig/iptables
[root@lx ~]# iptables -nL --line-numbers
Chain INPUT (policy DROP)
num target prot opt source destination
1 ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 limit: avg 1
2 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
Chain FORWARD (policy ACCEPT)
num target prot opt source destination
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
#读取/etc/sysconfig/iptables内容
systemctl restart iptables
生产用法
- ssh可以连接进来
bash
iptables -F
iptables -X
iptables -Z
iptables -nL
#放行22端口
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
- 设置允许本机lo 通讯规则
bash
#允许本机回环lo接口数据流量流出与流入
# -i 数据进入的时候
iptables -A INPUT -i lo -j ACCEPT
#-o 数据流出的时候
iptables -A OUTPUT -o lo -j ACCEPT
- 配置默认规则及方向80,443端口
bash
iptables -A INPUT -m multiport -p tcp --dport 443,80 -j ACCEPT
[root@lx ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 multiport dports 443,80
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
iptables -A INPUT -s 10.0.0.0/24 -j ACCEPT
iptables -A INPUT -s 172.16.1.0/24 -j ACCEPT
[root@lx ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 multiport dports 443,80
ACCEPT all -- 10.0.0.0/24 0.0.0.0/0
ACCEPT all -- 172.16.1.0/24 0.0.0.0/0
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
[root@lx ~]# iptables-save
# Generated by iptables-save v1.8.5 on Fri Nov 7 20:59:36 2025
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [27:2880]
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m multiport --dports 443,80 -j ACCEPT
-A INPUT -s 10.0.0.0/24 -j ACCEPT
-A INPUT -s 172.16.1.0/24 -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
COMMIT
# Completed on Fri Nov 7 20:59:36 2025
- 修改默认的规则为拒绝INPUT
bash
#本机所有服务(如 Web、SSH 等)将无法被外部访问,除非手动添加允许规则(如 iptables -A INPUT -p tcp --dport 22 -j ACCEPT 开放 SSH 端口)。
iptables -P INPUT DROP
#所有 "流经本机转发" 的数据包(如本机作为路由器时,内网到外网的流量)默认被允许通过。
iptables -P FORWARD ACCEPT
#本机主动发起的所有出站数据包(如访问外部网站、调用 API 等)默认被允许。
iptables -P OUTPUT ACCEPT
nat
在网络技术中,NAT(Network Address Translation,网络地址转换) 是一种通过修改数据包的源 IP / 目标 IP 或端口,实现内网与外网通信的技术,主要用于解决 IPv4 地址资源不足的问题,同时隔离内网结构以提升安全性。
nat 表的核心功能
- 地址转换 :将内网私有 IP(如
192.168.1.0/24)与公网 IP(如203.0.113.1)相互映射,让内网设备通过少量公网 IP 访问外网。 - 隐藏内网:外网无法直接获取内网 IP,减少被攻击的风险。
- 端口复用 :通过端口区分不同内网设备(如公网 IP 的
8080端口映射到内网192.168.1.10:80,8081映射到192.168.1.11:80)。
实现共享上网
bash
iptables -t nat -A POSTROUTING -s 172.16.1.7 -j SNAT --to-source 10.0.0.61
1.指定nat表,配置POSTROUTING链
2.源ip是172.16.1.7 这台主机进行共享上网,如果是多台(-s 172.16.1.0/24)
3.指定使用SNAT功能,源地址转换
4.通过SNAT功能把数据包中的源ip地址改为防火墙公网的ip地址(10.0.0.61)
环境准备
- db01 172.16.1.51(只保留这个网卡),eth0网卡关闭(ONBOOT=no)
- m01配置共享上网的规则
| 共享上网流程 | 详细步骤 |
|---|---|
| 客户端 | 关闭eth0网卡 ONBOOT=no 修改eth1网关为防火墙GATEWAY=172.16.1.61 配置DNS1 |
| 服务端(防火墙机器) | 1.开启内核转发,内核配置文件/etc/sysctl.conf 2.配置防火墙规则 |
防火墙配置
bash
配置防火墙规则,改为默认是准许
清空其他规则
配置防火墙共享上网规则
iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j SNAT --to-source 10.0.0.211
echo 'net.ipv4.ip_forward = 1' >>/etc/sysctl.conf
sysctl -p
web配置
bash
[root@web01 ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33 | grep ONBOOT
ONBOOT=no
[root@web01 ~]# tail -5 /etc/sysconfig/network-scripts/ifcfg-ens34
GATEWAY=172.16.1.211
DNS1=223.5.5.5
DNS2=223.6.6.6
ifdown ens33
ifdown ens34 && ifup ens34
结果


共享上网流程
- 防火墙添加 SNAT 规则(nat 表 POSTROUTING 链)
- 防火墙服务器开启 IP 转发(内核参数
ip_forward功能) - 后端节点配置网卡,将网关指向防火墙
- 后端节点的网卡中配置 DNS:
DNS1=223.5.5.5,DNS2=223.6.6.6
实现端口转发
bash
[root@lx ~]# iptables -t nat -A PREROUTING -d 10.0.0.211 -p tcp --dport 9999 -j DNAT --to-destination 172.16.1.7:22
[root@lx ~]# iptables -nL -t nat
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DNAT tcp -- 0.0.0.0/0 10.0.0.211 tcp dpt:9999 to:172.16.1.7:22
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
SNAT all -- 172.16.1.0/24 0.0.0.0/0 to:10.0.0.211
测试与检测
git-bash 测试 ssh -p 9999 root@10.0.0.61

实现ip映射
| 共享上网流程 | 详细步骤 |
|---|---|
| 客户端 | 关闭eth0网卡 ONBOOT=no 修改eth1网关为防火墙GATEWAY=172.16.1.61 配置DNS1 |
| 服务端(防火墙机器) | 1.开启内核转发,内核配置文件/etc/sysctl.conf 2.配置防火墙规则 |
bash
[root@lx ~]# iptables -t nat -A PREROUTING -d 10.0.0.62 -j DNAT --to-destination 172.16.1.7
[root@lx ~]#
[root@lx ~]#
[root@lx ~]# iptables -nL -t nat
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DNAT tcp -- 0.0.0.0/0 10.0.0.211 tcp dpt:9999 to:172.16.1.7:22
DNAT all -- 0.0.0.0/0 10.0.0.62 to:172.16.1.7
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
SNAT all -- 172.16.1.0/24 0.0.0.0/0 to:10.0.0.211
