【Day 77】Linux-iptables防火墙

一、防火墙介绍

防火墙是加强业务发访问安全性,是网络安全的核心组件,通过制定规则对进出网络的数据包进行过滤和控制,实现网络访问的精细化管理。

1. 类型

  • 硬件防火墙:以独立硬件设备形式存在,具备专用芯片和操作系统,处理性能强、稳定性高,适用于大型网络边界防护(如企业出口网关、数据中心边界)。华为、山石、飞宇星、深信服
  • 软件防火墙:基于操作系统内核实现,通过软件模块(如 Linux 的 netfilter)提供防护功能,成本低、配置灵活,适用于服务器单机或小型网络环境(如 CentOS 7 系统中的 iptables 和 firewalld)。

2. 作用

防火墙的核心作用是数据过滤,基于网络五元素(源 IP、目的 IP、源端口、目的端口、协议)制定规则,实现以下功能:

  • 允许合法流量通过(如允许内部主机访问外部 HTTP 服务);
  • 阻止非法流量入侵(如拒绝外部 IP 对内部 SSH 端口的暴力破解);
  • 记录网络访问日志,用于审计和故障排查;
  • 实现地址转换(如 NAT 功能,解决内网 IP 与公网通信问题)。

3.防火墙架设

架设位置 防护目标
企业内网(LAN)与互联网(Internet)之间 外网恶意流量拦截
企业内网的 "不同职能区域" 之间 内网横向渗透防护
数据中心 "DMZ 区(非军事区)" 与 "内网核心业务区" 之间; 或 "外网业务区" 与 "核心数据库区" 之间。 核心业务与公开业务隔离
企业分支机构与总部的 "专线 / VPN 链路" 两端; 或分支机构内网与总部内网之间 跨地域 VPN 加密与身份验证
企业本地数据中心与公有云之间; "云内业务区" 与 "本地核心区" 之间(通过专线 / 云 VPN 互联) 云 - 地流量加密与协同防护

Windows的软件防火墙

4. 防火墙功能的实现

  • 内核模块:Linux 内核中的netfilter框架是防火墙功能的底层实现,负责在数据包流经内核的关键节点(如入站、出站、转发)对数据包进行拦截和处理。
  • iptables:
    • 操作 netfilter 的命令行工具,用于定义、管理和应用防火墙规则;
    • iptables 规则被加载到内核的 netfilter 钩子点,重启后内核状态丢失(需手动保存);
    • 管理方式:iptables 需手动编写复杂规则链;
    • 适用场景:iptables 适合简单固定规则场景;
  • firewall-cmd:
    • firewall-cmd是 firewalld 服务的管理工具,为 iptables 提供了更高层的抽象接口。
    • firewalld 提供图形化(firewall-config)和命令行工具,支持批量规则管理。
    • firewalld 内部维护 "运行时规则" 和 "永久规则",修改后通过 --reload 合并到运行时,无需像 iptables 那样重新加载整个规则集,避免中断现有连接。
    • firewalld 规则存储在配置文件中,支持持久化保存。
    • firewalld 更适合需要频繁修改规则、多区域隔离的复杂环境。
  • iptables 是直接与 netfilter 交互的 "底层工具",firewalld 则是在 iptables 之上封装的 "动态管理系统",本质上仍通过 iptables 规则链生效。

二、iptables

(一)四表五链

iptables 是 CentOS 7 中基于 netfilter 内核模块的防火墙工具,通过 "表" 和 "链" 的结构组织规则,实现对数据包的分层处理。

五链(按数据包流经顺序划分)

netfilter(Linux 内核的防火墙框架)在 TCP/IP 协议栈的 5 个关键节点设置了 "钩子"函数(Hook),每个钩子对应一条默认链(Chain)。当数据包流经这些节点时,内核会触发对应的钩子,执行链中预设的规则(如 "允许""拒绝""转发")。

简单理解:钩子是 "拦截位置",链是 "该位置的规则列表"

|-----------------|-----------------|--------------------------------|---------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------|
| 钩子函数 | 对应链 | 触发时机(数据包位置) | 核心作用 | 典型应用场景 |
| PREROUTING | PREROUTING | 路由决策前 | 在路由前修改数据包(如修改目标 IP / 端口,实现端口映射、负载均衡)。 | * 端口映射(DNAT):将外部访问本机公网 IP 的 80 端口,转发到内网服务器 192.168.1.10 的 80 端口(让内网 Web 服务对外提供访问); * 修改数据包的目标 IP:将访问 1.2.3.4 的流量,转发到内网 192.168.1.20(隐藏内网服务器真实 IP)。 |
| INPUT | INPUT | 数据包目标 IP 是本机;流经协议栈到达 "本机应用层" 前 | 控制 "哪些外部 IP / 端口可以访问本机服务"。 | * 允许外部访问本机的 80(HTTP)、443(HTTPS)端口(Web 服务); * 仅允许公司内网 IP(如 192.168.1.0/24)访问本机的 22(SSH)端口; * 拒绝所有外部 IP 访问本机的 3306(MySQL)端口(防止数据库被远程攻击)。 |
| OUTPUT | OUTPUT | 本机应用层发出的数据包,从 "本机应用层" 流出到协议栈时 | 控制 "本机可以访问哪些外部资源"。 | * 禁止本机访问外网的 8080 端口(防止员工用本机访问非法代理); * 仅允许本机访问指定 IP 的 3306 端口(如仅允许连接公司的数据库服务器 10.0.0.5); * 限制本机对外的 ICMP 请求(禁止 ping 外部 IP,避免被探测)。 |
| FORWARD | FORWARD | 需转发(目标非本机),在 "路由转发" 过程中 | 控制 "本机是否允许转发数据包",即是否开启路由转发功能并限制转发规则。 | * 允许内网 192.168.1.0/24 的数据包通过本机转发到外网(开启网关功能); * 禁止外网数据包通过本机转发到内网(防止外部通过转发渗透内网); * 仅允许转发内网的 80/443 端口流量(限制内网仅能访问外网 Web 服务)。 |
| POSTROUTING | POSTROUTING | 路由决策后 | 在数据包离开前修改(如修改源 IP,实现 NAT 地址转换)。 | * 源地址转换(SNAT):将内网 192.168.1.0/24 的数据包源 IP,替换为本机的公网 IP(让内网设备通过一个公网 IP 访问外网); * 动态地址转换(MASQUERADE):当本机公网 IP 是动态获取(如拨号上网)时,自动将内网 IP 替换为当前公网 IP(比 SNAT 更灵活)。 |

数据包在 Linux 内核中的流转路径决定了链的触发顺序:

  • PREROUTING:路由前,数据包进入内核后首先经过,用于目标地址转换(nat 表)或标记(mangle 表);
  • 路由决策:
    • INPUT:目标为本地的数据包经过此链,用于入站过滤(filter 表);
    • FORWARD:经过本机转发的数据包经过此链,用于转发过滤(filter 表);
    • OUTPUT:本机产生的数据包经过此链,用于出站过滤(filter 表)或地址转换(nat 表);
  • POSTROUTING:路由后,数据包离开内核前最后经过,用于源地址转换(nat 表)。

每个链不止干一件事,比如有的要 "判断能不能过(过滤)",有的要 "改地址(NAT 转换)"------ 这就需要不同的 "专项小组" 来负责,"四表" 就是这 4 个小组,各管一部分功能。

根据所能实现的功能不同,分为四表。

(1)filter 表:最常用的表,负责数据包过滤(允许 / 拒绝),是默认操作的表。包含 3 条链

bash 复制代码
[root@iptables ~] iptables -t filter  -nL
Chain INPUT  # 过滤流入本机的数据包(目标是本机 IP)
Chain FORWARD # 过滤经过本机转发的数据包(本机作为网关时生效)
Chain OUTPUT  # 过滤从本机流出的数据包(源是本机 IP)

(2)nat 表:负责网络地址转换,实现内网与公网的通信。包含 3 条链:

bash 复制代码
[root@iptables ~] iptables -t nat  -nL
Chain PREROUTING   # 在数据包路由前修改目的地址(如端口映射 DNAT)
Chain INPUT  # 当数据包的目标 IP是宿主机本身,且需要对这类数据包做地址转换时,才会经过 nat 表的 INPUT 链
# 宿主机有多个 IP,想让访问ip1的数据包,通过 DNAT 转换为访问ip2(目标都是宿主机,只是 IP / 端口转换),此时规则会加在 nat 表的 INPUT 链。
Chain OUTPUT # 处理本机产生的数据包的地址转换
Chain POSTROUTING  # 在数据包路由后修改源地址(如源地址转换 SNAT)

示例场景1:nat 表如何实现 "内网访问公网"?

以常见的 "家庭路由器" 场景为例,理解 nat 表(尤其是 POSTROUTING 链)的工作流程:

  • 内网设备发起请求:手机(192.168.1.5)访问百度(220.181.38.148),数据包源地址为 192.168.1.5,目的地址为 220.181.38.148。

  • 路由判断:路由器收到数据包后,通过路由表判断 "目的地址是公网",需从公网网卡(如 WAN 口,IP 为 123.123.123.123)发出。

  • POSTROUTING 链执行 SNAT:数据包进入 nat 表的 POSTROUTING 链,匹配到 "内网段(192.168.1.0/24)+ 出口网卡(WAN 口)" 的规则,将源地址从 192.168.1.5 改为路由器的公网 IP(123.123.123.123),同时记录 conntrack(标记 "192.168.1.5: 端口 ↔ 123.123.123.123: 映射端口")。

  • 公网响应返回:百度的响应数据包(目的地址 123.123.123.123)到达路由器,路由器通过 conntrack 找到对应的内网设备(192.168.1.5),将目的地址改为 192.168.1.5,最终转发给手机。

通过这个过程,私有 IP(192.168.1.5)借助 SNAT 伪装成公网 IP,实现了与公网的通信。

示例场景2:"公网访问内网 Web 服务器" 为例

  • 网关(路由器)有公网 IP:203.0.113.10(WAN 口,网卡 eth0),内网 IP:192.168.1.1(LAN 口,网卡 eth1)。

  • 内网有 Web 服务器:192.168.1.100:80(仅内网可达)。

  • 目标:让公网用户通过 203.0.113.10:8080 访问到内网服务器 192.168.1.100:80

① 公网数据包到达网关,触发 PREROUTING 链的 DNAT 转换

公网用户发起请求:源地址=公网用户 IP:随机端口 → 目的地址=203.0.113.10:8080。数据包进入网关后,先经过 nat 表的 PREROUTING 链,匹配到 DNAT 规则:

复制代码
# iptables 规则:将公网 IP 的 8080 端口映射到内网服务器的 80 端口
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.100:80
  • 规则作用:对从公网网卡(eth0)进入、目标端口为 8080 的 TCP 数据包,将其目的地址修改为 192.168.1.100:80

  • 转换后数据包:源地址=公网用户 IP → 目的地址=192.168.1.100:80

② 路由判断与转发(需配合 filter 表放行)

DNAT 转换后,网关进行路由判断:"目的地址 192.168.1.100 属于内网,应从 LAN 口(eth1)转发"。此时数据包进入 filter 表的 FORWARD 链,需配置规则允许转发(否则会被默认策略拦截):

bash 复制代码
# 允许从公网到内网服务器的 80 端口的转发
iptables -A FORWARD -i eth0 -o eth1 -p tcp --dport 80 -d 192.168.1.100 -j ACCEPT
# 允许内网服务器的响应数据包返回公网(基于连接跟踪)
iptables -A FORWARD -i eth1 -o eth0 -p tcp --sport 80 -s 192.168.1.100 -m state --state ESTABLISHED,RELATED -j ACCEPT

③ 内网服务器响应,通过连接跟踪返回公网

内网服务器 192.168.1.100 收到请求后,生成响应数据包:源地址=192.168.1.100:80 → 目的地址=公网用户 IP。响应数据包到达网关时,网关通过 conntrack(连接跟踪)记录,自动将源地址从 192.168.1.100:80 还原为 203.0.113.10:8080(无需额外配置),最终返回公网用户。

(3)mangle 表:负责修改数据包的元数据(如 TTL、TOS 字段)、设置自定义标记。包含 5 条链(INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING)。

(4)raw 表:控制 iptables 的连接跟踪机制,包含 2 条链(PREROUTING、OUTPUT)。

注意:

1、当数据包流经某一条链(如 INPUT、FORWARD 链)时,防火墙会 从链的第一条规则开始,逐条检查匹配条件:

  • 一旦找到 第一条完全匹配 的规则(如 "允许 192.168.1.0/24 访问 22 端口"),就会执行该规则的动作(允许、拒绝、转发等),不再检查后续规则;
  • 若遍历完所有规则都没有匹配项,则执行该链的 默认策略(通常是 "拒绝所有"DROP 或 "允许所有"ACCEPT,推荐默认DROP以保证安全)。

2、数据包流转顺序 "PREROUTING→(INPUT/FORWARD/OUTPUT)→POSTROUTING" 中,本机产生的数据包(如本机 ping 外网)不会经过 PREROUTING 链,而是直接从 "应用层→OUTPUT 链→POSTROUTING 链→出本机"。比如:本机访问外网百度,数据包路径是「本机应用层 → OUTPUT 链(过滤 /nat 转换)→ POSTROUTING 链(SNAT 改源 IP)→ 外网」,跳过 PREROUTING。

(二)iptables 操作

在 CentOS 7 中,默认防火墙工具是firewalld,但如果要使用iptables,需要先禁用firewalld并启用iptables服务。

bash 复制代码
# 停止并禁用firewalld
systemctl stop firewalld
systemctl disable firewalld

# 安装iptables服务(若未安装)
# 保存规则到文件,实现开机持久化:安装后可通过 service iptables save 将当前规则保存到 /etc/sysconfig/iptables
# 系统重启后规则会自动加载(否则临时规则重启后会丢失)
yum install -y iptables-services

# 启动并设置iptables开机自启
systemctl start iptables
systemctl enable iptables

iptables 命令格式:iptables [-t 表名] 操作选项 [链名] [匹配条件] [-j 目标动作]

1. 查看规则

  • 查看指定表的规则(默认 filter 表):

    bash 复制代码
    iptables -nL             # 查看filter表所有链的规则(默认filter表)
    iptables -t filter -nL   # 查看filter表所有链的规则(-n:IP不解析为域名,-L:列出规则)
    iptables -t nat -nL      # 查看nat表所有链的规则
    
    iptables -nL --line-numbers  # 显示规则行号(用于删除规则)
    iptables -nL --line-numbers -v  # 显示详细信息(如数据包计数、网卡)
    
    iptables -t filter -nL INPUT --line-numbers  # 查看INPUT链的默认策略(末尾的"policy"字段)
    # policy DROP:INPUT 链的默认策略为 DROP(未匹配任何规则的数据包会被

2. 删除规则

  • 清空指定表的所有规则(默认 filter 表):

    bash 复制代码
    iptables -F  # 清空filter表所有链的规则(-F:flush)
    iptables -D 链名 规则序号  # 方式1:通过规则在链中的序号删除
    iptables -D 链名 规则内容
    iptables -t nat -F  # 清空nat表所有链的规则
    [root@iptables ~] iptables -nL INPUT       
    # DROP       tcp  --  1.1.1.1              0.0.0.0/0            tcp dpt:80
    # DROP       tcp  --  1.1.1.2              0.0.0.0/0            tcp dpt:80
    # DROP       tcp  --  1.1.1.3              0.0.0.0/0            tcp dpt:80
    
    [root@iptables ~] iptables -D INPUT 1
    [root@iptables ~] iptables -nL INPUT
    # Chain INPUT (policy ACCEPT)
    # target     prot opt source               destination         
    # DROP       tcp  --  1.1.1.2              0.0.0.0/0            tcp dpt:80
    # DROP       tcp  --  1.1.1.3              0.0.0.0/0            tcp dpt:80
    
    [root@iptables ~] iptables -D INPUT -p tcp -s 1.1.1.2 --dport 80 -j DROP
    [root@iptables ~] iptables -nL INPUT
    # Chain INPUT (policy ACCEPT)
    # target     prot opt source               destination         
    # DROP       tcp  --  1.1.1.3              0.0.0.0/0            tcp dpt:80

3. 编写规则

  • 设置链的默认策略(如默认允许 / 拒绝):

    复制代码
    iptables -P INPUT ACCEPT  # 设置INPUT链默认策略为允许(-P:policy)
    iptables -P FORWARD DROP  # 设置FORWARD链默认策略为拒绝

规则由 "匹配条件" 和 "目标动作" 组成,核心是通过网络五元素定义匹配条件,通过-j指定动作(ACCEPT 允许、DROP 拒绝、REJECT 拒绝并返回信息等)。

iptables [-t 表名] [操作命令] [链名] [匹配条件] -j 目标动作

基本选项
  • -t:表名
  • 操作命令
    • -I:在链的开头插入规则(优先级高,先匹配);
    • -A:在链的末尾追加规则(优先级低,后匹配);
    • -R:替换
  • 链名
  • 匹配条件(网络五元素):
    • -s:源 IP(支持单个 IP、网段,!-s 表示 "非");
    • -d:目的 IP;
    • -p:协议(tcp/udp/icmp);
      • --sport:源端口(需配合-p使用);
      • --dport:目的端口(需配合-p使用);
      • --icmp type:定义 "匹配什么类型的 ICMP 包
    • -i:流入网卡(如-i ens33,仅对 INPUT、FORWARD、PREROUTING 链有效);
    • -o:流出网卡(如-o ens33,仅对 OUTPUT、FORWARD、POSTROUTING 链有效)。
  • -j:动作(ACCEPT/ DROP/REJECT/SNAT/DNAT/MASQUERADE/LOG``)
常用规则示例

假设本机ip是192.168.140.10

  • 仅允许特定 IP(192.168.140.1)通过 SSH访问本机,拒绝其他所有 IP 的 SSH 访问

    bash 复制代码
    iptables -I INPUT -s 192.168.140.1 -p tcp --dport 22 -j ACCEPT
    iptables -A INPUT -p tcp --dport 22 -j DROP
    iptables -I OUTPUT -d 192.168.140.1 -p tcp --sport 22 -j ACCEPT
  • 允许所有主机都能访问本机的 HTTP 服务(80 端口):

    bash 复制代码
    iptables -I INPUT -d 192.168.140.10 -p tcp --dport 80 -j ACCEPT
  • 拒绝 10.0.0.5 访问本机的所有端口:

    复制代码
    iptables -I INPUT -s 10.0.0.5 -j DROP  # 插入到开头,优先匹配
  • 允许本机 ping 其他主机(ICMP 协议):

    bash 复制代码
    iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
    # --icmp-type echo-request:指定 ICMP 报文类型为 echo-request(即 "ping 请求",对应 ping 命令发送的数据包)。
  • 允许外部主机 ping 本机:

    bash 复制代码
    iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
    # echo-reply(ping 回应)
ICMP 数字类型 对应字符名称 功能说明 常用场景
0 echo-reply ICMP 回显回应(即 "ping 的回复包") 本机回复其他主机的 ping 请求
8 echo-request ICMP 回显请求(即 "ping 的请求包") 其他主机向本机发起 ping 请求
  • 仅允许 ens33 网卡接收来自 172.16.0.0/12 网段的 HTTPS(443 端口)流量:

    iptables -A INPUT -i ens33 -s 172.16.0.0/12 -p tcp --dport 443 -j ACCEPT

  • 要允许 "本机访问本机" 的所有流量通过(包括本地进程间通信、回环地址访问等)

bash 复制代码
# 允许所有通过回环接口(lo)的入站流量(本机接收的内部请求)
iptables -A INPUT -i lo -j ACCEPT

# 允许所有通过回环接口(lo)的出站流量(本机发起的内部请求)
iptables -A OUTPUT -o lo -j ACCEPT
  • 配置防火墙允许 yum 命令正常工作
bash 复制代码
# 注意双向通信:不仅要允许本机发起的出站请求,还要允许仓库返回的入站响应。
# 允许 DNS 服务器返回的入站响应(源端口是 53)
iptables -A INPUT -p udp --sport 53 -j ACCEPT
# 允许 HTTP 仓库返回的入站响应(源端口是 80)
iptables -A INPUT -p tcp --sport 80 -j ACCEPT
# 允许 HTTPS 仓库返回的入站响应(源端口是 443)
iptables -A INPUT -p tcp --sport 443 -j ACCEPT

# 允许本机发起的 DNS 出站请求(访问 DNS 服务器的 53 端口)
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
# 允许本机发起的 HTTP 出站请求(访问仓库 80 端口)
iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT
# 允许本机发起的 HTTPS 出站请求(访问仓库 443 端口)
iptables -A OUTPUT -p tcp --dport 443 -j ACCEPT

(三)nat 表:地址转换

nat 表用于实现网络地址转换,解决内网 IP(如 192.168.0.0/16)与公网通信的问题,核心功能为 SNAT 和 DNAT。

1. SNAT(源地址转换)

作用:将内网主机的源 IP 转换为网关的公网 IP,使内网主机能访问公网。

场景:局域网内多台主机通过一个公网 IP 上网(如家庭路由器)。

示例:假设网关服务器有两块网卡(内网 ens33:192.168.1.1,公网 ens37:203.0.113.5),允许 192.168.1.0/24 网段通过公网 IP 访问外部:

bash 复制代码
# 开启内核转发功能(临时生效)
echo 1 > /proc/sys/net/ipv4/ip_forward
# 永久生效:编辑/etc/sysctl.conf,添加net.ipv4.ip_forward=1,执行sysctl -p

# 添加SNAT规则:内网流量通过公网网卡出站时,源IP转换为203.0.113.5
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ens37 -j SNAT --to-source 203.0.113.5
# 允许内网 192.168.1.0/24 网段的流量通过网关转发到公网(出站)
iptables -A FORWARD -s 192.168.1.0/24 -o ens37 -j ACCEPT

# 允许公网对内网的响应流量通过网关转发回内网(入站)
iptables -A FORWARD -d 192.168.1.0/24 -i ens37 -m state --state RELATED,ESTABLISHED -j ACCEPT

若公网 IP 是动态获取的(如拨号上网),可用MASQUERADE自动适配 IP 变化:

复制代码
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ens37 -j MASQUERADE

2. DNAT(目的地址转换 / 端口映射)

作用:将公网 IP 的指定端口映射到内网主机的 IP 和端口,使外部能访问内网服务。

场景:暴露内网 Web 服务器(192.168.1.10:80)到公网(203.0.113.5:80)。

**注意:**端口冲突!指公网端口被重复映射到不同的内网服务,导致外部请求无法正确转发到目标服务。

示例:将公网 IP(203.0.113.5)的 80 端口映射到内网 192.168.1.10 的 80 端口:

bash 复制代码
# 允许外部访问公网IP的80端口(filter表需放行)
iptables -A INPUT -p tcp --dport 80 -j ACCEPT

# 添加DNAT规则:公网流量通过PREROUTING链时,目的地址转换为内网主机
iptables -t nat -A PREROUTING -d 203.0.113.5 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.10:80

注意:DNAT 需配合 filter 表规则放行转发流量(若默认策略为 DROP):

复制代码
iptables -A FORWARD -d 192.168.1.10 -p tcp --dport 80 -j ACCEPT

3、补充:Windows端口映射

**前提:**① 外部网络能访问到配置的公网 IP ② 公网 IP 所在的 Windows 主机能访问内网目标(内网网卡需接入内网网段或通过路由能到达内网网段)

bash 复制代码
# 添加端口映射:将外部端口(externalport)转发到内网 IP:端口(internaladdr:internalport)
# 当 Windows 主机有多个公网 IP 时,任意一个公网 IP 都可以作为 listenaddress(监听地址)
netsh interface portproxy add v4tov4 listenaddress=外部IP listenport=外部端口 connectaddress=内网IP connectport=内网端口
# 示例:将本机(公网IP 203.0.113.5)的 8080 端口转发到内网 192.168.1.10 的 80 端口
netsh interface portproxy add v4tov4 listenaddress=203.0.113.5 listenport=8080 connectaddress=192.168.1.10 connectport=80

# 查看所有端口映射规则:
netsh interface portproxy show all
# 删除端口映射规则
netsh interface portproxy delete v4tov4 listenaddress=外部IP listenport=外部端口
# 示例:删除 203.0.113.5:8080 的映射
netsh interface portproxy delete v4tov4 listenaddress=203.0.113.5 listenport=8080

清空所有规则:
netsh interface portproxy reset

二、firewalld 防火墙

firewalld 是 CentOS 7 默认的动态防火墙管理工具,基于 iptables 实现,支持动态更新规则(无需重启服务),引入 "zone(区域)" 概念简化配置。

1. 查看 firewalld 服务运行状态

bash 复制代码
systemctl unmask firewalld
systemctl start firewalld   # 启动服务
systemctl enable firewalld  # 开机自启
systemctl status firewalld  # 查看状态(active/running为运行中)
systemctl stop firewalld    # 停止服务

2. 配置工具

  • firewall-cmd:命令行工具(推荐,支持动态配置);
  • firewall-config :图形化工具(需安装firewalld-config包,适合桌面环境)。

3. zone(区域)

zone 是 firewalld 的核心概念,通过预设不同安全级别(如 public、trusted、dmz)的区域,快速适配不同网络环境。

常用区域(安全级别从高到低)

  • trusted:允许所有流量;
  • home:允许家庭网络常用服务(如 SSH、HTTP、mDNS);
  • public:默认区域,仅允许 SSH、DHCP 等必要服务;
  • dmz:隔离区,仅允许指定服务(如对外提供的 Web 服务);
  • drop:拒绝所有流入流量,仅允许流出。

区域操作示例

(1)查看区域的详情

bash 复制代码
[root@firewalld ~] firewall-cmd --list-all
# --zone=区域 参数,不写则默认default
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens33
  sources: 
  services: dhcpv6-client ssh
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 

# 查看当前区域允许的服务
firewall-cmd --list-services

(2)数据过滤

bash 复制代码
# 服务名(自动对应默认端口)
firewall-cmd  --permanent --add-service=
# Display all 154 possibilities? (y or n)
firewall-cmd --permanent --add-port=端口号/协议(tcp/udp)

# 示例:
# 开放 TCP 8080 端口(永久生效)
[root@firewalld ~] firewall-cmd --permanent --add-port=8080/tcp
# 开放 HTTP 服务(默认 80 端口)
[root@firewalld ~] firewall-cmd --permanent --add-service=http
# 在默认区域允许SSH服务(22/tcp)并限制源IP为192.168.1.0/24
firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" service name="ssh" accept' --permanent

# 重新加载规则使生效
[root@firewalld ~] firewall-cmd --reload

# 查看已开放的服务
[root@firewalld ~] firewall-cmd --permanent --list-services

# 查看已开放的端口
[root@firewalld ~] firewall-cmd --permanent --list-ports

# 查看所有预定义服务及其对应的端口
[root@firewalld ~] firewall-cmd --get-services | xargs -I {} firewall-cmd --info-service={}

(3)SNAT

bash 复制代码
# 开启指定区域的 masquerade(永久生效)
# 需为包含公网网卡的区域开启 masquerade(通常是 external 或 public 区域):
# 为 external 区域开启 masquerade(推荐用于公网出口)
firewall-cmd --permanent --zone=external --add-masquerade

# 重载规则使生效
firewall-cmd --reload

(4)DNAT

bash 复制代码
firewall-cmd --permanent --add-forward-port=port=源端口:proto=协议:toaddr=目标IP:toport=目标端口

示例:将本地 80 端口(TCP)转发到内网 192.168.1.10 的 8080 端口

# 临时开启
echo 1 > /proc/sys/net/ipv4/ip_forward
# 永久开启(重启生效)
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
sysctl -p  # 立即生效

# 添加转发规则(永久生效)
firewall-cmd --permanent --add-forward-port=port=80:proto=tcp:toaddr=192.168.1.10:toport=8080

# 重载规则使生效
firewall-cmd --reload

# 删除规则
firewall-cmd --permanent --remove-forward-port=port=80:proto=tcp:toaddr=192.168.1.10:toport=8080
firewall-cmd --reload

4. 自定义服务

firewalld 通过 "服务"(预定义端口和协议的集合)简化规则配置,支持自定义服务。

// 一个文件对应一个服务,随便打开一个查看一下定义的内容

创建服务配置文件:

复制代码
vim /etc/firewalld/services/my-service.xml

内容:

XML 复制代码
<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>My Service</short>
  <description>Custom service for port 10086/tcp</description>
  <port protocol="tcp" port="10086"/>
</service>

重新加载配置并添加服务:

bash 复制代码
firewall-cmd --reload
firewall-cmd --zone=public --add-service=my-service --permanent
相关推荐
88号技师1 天前
2025年8月SCI-汉尼拔·巴卡优化算法Hannibal Barca optimizer-附Matlab免费代码
开发语言·人工智能·算法·数学建模·matlab·优化算法
_w_z_j_1 天前
C++----变量存储空间
开发语言·c++
花菜会噎住1 天前
Vue3 路由配置和使用与讲解(超级详细)
开发语言·javascript·ecmascript·路由·router
Jtti1 天前
SSH连接服务器超时?可能原因与解决方案
服务器·网络·php
细节控菜鸡1 天前
【2025最新】ArcGIS for JavaScript 快速实现热力图渲染
开发语言·javascript·arcgis
PingdiGuo_guo1 天前
C++构造和折构函数详解,超详细!
开发语言·c++
来知晓1 天前
语音处理:音频移形幻影,为何大振幅信号也无声
开发语言·音视频
啦啦9117141 天前
提供一些准备Java八股文面试的建议
java·开发语言·面试
湫兮之风1 天前
C++:彻底理解左值和右值(从概念到实践,基础版)
开发语言·c++
无敌的牛1 天前
C++复习(1)
java·开发语言·面试