# 内网服务器如何通过代理服务器访问外网服务

# 背景&需求

1731898806173.png

某客户协同服务器在内网区,无法直接访问外网;客户另有一台代理服务器在DMZ区,可以直接访问外网;现需要实现协同服务器能通过代理服务器访问微协同公有云地址(https://weixin.seeyon.com/). 提示,可能会有多个外网地址需要访问: https://mplus.seeyon.com/ 云联服务, https://chome.seeyon.com/ 协同云数据相关信息, https://cloud.seeyon.com/ 协同云商城相关数据信息。

已知: 协同服务器网卡ens33的IP地址是:10.2.0.1,代理服务器网卡ens36的IP地址是:10.2.1.2, 10.2.0.1与10.2.1.2互通;且代理服务器可以通过网卡ens38访问外网

# 操作步骤&解决方案

# 方案一:使用nginx做4层代理(推荐)

  1. 协同服务器添加hosts解析:echo "10.2.1.2 weixin.seeyon.com" >> /etc/hosts

  2. 代理服务器使用nginx做4层转发

worker_processes auto;
worker_rlimit_nofile 20960;
error_log logs/error.log error;
events {
worker_connections 4096;
multi_accept on;
accept_mutex on;
accept_mutex_delay 500ms;
}
stream {
  upstream weixin {
    server 124.70.126.97:443;
}
  server {
    listen 443;
    proxy_pass weixin;
  }
}

注意:

  • Nginx做4层转发需要stream模块,如果没有该模块,则需要重新编译nginx
  • 配置时,stream{}没有被http{}段包含之内
  • 代理服务器的每个端口只能代理一个外网地址,如果不能修改程序调用外网地址的端口(例如:https://weixin.seeyon.com:8443/ ,那么需要准备多个服务器,才能使每个地址都是443端口)

1731899274288.png

# 方案二:将代理服务器配置为网关(非网络管理员不要采用)

  • 协同服务器:
  1. 配置静态路由:ip route add 124.70.126.97/32 via 10.2.1.2
  2. 添加hosts解析:echo "124.70.126.97 weixin.seeyon.com" >> /etc/hosts

注意:这里添加的hosts解析是指向域名真实解析的外网地址

  • 代理服务器:
  1. 开启ip.forward转发:
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
sysctl -p
  1. 使用iptables配置NAT:
sudo iptables -t nat -A POSTROUTING -o ens38 -j MASQUERADE
  1. 确保允许转发流量(如果iptables没有限制可以不用做该操作)
sudo iptables -A FORWARD -i ens36 -o ens38 -j ACCEPT
sudo iptables -A FORWARD -i ens38 -o ens36 -m state --state RELATED,ESTABLISHED -j ACCEPT
  1. 永久保存防火墙规则
sudo apt-get install iptables-persistent
sudo netfilter-persistent save

提示:如果iptables或者客户防火墙已经有其他规则限制了出口访问,则需要单独配置规则开通 以上操作建议都协调客户专业网络管理员操作,如果没有,就放弃该方案

# 方案三:使用Nginx正向代理(需要客开适配,支持正向代理配置)

  1. 代码适配(需要能配置代理地址使用)

  2. Nginx做正向代理 注意:官方Nginx默认不支持https代理,需要编译安装三方模块ngx_http_proxy_connect_module: https://github.com/chobits/ngx_http_proxy_connect_module

server {
    listen                         6111;

    # dns resolver used by forward proxying
    resolver                       223.5.5.5;

    # forward proxy for CONNECT requests
    proxy_connect;
    proxy_connect_allow            443 563;
    proxy_connect_connect_timeout  10s;
    proxy_connect_data_timeout     10s;

    # defined by yourself for non-CONNECT requests
    # Example: reverse proxy for non-CONNECT requests
    location / {
        proxy_pass http://$host;
        proxy_set_header Host $host;
    }
}

完成后可以用curl测试curl https://weixin.seeyon.com/ -v -x Nginx_ip:6111

  1. 程序中配置nginx代理地址,测试功能
    创建人:qiaoyulong
    修改人:wangyxyf、qiaoyulong