Nginx 正向代理——让内网服务器支持上网 #
2020-12-15 17:44
假设我们有两台机器A和B,A能上网,B不能上网,B能连通A的某个端口,比如说80,443。在A上安装Nginx,并且通过Nginx的正向代理,达到B能上网的目的。
A机器上的操作 #
Nginx 编译安装需要增加一个插件 https://github.com/chobits/ngx_http_proxy_connect_module
- 在官方的Github上找到合适的
ngx_http_proxy_connect_module插件版本
| nginx version | enable REWRITE phase | patch |
|---|---|---|
| 1.4.x ~ 1.12.x | NO | proxy_connect.patch |
| 1.4.x ~ 1.12.x | YES | proxy_connect_rewrite.patch |
| 1.13.x ~ 1.14.x | NO | proxy_connect_1014.patch |
| 1.13.x ~ 1.14.x | YES | proxy_connect_rewrite_1014.patch |
| 1.15.2 | YES | proxy_connect_rewrite_1015.patch |
| 1.15.4 ~ 1.16.x | YES | proxy_connect_rewrite_101504.patch |
| 1.17.x ~ 1.18.0 | YES | proxy_connect_rewrite_1018.patch |
- 下载合适的版本,这里下载 proxy_connect_rewrite_1018.patch
- 上传插件到服务器,解压到某个目录,比如
/usr/local/src - 接下来就是编译安装的时候带上这个插件,如下是官方的例子。更详细的安装过程,可以参考这篇文章 Linux的Nginx 安装
$ tar -xzvf nginx-1.9.2.tar.gz
$ cd nginx-1.9.2/
$ patch -p1 < /path/to/ngx_http_proxy_connect_module/patch/proxy_connect.patch
$ ./configure --add-module=/path/to/ngx_http_proxy_connect_module
$ make && make install
- 调整Nginx的配置,增加一个代理的server节点,如下。官方的例子做了小调整
server {
listen 80;
# dns resolver used by forward proxying
resolver 8.8.8.8;
# forward proxy for CONNECT request
proxy_connect;
proxy_connect_allow 443 563;
proxy_connect_connect_timeout 10s;
proxy_connect_read_timeout 10s;
proxy_connect_send_timeout 10s;
# forward proxy for non-CONNECT request
location / {
proxy_pass http://$host; //http,可以增加一个server节点,支持https。
proxy_set_header Host $host;
}
}
B机器上的操作 #
- 增加系统参数,编辑
/etc/profile,增加两行配置,假设我们A机器的IP为172.168.1.111,代理端口如上配置的是80
export http_proxy=172.168.1.111:80
export https_proxy=172.168.1.111:80
- 让配置生效
source /etc/profile - 接下来,见证奇迹的时刻。
curlA机器上能访问的域名看下:-)
延伸 #
跑在B上的Java 应用,依然不能访问外网。我们可以通过增加如下的启动参数来让应用通过代理上网。
-Dhttp.proxyHost=172.168.1.111 -Dhttp.proxyPort=80
如果需要访问https协议的站点,参数有些许不通
-Dhttps.proxyHost=172.168.1.111 -Dhttps.proxyPort=80