跨服务器安全访问:基于Nginx反向代理与端口转发的实践指南
引言
在多服务器架构中,网络隔离与访问控制是保障安全的重要手段。本文将基于实际场景,探讨如何在仅允许特定端口通信的限制下,通过Nginx反向代理与端口转发技术,实现从隔离服务器(服务器B)安全访问外网服务(如Git、OSS)的完整方案。
问题背景
场景描述
- 服务器A:可访问外网,开放10443端口供服务器B访问。
- 服务器B:仅能通过10443端口与服务器A通信,其他端口均被物理隔离。
- 需求:
- 服务器B访问外部Git仓库(如
https://xxx.com.cn/git/
)。 - 服务器B访问阿里云OSS资源(如
https://xxx.oss-cn-hangzhou.aliyuncs.com/
)。 - 用户无需在URL中显式指定10443端口。
- 服务器B访问外部Git仓库(如
解决方案设计
核心架构
服务器B(隔离环境)
↓ 80/443(本地Nginx监听)
→ 服务器A:10443(反向代理)
↓ 转发至外网服务
→ xxx.com.cn/git/ 或 OSS端点
技术选型
- Nginx反向代理:
在服务器A部署Nginx,将10443端口的请求代理到目标服务。 - 本地反向代理(服务器B):
在服务器B部署Nginx,将80/443端口请求转发到服务器A的10443端口。 - 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端口未被其他服务占用。
生产环境优化建议
- 使用有效SSL证书:通过Let's Encrypt申请免费证书。
- 防火墙配置:仅允许服务器B的IP访问服务器A的10443端口。
- 日志监控:启用Nginx访问日志和错误日志,实时监控代理状态。
总结
通过本文的配置方案,即使服务器B处于严格网络隔离环境,仍可通过Nginx反向代理和端口转发技术安全访问外网服务。该方案具备以下优势:
- 端口透明:用户无需感知10443端口的存在。
- 灵活扩展:可代理任意HTTP/HTTPS服务(如Git、OSS、API等)。
- 安全性:通过SSL加密和访问控制保障通信安全。
未来可进一步探索:
- 负载均衡:在服务器A部署多实例代理。
- 动态DNS:结合动态DNS实现域名自动更新。