当前位置: 首页 > news >正文

反向代理与内网穿透实战

反向代理与内网穿透实战

简介

在互联网架构中,代理技术和内网穿透是两个极为重要的网络技术。反向代理隐藏了内部服务器的真实地址,提供了安全性和负载均衡能力;内网穿透则让处于内网环境中的服务能够被外部访问。本文将从正向代理与反向代理的概念讲起,结合 Nginx 配置、Squid 代理、frp/ngrok 内网穿透工具,以及典型网络架构设计,为你提供完整的实战指导。


一、代理的概念

1.1 什么是代理

代理就是在客户端和服务器之间设置一道关卡。客户端发送请求数据后,代理服务器将数据包拦截,再以代理的身份将数据发送到服务器;同理,服务器返回响应数据时,代理服务器也会拦截数据,再返回给客户端。

[图片占位符:代理工作原理图]

1.2 代理的分类

代理的核心区别在于代理服务器代表谁

  • 正向代理(Forward Proxy):代理服务器代表客户端。客户端知道目标服务器的存在,但目标服务器不知道真实的客户端是谁。
  • 反向代理(Reverse Proxy):代理服务器代表服务器。客户端不知道真实的服务器是谁,以为代理服务器就是目标服务器。

简单判断标准:业务服务器在内网(防火墙内)还是外网(防火墙外)。如果被代理的是内网的服务器,就是反向代理;如果被代理的是客户端,就是正向代理。

二、正向代理

2.1 正向代理的使用场景

  • 突破网络访问限制(如访问被屏蔽的网站)
  • 隐藏客户端的真实 IP
  • 缓存加速(代理服务器缓存常用资源)
  • 访问控制

2.2 Squid 搭建正向代理

以阿里云 Ubuntu 16.04 为例:

安装 Squid

sudoapt-getinstallsquid

配置 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 端口。

重启并验证

sudosystemctl restart squid.servicesudonetstat-nlt# 确认 3128 端口监听成功

客户端配置

在浏览器中设置 HTTP 代理,指向 Squid 服务器的 IP 和端口(3128),然后在百度中搜索"IP"即可验证代理是否生效。

三、反向代理

3.1 反向代理的概念

反向代理(Reverse Proxy)是指以代理服务器来接受 Internet 上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给 Internet 上请求连接的客户端。此时,代理服务器对外就表现为一个服务器。

[图片占位符:反向代理工作流程图]

3.2 反向代理的作用

  1. 隐藏真实服务器:客户端只能看到代理服务器的地址,无法直接访问内部业务服务器
  2. 安全防护:代理服务器作为第一道防线,可以过滤恶意请求
  3. 负载均衡:将请求分发到多台后端服务器
  4. 缓存加速:缓存静态资源,减轻后端服务器压力
  5. 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 架构设计原则

  1. 由外向内,安全性递增:越内层的服务器安全性要求越高
  2. 横向扩展:通过增加服务器数量提升性能,而不是单机升级
  3. 单一职责:每层只负责自己的核心功能
  4. 故障隔离:某层出现问题不影响其他层的正常运行

五、内网穿透

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-cfrps.ini# 客户端./frpc-cfrpc.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 协议会根据子网掩码判定它们在不同的网络里)。要实现通信,必须通过网关转发:

  1. 网络 A 的主机发现目标不在本地网络
  2. 将数据包转发给自己的网关
  3. 网关转发给网络 B 的网关
  4. 网络 B 的网关转发给目标主机

6.4 带宽与吞吐量

  • 带宽:每秒最多能传输的数据量(理论上限)
    • 20M 带宽 = 20,000,000 b/s = 2.5 MB/s
  • 吞吐量:每秒实际传输的数据量

类比:一条路一次能通过 100 辆车,这是带宽;某一秒正有 56 辆车通过,这是吞吐量。

七、安全注意事项

7.1 反向代理安全

  • Nginx 与后端服务器之间应配置安全的防火墙规则
  • 隐藏后端服务器的真实 IP
  • 使用 HTTPS 加密传输
  • 配置请求频率限制,防止 DDoS

7.2 内网穿透安全

  • 使用强密码和密钥认证
  • 限制可穿透的端口和协议
  • 定期审计穿透规则
  • 生产环境慎用,仅用于开发和测试

总结

反向代理和内网穿透是现代网络架构中不可或缺的技术:

  1. 反向代理:Nginx 是首选工具,理解其"代理服务器对外表现为一个服务器"的本质
  2. 三层架构:前端 -> 应用 -> 数据库,由外向内安全性递增
  3. 内网穿透:frp 是目前最推荐的工具,配置简单,功能强大
  4. 网络安全:在追求便捷的同时,不要忽视安全性

掌握这些技术,不仅能帮你设计出更好的网络架构,还能在日常开发和运维中解决很多实际问题。


原始笔记来源:hhjt/otherNotes.cpp(Nginx/反向代理/Squid/frp/ngrok/网络架构部分)

http://www.cnnetsun.cn/news/2037061.html

相关文章:

  • 微服务架构设计核心原则解析
  • CentOS7.9磁盘管理全栈【20260420】001篇
  • 从数据手册到实际代码:一步步拆解SGP30的IIC通信协议与STM32驱动逻辑
  • Python动态特性与Monkey Patching实战解析
  • GME-Qwen2-VL-2B-Instruct惊艳效果:0.12低匹配文本自动过滤+0.48高匹配标红展示
  • 前端架构设计
  • 05(开源)加工工艺匹配:顶级车床切削参数·刀具适配·工况适配 保姆级开源参数【国产机床登顶系列第五篇】
  • 打卡信奥刷题(3149)用C++实现信奥题 P7677 [COCI 2013/2014 #5] LADICE
  • STC89C52单片机玩转NE555:手把手教你实现一个简易频率计(附完整工程)
  • Qwen3.5-9B-GGUF本地AI办公套件:邮件撰写、会议纪要、PPT大纲一体化
  • CardEditor:3MB轻量级桌游卡牌批量生成器,让设计效率提升300%
  • 如何用macOS自动点击器实现高效自动化操作:完整指南
  • 速看!黄金秘籍解决华为防火墙最困难的故障
  • 电商反爬这道墙,Web Unlocker 是怎么翻过去的?
  • 别再乱喂狗了!AutoSar WdgM三种监控机制(Alive/Deadline/Logical)实战配置避坑指南
  • 国家中小学智慧教育平台电子课本解析工具:3分钟极速获取教学资源的终极指南
  • 深度强化学习实战:从零构建游戏AI的Q学习指南
  • 新手必看:CTFHub靶场RCE通关保姆级教程(从环境搭建到Flag获取)
  • 从三相到两相:手把手推导感应电机的Clarke与Park变换(附MATLAB验证代码)
  • 计算机毕业设计:Python股票市场智能分析与LSTM预测系统 Flask框架 TensorFlow LSTM 数据分析 可视化 大数据 大模型(建议收藏)✅
  • 从一次订单失败回滚看Seata AT模式:一个真实微服务事务的完整生命周期
  • 实测10款降AI率工具后,2026年4月最香的是嘎嘎降AI!
  • 3小时掌握SketchUp STL插件:从建模到3D打印的完整实战指南
  • STM32F1系列LIN总线从机节点实战:车窗控制模块模拟与数据解析
  • RAG检索又失败了?Skill-RAG让RAG学会对症下药
  • Docker农业配置必须关闭的7个默认参数(附实测对比数据:CPU占用下降62%,启动延迟压缩至1.8s)
  • 别再为LaTeX三线表头疼了!手把手教你用booktabs和makecell搞定复杂表格(附完整代码)
  • Golang逆向工程实战:构建抖音直播数据实时采集系统
  • YOLO自动标注工具软件
  • 从GitHub到百度云:手把手教你备份和整理吴恩达机器学习全套资源(笔记+代码+视频)