文章目录
-
- Windows防火墙基础
- 防火墙配置实战
-
- [场景 1:允许特定端口](#场景 1:允许特定端口)
- [场景 2:限制来源 IP](#场景 2:限制来源 IP)
- [场景 3:阻止特定端口](#场景 3:阻止特定端口)
- [场景 4:临时启用规则](#场景 4:临时启用规则)
- [场景 5:按程序放行](#场景 5:按程序放行)
- 查看和管理规则
- NAT与端口转发
-
- [什么是 NAT?](#什么是 NAT?)
- [NAT 工作原理](#NAT 工作原理)
- 为什么外网扫描不到内网端口?
- 配置端口转发
- [DMZ 主机(不推荐)](#DMZ 主机(不推荐))
- [Web 反向代理与端口隐藏](#Web 反向代理与端口隐藏)
-
- 反向代理的工作原理
- 隐藏了真实的后端端口(端口隔离)
- 后端服务绑定本地回环地址(127.0.0.1)
- [CDN 的层层掩护](#CDN 的层层掩护)
- [反向代理 vs 普通端口转发](#反向代理 vs 普通端口转发)
- 总结
- 外网访问排查
Windows防火墙基础
防火墙工作原理
**防火墙(Firewall)**是计算机网络安全的第一道防线,用于监控和控制网络流量。
工作流程:
网络流量
↓
防火墙规则检查
↓
┌─────────────┬─────────────┬─────────────┐
│ 允许 │ 阻止 │ 静默丢弃 │
│ (Allow) │ (Block) │ (Drop) │
└─────────────┴─────────────┴─────────────┘
三种动作:
- 允许(Allow):放行流量
- 阻止(Block):拒绝并返回 RST
- 静默丢弃(Drop):不响应,扫描器显示 Filtered
防火墙配置文件
Windows 防火墙有三种配置文件:
| 配置文件 | 适用场景 | 安全级别 |
|---|---|---|
| 域(Domain) | 连接到公司域网络 | 中等 |
| 专用(Private) | 家庭或可信网络 | 中等 |
| 公用(Public) | 咖啡厅、机场等 | 最高 |
查看当前配置文件:
powershell
Get-NetFirewallProfile | Format-Table Name, Enabled
入站规则 vs 出站规则
| 规则类型 | 作用 | 默认策略 |
|---|---|---|
| 入站规则 | 控制进入电脑的流量 | 默认阻止 |
| 出站规则 | 控制离开电脑的流量 | 默认允许 |
为什么默认阻止入站?
- 防止外部攻击者访问内部服务
- 防止恶意软件开放后门
- 最小权限原则
防火墙规则组成要素
powershell
New-NetFirewallRule `
-DisplayName "规则名称" `
-Direction Inbound `
-Action Allow `
-Protocol TCP `
-LocalPort 80 `
-RemoteAddress 192.168.0.0/24 `
-Profile Private `
-Enabled True
关键参数:
- DisplayName:规则显示名称
- Direction:Inbound(入站)/ Outbound(出站)
- Action:Allow(允许)/ Block(阻止)
- Protocol:TCP / UDP / ICMP
- LocalPort:本地端口
- RemoteAddress:远程 IP(可选)
- Profile:应用的网络配置文件
- Enabled:是否启用
防火墙配置实战
场景 1:允许特定端口
需求:允许 Web 服务器(端口 80)
powershell
# 允许 80 端口入站
New-NetFirewallRule -DisplayName "Web Server" -Direction Inbound -Action Allow -Protocol TCP -LocalPort 80
# 同时允许 HTTP 和 HTTPS
New-NetFirewallRule -DisplayName "Web Services" -Direction Inbound -Action Allow -Protocol TCP -LocalPort 80,443
场景 2:限制来源 IP
需求:只允许特定 IP 访问 RDP
powershell
# 仅允许 192.168.0.101 访问 3389
New-NetFirewallRule -DisplayName "RDP Limited" -Direction Inbound -Action Allow -Protocol TCP -LocalPort 3389 -RemoteAddress 192.168.0.101
# 允许整个子网
New-NetFirewallRule -DisplayName "RDP Subnet" -Direction Inbound -Action Allow -Protocol TCP -LocalPort 3389 -RemoteAddress 192.168.0.0/24
场景 3:阻止特定端口
需求:阻止 SMB 端口防止勒索病毒
powershell
# 阻止 445 端口
New-NetFirewallRule -DisplayName "Block SMB" -Direction Inbound -Action Block -Protocol TCP -LocalPort 445
# 阻止多个端口
New-NetFirewallRule -DisplayName "Block Dangerous" -Direction Inbound -Action Block -Protocol TCP -LocalPort 135,139,445
场景 4:临时启用规则
需求:临时允许文件共享,用完即禁用
powershell
# 启用规则
Enable-NetFirewallRule -DisplayName "文件和打印机共享 (SMB-In)"
# 使用完成后立即禁用
Disable-NetFirewallRule -DisplayName "文件和打印机共享 (SMB-In)"
场景 5:按程序放行
需求:只允许特定程序访问网络
powershell
# 允许 Chrome 浏览器
New-NetFirewallRule -DisplayName "Chrome" -Direction Outbound -Action Allow -Program "C:\Program Files\Google\Chrome\Application\chrome.exe"
# 阻止可疑程序
New-NetFirewallRule -DisplayName "Block Malware" -Direction Outbound -Action Block -Program "C:\Users\Public\malware.exe"
查看和管理规则
powershell
# 查看所有规则
Get-NetFirewallRule | Format-Table DisplayName, Enabled, Action, Direction
# 查看特定端口规则
Get-NetFirewallRule | Where-Object {$_.LocalPort -eq 3389} | Format-Table DisplayName, Enabled, Action
# 查看特定程序规则
Get-NetFirewallRule -Program "C:\path\to\program.exe" | Format-Table DisplayName, Enabled
# 删除规则
Remove-NetFirewallRule -DisplayName "规则名称"
# 导出规则
Export-NetFirewallRule -Path "C:\backup\firewall.xml"
# 导入规则
Import-NetFirewallRule -Path "C:\backup\firewall.xml"
NAT与端口转发
什么是 NAT?
NAT(Network Address Translation,网络地址转换)是将内网 IP 转换为公网 IP 的技术。
为什么需要 NAT?
- IPv4 地址耗尽
- 保护内网设备
- 多个设备共享一个公网 IP
NAT 工作原理
内网设备 (192.168.0.114:80)
↓
路由器 NAT 转换
↓
公网 IP (123.45.67.89:54321)
↓
互联网
NAT 转换表:
| 内网地址 | 公网地址 | 说明 |
|---|---|---|
| 192.168.0.114:80 | 123.45.67.89:54321 | Web 服务 |
| 192.168.0.101:443 | 123.45.67.89:54322 | HTTPS 服务 |
为什么外网扫描不到内网端口?
问题描述:
- 电脑开放了 80 端口
- 路由器公网 IP 是 123.45.67.89
- 外网扫描
123.45.67.89:80→ Filtered
原因:
互联网扫描器 → 路由器公网 IP:80
↓
NAT转换表
↓
没有80端口的转发规则
↓
丢弃数据包
↓
扫描器显示:Filtered
配置端口转发
需求:让外网可以访问内网 Web 服务器
步骤 1:登录路由器管理界面
- 浏览器访问:
http://192.168.0.1或http://192.168.1.1 - 输入管理员账号密码
步骤 2:找到端口转发设置
- 常见名称:
- 端口转发(Port Forwarding)
- 虚拟服务器(Virtual Server)
- NAT 设置
- 高级路由
步骤 3:添加转发规则
| 字段 | 值 | 说明 |
|---|---|---|
| 服务名称 | Web Server | 自定义名称 |
| 外部端口 | 80 | 公网访问的端口 |
| 内部 IP | 192.168.0.114 | 内网服务器 IP |
| 内部端口 | 80 | 内网服务端口 |
| 协议 | TCP | 或 TCP/UDP |
| 状态 | 启用 | 启用规则 |
步骤 4:配置 Windows 防火墙
powershell
# 允许 80 端口入站
New-NetFirewallRule -DisplayName "Web Server" -Direction Inbound -Action Allow -Protocol TCP -LocalPort 80
步骤 5:验证配置
bash
# 从外网扫描(使用手机 4G 网络)
nmap -p 80 123.45.67.89
# 应该显示 Open
DMZ 主机(不推荐)
**DMZ(Demilitarized Zone)**是将一台内网设备完全暴露到公网。
配置方法:
- 路由器设置 → DMZ 主机
- 输入内网 IP:192.168.0.114
- 启用 DMZ
警告:
- 所有端口都暴露
- 没有任何保护
- 极易被攻击
- 仅用于测试环境
Web 反向代理与端口隐藏
反向代理的工作原理
Web 反向代理(如 Nginx、CDN 等)同样会导致你无法通过外网扫描直接探测到内网真实的后端端口。
反向代理不仅会"扫不到",而且它本身就是为了解决"如何安全地让外网访问内网服务"而设计的。它的存在相当于在你的内网服务器前加了一个极其智能的"前台接待员"。
外网请求
↓
反向代理服务器(前台)
↓
内部转发
↓
内网真实服务(后台)
隐藏了真实的后端端口(端口隔离)
反向代理的核心工作机制是"代劳"。
对外表现:
- 反向代理服务器(前台)通常只对外开放最标准的 Web 端口
- 即 80 (HTTP) 和 443 (HTTPS)
- 外网扫描器扫描你的域名或公网 IP 时,只能看到这两个端口是开放的
对内转发:
- 当反向代理收到外部的请求后,它会在内部(服务器本机或内网环境)将请求转发给真正的后端服务
- 你的后端服务可能运行在 8080、3000、9001 等任意非标准端口上
结果:
- 外网扫描器根本接触不到你内网的 8080 或 3000 端口
- 因为这些端口从未直接暴露给公网
- 扫描结果会显示除 80/443 外的其他端口全部为 filtered (被过滤)或 closed(关闭)
后端服务绑定本地回环地址(127.0.0.1)
为了达到极致的安全,使用反向代理时,运维人员通常会配合一个关键操作:将后端应用程序只绑定在 127.0.0.1(本地回环地址)上。
这意味着:
- 你的 Web 服务(比如一个 Python Flask 或 Node.js 应用)只监听来自服务器内部的请求
- 即使有人奇迹般地绕过了防火墙,试图从外部直接攻击你的真实后端端口
- 操作系统也会直接拒绝,因为该端口压根就没有绑定在对外网卡上
CDN 的层层掩护
如果你的反向代理前端还套了一层 CDN(内容分发网络,如 Cloudflare、阿里云 CDN 等),情况会更加彻底:
IP 隐藏:
- 外网扫描器扫描到的 IP 地址,实际上是 CDN 在全球各地的边缘节点 IP
- 根本不是你的源站服务器 IP
流量清洗:
- CDN 节点会拦截所有非标准的 HTTP/HTTPS 请求
- 如果你试图用 Nmap 去扫描 CDN IP 的其他端口(比如 SSH 的 22 端口或数据库的 3306 端口)
- CDN 的防御机制会直接丢弃这些探测包,导致扫描结果全是 filtered
反向代理 vs 普通端口转发
| 特性 | 普通端口转发 | Web 反向代理 |
|---|---|---|
| 端口暴露 | 外网能看到转发的端口 | 只暴露 80/443 |
| 后端可见性 | 外网可探测到内网端口 | 后端端口完全隐藏 |
| 安全性 | 中等 | 高 |
| 灵活性 | 一对一映射 | 可基于域名、路径转发 |
| 额外功能 | 无 | SSL 终止、负载均衡、缓存 |
普通端口转发:
- 只是把外网的 80 端口映射到内网的 8080
- 外网依然能探测到 80 端口有东西
反向代理:
- 外网只能看到反向代理(前台)开放的 80/443 端口
- 至于内网真实的后端到底开了什么端口、跑在哪个 IP 上
- 对外界来说是完全黑盒的
总结
Web 反向代理 = 高级版的端口转发 + 端口隐藏
如果你配置了 Web 反向代理,外网扫描不到你的内网真实业务端口,这不仅是正常现象 ,更是反向代理发挥作用、保护你源站安全的最佳证明。
外网访问排查
三层关卡模型
外网访问内网
↓
┌─────────────────────┐
│ 第一关:NAT │ ← 路由器拦截
└─────────────────────┘
↓
┌─────────────────────┐
│ 第二关:防火墙 │ ← 电脑拦截
└─────────────────────┘
↓
┌─────────────────────┐
│ 第三关:运营商 NA │ ← 无公网 IP
└─────────────────────┘
第一关:NAT(路由器拦截)
现象:
- 电脑 IP:
192.168.0.114 - 路由器公网 IP:
123.45.67.89 - 外网扫描
123.45.67.89:80→ Filtered
检查方法:
- 登录路由器管理界面
- 查看端口转发规则
- 确认规则已启用
解决方法:
- 添加端口转发规则(见上文)
- 确保规则指向正确的内网 IP
- 检查路由器防火墙设置
第二关:Windows防火墙
现象:
- 路由器已配置端口转发
- 外网扫描仍然 Filtered
检查方法:
powershell
# 查看防火墙规则
Get-NetFirewallRule | Where-Object {$_.LocalPort -eq 80} | Format-Table DisplayName, Enabled, Action
# 检查端口监听
netstat -ano | findstr :80
# 测试本地连接
Test-NetConnection -ComputerName localhost -Port 80
解决方法:
- 添加入站规则允许端口
- 确保规则应用于正确的配置文件(公用/专用)
- 检查是否有阻止规则优先级更高
第三关:运营商级NAT
现象:
- 端口转发已配置
- Windows 防火墙已放行
- 外网扫描仍然 Filtered 或 Closed
原因:你没有真正的公网 IP
检查方法:
bash
# 1. 查看路由器 WAN 口 IP
# 登录路由器管理界面 → 查看 WAN 口状态
# 假设看到:100.64.1.234
# 2. 查询实际公网 IP
curl ifconfig.me
# 假设看到:123.45.67.89
# 3. 对比两个 IP
# 100.64.1.234 ≠ 123.45.67.89
# 说明你在运营商大内网中
常见内网 IP 段:
| IP 段 | 说明 |
|---|---|
100.64.0.0/10 |
运营商 NAT 专用 |
10.0.0.0/8 |
A 类私有地址 |
172.16.0.0/12 |
B 类私有地址 |
192.168.0.0/16 |
C 类私有地址 |
完整排查流程
外网扫描不到端口
↓
1. 检查是否有公网 IP
├─ 路由器 WAN 口 IP = 公网 IP?→ 继续
└─ 不一致 → 申请公网 IP或使用内网穿透
↓
2. 检查端口转发配置
├─ 路由器已配置转发 → 继续
└─ 未配置 → 添加端口转发规则
↓
3. 检查 Windows 防火墙
├─ 已添加入站规则 → 继续
└─ 未添加 → 创建允许规则
↓
4. 检查服务是否运行
├─ 端口有程序监听 → 成功
└─ 无程序 → 启动服务
免责声明:本文档仅供学习和合法网络配置使用。未经授权访问他人网络可能违反法律法规。