通过Nginx反向代理与端口转发实现跨服务器安全访问
背景与需求
在内网环境中,服务器B因安全限制仅能通过特定端口(如10443)与服务器A通信,且无法直接访问外网。如何让服务器B通过服务器A代理访问外部服务(如Git仓库、OSS存储),同时保持通信安全?本文提供完整解决方案。
架构设计
通过以下架构实现需求:
graph LR
A[服务器B] -->|80/443请求| B[本地Nginx]
B -->|10443转发| C[服务器A]
C -->|反向代理| D[外部服务: Git/OSS]
核心配置步骤
1. 服务器A配置(反向代理核心)
1.1 Nginx配置
server {
listen 10443 ssl http2;
server_name proxy.example.com;
ssl_certificate /etc/nginx/ssl/proxy.example.com.crt;
ssl_certificate_key /etc/nginx/ssl/proxy.example.com.key;
location /app/ {
proxy_pass https://external-service.com/app/;
proxy_set_header Host external-service.com;
proxy_ssl_server_name on;
}
}
1.2 证书生成
openssl req -x509 -nodes -days 3650 -newkey rsa:2048 \
-keyout proxy.example.com.key \
-out proxy.example.com.crt \
-subj "/CN=proxy.example.com"
2. 服务器B配置(本地端口转发)
2.1 Hosts文件配置
echo "127.0.0.1 proxy.example.com" >> /etc/hosts
2.2 Nginx转发配置
server {
listen 80;
listen 443 ssl;
server_name proxy.example.com;
ssl_certificate /etc/nginx/ssl/proxy.example.com.crt;
ssl_certificate_key /etc/nginx/ssl/proxy.example.com.key;
location / {
proxy_pass https://server-a-ip:10443;
proxy_set_header Host proxy.example.com;
proxy_ssl_server_name on;
proxy_ssl_verify off; # 测试环境使用
}
}
关键技术解析
1. 端口复用机制
- 服务器B:通过本地Nginx监听80/443端口,将请求转发到服务器A的10443端口
- 服务器A:通过10443端口接收请求,根据路径反向代理到外部服务
2. SSL证书链路
sequenceDiagram
Client->>ServerB: HTTPS请求(443)
ServerB->>ServerA: 加密转发(10443)
ServerA->>External: 代理请求(携带正确SSL证书)
3. 安全增强建议
- 使用Let's Encrypt替换自签名证书
- 启用
proxy_ssl_verify on
进行严格证书验证 - 配置IP白名单限制访问来源
验证与测试
1. 端口连通性测试
# 服务器B验证到服务器A的10443端口
nc -zv server-a-ip 10443
# 服务器B验证本地Nginx
curl -vk https://proxy.example.com/app/
2. 日志验证
- 服务器A Nginx日志:
tail -f /var/log/nginx/access.log | grep "GET /app/"
- 服务器B Nginx日志:
tail -f /var/log/nginx/access.log | grep "proxy.example.com"
常见问题处理
1. 证书不匹配错误
现象:SSL certificate problem: self signed certificate
解决方案:
# 服务器B临时禁用验证
proxy_ssl_verify off;
# 生产环境应:
1. 生成与域名匹配的证书
2. 将证书加入系统信任库
2. 路径404错误
检查点:
proxy_pass
末尾是否包含/
Host
头是否与目标服务域名一致- 目标服务是否配置了路径权限
方案扩展
1. 多服务代理
# 服务器A配置多个location
location /git/ {
proxy_pass https://git.example.com/;
}
location /oss/ {
proxy_pass https://oss.example.com/;
}
2. 性能优化
# 启用缓存
proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=app_cache:10m;
location /app/ {
proxy_cache app_cache;
proxy_pass https://external-service.com/app/;
}
总结
通过本文方案,您可实现:
- 通过单一端口(10443)安全转发所有请求
- 支持多服务(Git/OSS/API)的统一代理
- 确保全链路SSL加密通信
适用于混合云、内网穿透、服务聚合等场景。实际部署时,请根据业务需求调整超时时间、缓存策略等高级参数。