apache实现内网穿透本质是配置反向代理,需启用mod_proxy等模块、禁用正向代理,通过proxypass/proxypassreverse做路径映射并透传host与x-forwarded头,支持balancer集群提升可维护性。

用 Apache 实现内网服务穿透,本质是配置反向代理,把公网请求安全、准确地转给内网服务,同时保留原始请求上下文。关键不在“穿透”这个词,而在如何让内网服务像部署在公网一样被访问——靠的是路径映射、头透传和协议适配。
启用必要模块并关闭正向代理
这是所有代理功能的基础,缺一不可:
- 确认已加载 mod_proxy、mod_proxy_http(支持 HTTP/HTTPS 后端),必要时加 mod_proxy_wstunnel(WebSocket)或 mod_ssl(终止 HTTPS)
- 运行
apachectl -M | grep proxy检查模块状态 - 在全局或虚拟主机中必须设置:
ProxyRequests Off(禁用正向代理,防滥用)<proxy><br> Require all granted<br></proxy>
(允许本机发起代理请求)
用 ProxyPass + ProxyPassReverse 做路径级代理
这是最稳定、推荐的方式,能自动修正重定向、Cookie 域名和绝对 URL:
- 路径末尾斜杠必须严格一致:例如
ProxyPass /api/ http://10.0.1.5:3000/api/,两边都带/ - 必须成对使用
ProxyPassReverse,否则后端返回的Location: /login会被浏览器解析为内网地址,导致跳转失败 - 静态资源建议绕过代理:
ProxyPass /static !,由 Apache 直接响应,减少后端压力
透传真实请求信息,避免后端“失明”
后端服务需要知道用户是谁、走的什么协议、访问的哪个域名,否则日志、限流、跳转都会出错:
-
ProxyPreserveHost On:把客户端原始 Host 头(如app.example.com)传给后端,Spring Boot 或 Node.js 才能生成正确跳转链接 - 注入标准代理头:
RequestHeader set X-Forwarded-For "%{REMOTE_ADDR}e"<br>RequestHeader set X-Forwarded-Proto "https" env=HTTPS<br>RequestHeader set X-Forwarded-Proto "http" env=!HTTPS - 后端必须主动读取这些头(不能只用
request.getRemoteAddr()),否则风控、限流、IP 日志全部失效
面向多服务时,用 balancer:// 定义逻辑集群
避免硬编码 IP,提升可维护性和扩展性:
- 用
balancer://协议定义服务组,例如:<proxy balancer:><br> BalancerMember http://192.168.2.10:8080 route=u1<br> BalancerMember http://192.168.2.11:8080 route=u2<br></proxy>
- 再通过
ProxyPass /user/ balancer://userservice/绑定路径,后续增减节点只需改 balancer 配置,无需动路由规则











