背景与需求

在内网环境中,服务器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. 安全增强建议

  1. 使用Let's Encrypt替换自签名证书
  2. 启用proxy_ssl_verify on进行严格证书验证
  3. 配置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错误

检查点

  1. proxy_pass末尾是否包含/
  2. Host头是否与目标服务域名一致
  3. 目标服务是否配置了路径权限

方案扩展

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加密通信

适用于混合云、内网穿透、服务聚合等场景。实际部署时,请根据业务需求调整超时时间、缓存策略等高级参数。

标签: Nginx, 反向代理, 端口转发, SSL证书, 服务器配置

添加新评论