引言

在多服务器架构中,网络隔离与访问控制是保障安全的重要手段。本文将基于实际场景,探讨如何在仅允许特定端口通信的限制下,通过Nginx反向代理与端口转发技术,实现从隔离服务器(服务器B)安全访问外网服务(如Git、OSS)的完整方案。


问题背景

场景描述

  • 服务器A:可访问外网,开放10443端口供服务器B访问。
  • 服务器B:仅能通过10443端口与服务器A通信,其他端口均被物理隔离。
  • 需求
    1. 服务器B访问外部Git仓库(如https://xxx.com.cn/git/)。
    2. 服务器B访问阿里云OSS资源(如https://xxx.oss-cn-hangzhou.aliyuncs.com/)。
    3. 用户无需在URL中显式指定10443端口。

解决方案设计

核心架构

服务器B(隔离环境) 
    ↓ 80/443(本地Nginx监听)
    → 服务器A:10443(反向代理)
        ↓ 转发至外网服务
        → xxx.com.cn/git/ 或 OSS端点

技术选型

  1. Nginx反向代理
    在服务器A部署Nginx,将10443端口的请求代理到目标服务。
  2. 本地反向代理(服务器B)
    在服务器B部署Nginx,将80/443端口请求转发到服务器A的10443端口。
  3. SSL证书
    使用自签名证书(测试环境)或Let's Encrypt证书(生产环境)。

详细配置步骤

1. 服务器A的Nginx配置

目标

代理外部服务(Git/OSS)的请求,并通过10443端口暴露给服务器B。

示例配置(Git仓库代理)

server {
    listen 10443 ssl http2;
    server_name xxx.com.cn;

    ssl_certificate /etc/nginx/ssl/xxx.com.cn.crt;
    ssl_certificate_key /etc/nginx/ssl/xxx.com.cn.key;

    location /git/ {
        proxy_pass https://xxx.com.cn/git/;
        proxy_set_header Host xxx.com.cn;
        proxy_ssl_server_name on;
        proxy_ssl_verify on;  # 生产环境启用
    }
}

配置说明

  • proxy_set_header Host:确保目标服务器收到正确的域名。
  • proxy_ssl_verify:验证目标服务器的SSL证书(生产环境必须启用)。

2. 服务器B的本地反向代理配置

目标

将本地80/443端口的请求透明转发到服务器A的10443端口。

示例配置

server {
    listen 80;
    listen 443 ssl;
    server_name xxx.com.cn;

    ssl_certificate /etc/nginx/ssl/xxx.com.cn.crt;
    ssl_certificate_key /etc/nginx/ssl/xxx.com.cn.key;

    # 转发到服务器A的10443端口
    location / {
        proxy_pass https://192.168.131.248:10443;
        proxy_set_header Host xxx.com.cn;
        proxy_ssl_server_name on;
        proxy_ssl_verify off;  # 测试环境临时禁用
    }
}

关键配置

  • proxy_pass:直接指向服务器A的IP和端口。
  • /etc/hosts:需将xxx.com.cn指向127.0.0.1(确保请求经过本地Nginx)。

3. SSL证书生成(自签名)

服务器B的证书生成

# 创建证书目录
mkdir -p /etc/nginx/ssl && cd /etc/nginx/ssl

# 生成自签名证书(有效期10年)
openssl req -x509 -nodes -days 3650 -newkey rsa:2048 \
    -keyout xxx.com.cn.key \
    -out dev.echengyun.com.cn.crt \
    -subj "/CN=xxx.com.cn"

信任自签名证书(可选)

# 将证书添加到受信任根证书库(CentOS)
cp xxx.com.cn.crt /etc/pki/ca-trust/source/anchors/
update-ca-trust

结果验证

测试命令

# 在服务器B执行
curl -vk https://xxx.com.cn/git/  # 访问Git仓库
curl -vk https://xxx.com.cn/oss-file.txt  # 访问OSS资源

预期输出

* Connected to xxx.com.cn (127.0.0.1) port 443
* SSL connection established
< HTTP/1.1 200 OK
< Content-Type: text/html
...
<!DOCTYPE html>
<html>
...
</html>

常见问题与解决方案

1. 404 Not Found

  • 原因:路径映射错误或目标服务限制。
  • 解决:检查Nginx的proxy_pass是否包含正确的路径(如/git/)。

2. SSL证书错误

  • 现象SSL certificate problem: self signed certificate
  • 解决
    • 测试环境:配置proxy_ssl_verify off
    • 生产环境:部署Let's Encrypt证书。

3. 端口冲突

  • 现象:Nginx启动失败。
  • 解决:通过netstat -tuln检查端口占用,确保10443端口未被其他服务占用。

生产环境优化建议

  1. 使用有效SSL证书:通过Let's Encrypt申请免费证书。
  2. 防火墙配置:仅允许服务器B的IP访问服务器A的10443端口。
  3. 日志监控:启用Nginx访问日志和错误日志,实时监控代理状态。

总结

通过本文的配置方案,即使服务器B处于严格网络隔离环境,仍可通过Nginx反向代理和端口转发技术安全访问外网服务。该方案具备以下优势:

  • 端口透明:用户无需感知10443端口的存在。
  • 灵活扩展:可代理任意HTTP/HTTPS服务(如Git、OSS、API等)。
  • 安全性:通过SSL加密和访问控制保障通信安全。

未来可进一步探索:

  • 负载均衡:在服务器A部署多实例代理。
  • 动态DNS:结合动态DNS实现域名自动更新。

标签: Nginx, 反向代理, 端口转发

添加新评论