# 内网服务器如何通过代理服务器访问外网服务
# 背景&需求
某客户协同服务器在内网区,无法直接访问外网;客户另有一台代理服务器在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层代理(推荐)
协同服务器添加hosts解析:echo "10.2.1.2 weixin.seeyon.com" >> /etc/hosts
代理服务器使用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端口)
# 方案二:将代理服务器配置为网关(非网络管理员不要采用)
- 协同服务器:
- 配置静态路由:ip route add 124.70.126.97/32 via 10.2.1.2
- 添加hosts解析:echo "124.70.126.97 weixin.seeyon.com" >> /etc/hosts
注意:这里添加的hosts解析是指向域名真实解析的外网地址
- 代理服务器:
- 开启ip.forward转发:
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
sysctl -p
- 使用iptables配置NAT:
sudo iptables -t nat -A POSTROUTING -o ens38 -j MASQUERADE
- 确保允许转发流量(如果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
- 永久保存防火墙规则
sudo apt-get install iptables-persistent
sudo netfilter-persistent save
提示:如果iptables或者客户防火墙已经有其他规则限制了出口访问,则需要单独配置规则开通 以上操作建议都协调客户专业网络管理员操作,如果没有,就放弃该方案
# 方案三:使用Nginx正向代理(需要客开适配,支持正向代理配置)
代码适配(需要能配置代理地址使用)
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
- 程序中配置nginx代理地址,测试功能
创建人:qiaoyulong修改人:wangyxyf、qiaoyulong