反向代理与内网穿透实战
反向代理与内网穿透实战
简介
在互联网架构中,代理技术和内网穿透是两个极为重要的网络技术。反向代理隐藏了内部服务器的真实地址,提供了安全性和负载均衡能力;内网穿透则让处于内网环境中的服务能够被外部访问。本文将从正向代理与反向代理的概念讲起,结合 Nginx 配置、Squid 代理、frp/ngrok 内网穿透工具,以及典型网络架构设计,为你提供完整的实战指导。
![[图片占位符:正向代理与反向代理对比示意图]](https://i-blog.csdnimg.cn/direct/0cc798d7412840c29c40265ca0add3e1.png)

一、代理的概念
1.1 什么是代理
代理就是在客户端和服务器之间设置一道关卡。客户端发送请求数据后,代理服务器将数据包拦截,再以代理的身份将数据发送到服务器;同理,服务器返回响应数据时,代理服务器也会拦截数据,再返回给客户端。
[图片占位符:代理工作原理图]
1.2 代理的分类
代理的核心区别在于代理服务器代表谁:
- 正向代理(Forward Proxy):代理服务器代表客户端。客户端知道目标服务器的存在,但目标服务器不知道真实的客户端是谁。
- 反向代理(Reverse Proxy):代理服务器代表服务器。客户端不知道真实的服务器是谁,以为代理服务器就是目标服务器。
简单判断标准:业务服务器在内网(防火墙内)还是外网(防火墙外)。如果被代理的是内网的服务器,就是反向代理;如果被代理的是客户端,就是正向代理。
二、正向代理
2.1 正向代理的使用场景
- 突破网络访问限制(如访问被屏蔽的网站)
- 隐藏客户端的真实 IP
- 缓存加速(代理服务器缓存常用资源)
- 访问控制
2.2 Squid 搭建正向代理
以阿里云 Ubuntu 16.04 为例:
安装 Squid:
sudo apt-get install squid
配置 Squid (/etc/squid/squid.conf):
# 修改代理服务器端口
http_port 3128
# 定义允许访问的客户端(可选,基于外网 IP)
acl myhome src 171.213.12.0/255.0.0.0
# 允许指定客户端访问
http_access allow myhome
# 允许所有客户端访问(不推荐生产环境使用)
http_access allow all
# 注释掉默认的拒绝规则
# http_access deny all
注意:阿里云需要在安全组中放行 3128 端口。
重启并验证:
sudo systemctl restart squid.service
sudo netstat -nlt # 确认 3128 端口监听成功
客户端配置:
在浏览器中设置 HTTP 代理,指向 Squid 服务器的 IP 和端口(3128),然后在百度中搜索"IP"即可验证代理是否生效。
三、反向代理
3.1 反向代理的概念
反向代理(Reverse Proxy)是指以代理服务器来接受 Internet 上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给 Internet 上请求连接的客户端。此时,代理服务器对外就表现为一个服务器。
[图片占位符:反向代理工作流程图]
3.2 反向代理的作用
- 隐藏真实服务器:客户端只能看到代理服务器的地址,无法直接访问内部业务服务器
- 安全防护:代理服务器作为第一道防线,可以过滤恶意请求
- 负载均衡:将请求分发到多台后端服务器
- 缓存加速:缓存静态资源,减轻后端服务器压力
- SSL 卸载:在代理层处理 HTTPS 加解密
3.3 Nginx 反向代理
Nginx 作为一款优秀的 HTTP 服务器,其反向代理功能在软件架构中起到极为重要的作用。
工作原理:客户端要访问处在内网环境(防火墙后)的业务服务器,可以先访问公网上(防火墙外)的 Nginx 服务器,再由 Nginx 代为访问业务服务器,将结果反馈给客户端。Nginx 与业务服务器之间应配置安全的防火墙通道,向外隐藏业务服务器。
基础反向代理配置:
server {
listen 80;
server_name www.example.com;
location / {
proxy_pass http://192.168.1.100:8080; # 后端业务服务器地址
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
负载均衡配置:
upstream backend {
server 192.168.1.100:8080 weight=3;
server 192.168.1.101:8080 weight=2;
server 192.168.1.102:8080 weight=1;
}
server {
listen 80;
server_name www.example.com;
location / {
proxy_pass http://backend;
}
}
HTTPS 配置(SSL 卸载):
server {
listen 443 ssl;
server_name www.example.com;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
location / {
proxy_pass http://192.168.1.100:8080;
}
}
四、典型网络架构
4.1 网站三层架构
随着互联网的快速发展,单台服务器已经无法满足需求,典型的分层架构应运而生:
[图片占位符:三层网络架构示意图]
第一层 – 前端服务器(边缘服务器/反向代理服务器)
- 直接与用户发生联系
- 部署在公网上,防火墙外
- 负责接收客户端请求、静态资源缓存、SSL 处理
- 典型软件:Nginx、HAProxy、Varnish
第二层 – 应用服务器
- 负责请求的业务逻辑处理
- 部署在内网中,不直接暴露给外网
- 可以水平扩展多台
- 典型架构:Tomcat、Node.js、PHP-FPM
第三层 – 数据库服务器
- 负责数据的存储、查询和修改
- 最内层,安全性要求最高
- 典型数据库:MySQL、PostgreSQL、MongoDB
可选的辅助层:
- 缓存服务器:Redis、Memcached
- 负载均衡服务器:LVS、F5
- 防火墙服务器
4.2 架构设计原则
- 由外向内,安全性递增:越内层的服务器安全性要求越高
- 横向扩展:通过增加服务器数量提升性能,而不是单机升级
- 单一职责:每层只负责自己的核心功能
- 故障隔离:某层出现问题不影响其他层的正常运行
五、内网穿透
5.1 为什么需要内网穿透
在开发过程中,我们经常需要让外部网络访问本地开发环境中的服务(如 Web 服务、API 接口等)。但由于 NAT(网络地址转换)和防火墙的存在,内网服务无法直接被外网访问。内网穿透工具就是用来解决这个问题的。
5.2 内网穿透的原理
内网穿透的核心原理是:通过一台具有公网 IP 的服务器作为中转,在内网客户端和公网服务器之间建立一条持久的连接通道。外部请求先到达公网服务器,再通过隧道转发到内网服务。
[图片占位符:内网穿透原理图]
5.3 frp 内网穿透
frp 是一款优秀的内网穿透工具,支持 TCP、HTTP、UDP、STCP 等多种协议,配置简单清晰,是 ngrok 的良好替代品。
frp 架构:
- frps:服务端,运行在有公网 IP 的服务器上
- frpc:客户端,运行在内网机器上
服务端配置 (frps.ini):
[common]
bind_port = 7000 # frp 服务端口
dashboard_port = 7500 # 仪表盘端口
dashboard_user = admin
dashboard_pwd = password
客户端配置 (frpc.ini):
[common]
server_addr = your_server_ip
server_port = 7000
# HTTP 穿透
[web]
type = http
local_ip = 127.0.0.1
local_port = 8080
custom_domains = your_domain.com
# TCP 穿透
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000
启动:
# 服务端
./frps -c frps.ini
# 客户端
./frpc -c frpc.ini
5.4 ngrok 内网穿透
ngrok 也可以利用云服务器搭建内网穿透服务,但目前已停止维护,推荐使用 frp 替代。
5.5 应用场景
- 开发调试:将本地 Web 服务暴露给外部测试
- 远程访问:通过外网 SSH 访问内网服务器
- 微信开发:微信回调需要公网可访问的 URL
- 临时演示:将本地项目展示给远程客户
六、网络基础知识
6.1 路由器
路由器负责网络路由功能,即网络寻址。网络中两台计算机通信时,数据包会经历成千上万的路由器。每个路由器收到数据包后,计算下一个路由器的地址并转发,直到数据包到达目的地。
6.2 交换机
交换机用于连接不同的局域网。假设公司有两个部门各有独立的局域网,当它们需要通信时,就需要交换机将两个网络联通。连接到同一交换机的任何网络都能互通。
具有路由功能的交换机称为三层交换机。
6.3 网关
网关实质上是一个网络通向其他网络的 IP 地址。例如:
- 网络 A:192.168.1.0/24
- 网络 B:192.168.2.0/24
这两个网络之间不能直接通信(TCP/IP 协议会根据子网掩码判定它们在不同的网络里)。要实现通信,必须通过网关转发:
- 网络 A 的主机发现目标不在本地网络
- 将数据包转发给自己的网关
- 网关转发给网络 B 的网关
- 网络 B 的网关转发给目标主机
6.4 带宽与吞吐量
- 带宽:每秒最多能传输的数据量(理论上限)
- 20M 带宽 = 20,000,000 b/s = 2.5 MB/s
- 吞吐量:每秒实际传输的数据量
类比:一条路一次能通过 100 辆车,这是带宽;某一秒正有 56 辆车通过,这是吞吐量。
七、安全注意事项
7.1 反向代理安全
- Nginx 与后端服务器之间应配置安全的防火墙规则
- 隐藏后端服务器的真实 IP
- 使用 HTTPS 加密传输
- 配置请求频率限制,防止 DDoS
7.2 内网穿透安全
- 使用强密码和密钥认证
- 限制可穿透的端口和协议
- 定期审计穿透规则
- 生产环境慎用,仅用于开发和测试
总结
反向代理和内网穿透是现代网络架构中不可或缺的技术:
- 反向代理:Nginx 是首选工具,理解其"代理服务器对外表现为一个服务器"的本质
- 三层架构:前端 -> 应用 -> 数据库,由外向内安全性递增
- 内网穿透:frp 是目前最推荐的工具,配置简单,功能强大
- 网络安全:在追求便捷的同时,不要忽视安全性
掌握这些技术,不仅能帮你设计出更好的网络架构,还能在日常开发和运维中解决很多实际问题。
原始笔记来源: hhjt/otherNotes.cpp(Nginx/反向代理/Squid/frp/ngrok/网络架构部分)
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐


所有评论(0)