自由的羽毛 发表于 2024-8-24 18:26:00

使用Nginx正向代理让内网主机通过外网主机访问互联网

目次

环境概述
流程说明
在外网服务器上安装部署nginx 
安装前预备
下载nginx
 编译安装nginx
开始配置正向代理
创建systemd服务单元文件,用于管理Nginx服务的启动、停止和重新加载
启动nginx
 代理服务器本地验证
 内网服务器验证
 将代理所在添加到环境变量中直接使用

环境概述

        在企业网络环境中,通常会存在内网与外网的隔离,内网机器无法直接访问外部Internet。而外网机器具有访问互联网的本领。为了让内网机器能够通过外网机器访问互联网,我们可以配置Nginx正向代理来实现。
(代理服务器为linux系统,Windows系统中nginx中默认不包含proxy_connect模块,Windows编译proxy_connect模块比力贫苦,可以使用CCProxy代理软件实现,参考外网主机使用CCProxy代理使内网主机上网)


[*]内网主机:172.211.216.242  (无法直接访问外部Internet)
[*]外网主机:192.168.0.97 (可以访问Internet,并充今世理服务器)
[*]前置条件:内网主机和外网主机虽然不是在同一网段,但是可以互相访问,正向代理的端口需要互通,这里用的8080
流程说明


[*]  内网服务器发送哀求:内网服务器通过HTTP或HTTPS发送哀求到外网代理服务器的8080端口。
[*]   代理服务器接收哀求:外网代理服务器接收到哀求后,根据哀求的协议(HTTP或HTTPS)使用proxy_pass将哀求转发到目标互联网服务器。
[*]   互联网服务器处理哀求:目标互联网服务器接收到哀求后处理并天生相应。
[*]   代理服务器返反相应:互联网服务器将相应发送回外网代理服务器,然后代理服务器将相应转发回内网服务器。
代理流程:

A[内网主机 172.211.216.242] -- 请求 --> B
B -- 转发请求 --> C[目标服务器]
C -- 返回响应 --> B
B -- 返回响应 --> A



+----------------------+             +------------------------+             +---------------------+
|   内网服务器      |             |    外网代理服务器       |             |   互联网服务器   |
| 172.211.216.242   | -------->|192.168.0.97:8080   | -------->   |www.example.com    |
|                      |         |                        |             |                     |
| 发送HTTP/HTTPS请求   |            | 接收并转发请求          |             | 处理请求并返回响应|
+----------------------+             +------------------------+             +---------------------+
       ^                                    |                                       |
       |                                    v                                       |
       +----------------------<----------------+-----------------------<--------------+



在外网服务器上安装部署nginx 

安装前预备

由于Nginx默认不支持HTTPS代理,我们需要额外添加模块。使用的模块是ngx_http_proxy_connect_module。使用模块前需请确保模块和Nginx版本匹配。如图:
我这里有效的是1.20.2版本所以使用proxy_connect_rewrite_1018.patch
https://img-blog.csdnimg.cn/direct/f003a41937034590af0d43f89325cb5d.png
可以直接通过下载压缩包,解压之后通过patch命令打入补丁。
#安装patch:
yum install patch -y cd /root
wget https://github.com/chobits/ngx_http_proxy_connect_module/archive/refs/tags/v0.0.2.zip unzip v0.0.2.zip 下载nginx

cd /root
wget http://nginx.org/download/nginx-1.20.2.tar.gz
#解压
tar xf nginx-1.20.2.tar.gz

#进入nginx目录
cd nginx-1.20.2/

#使用patch命令导入补丁 注意路径是否一致 我是直接在根目录操作的
patch -p1 < /root/ngx_http_proxy_connect_module-0.0.2/patch/proxy_connect_rewrite_1018.patch

 编译安装nginx

#安装编译工具和库
yum install gcc cmake make cmake unzip ncurses-devel gcc gcc-c++ -y

#配置Nginx编译选项,使其在编译Nginx时包含ngx_http_proxy_connect_module-0.0.2模块
./configure --prefix=/usr/local/nginx --add-module=/root/ngx_http_proxy_connect_module-0.0.2

#编译和安装Nginx
make && make install 开始配置正向代理

cd /usr/local/nginx/conf/

#习惯性备份
cp nginx.conf nginx.conf.bak

#编辑
vinginx.conf 可以直接参考这个 (可以直接拷贝使用)
# 设置Nginx主进程数量为1,通常在单核服务器上只需要一个主进程
worker_processes1;

# 每个工作进程能够同时处理的最大连接数
events {
    worker_connections1024;
}


http {
    # 引入mime.types文件,定义文件扩展名和对应的MIME类型
    include       mime.types;

    # 设置默认的MIME类型为application/octet-stream
    default_typeapplication/octet-stream;

    # 使用sendfile系统调用来发送文件,提高性能
    sendfile      on;

    # HTTP连接的超时时间,这里是65秒
    keepalive_timeout65;

    server {
    # 服务器监听的端口号为8080
    listen                           8080;

    # 服务器名称为localhost
    server_name                      localhost;

    # 指定DNS服务器地址为114.114.114.114,禁用IPv6解析
    resolver                         114.114.114.114 ipv6=off;

    # 开启HTTP CONNECT方法支持,用于建立与后端服务器的TCP连接
    proxy_connect;

    # 允许通过代理的端口,这里允许443和80端口
    proxy_connect_allow            443 80;

    # 建立连接的超时时间为10秒
    proxy_connect_connect_timeout    10s;

    # 读取数据的超时时间为10秒
    proxy_connect_read_timeout       10s;

    location / {
      # 将请求转发到代理目标
      proxy_pass $scheme://$http_host$request_uri;
    }
}

}
创建systemd服务单元文件,用于管理Nginx服务的启动、停止和重新加载

echo "
Description=The NGINX HTTP and reverse proxy server
After=network.target
Wants=network.target


Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
PrivateTmp=true


WantedBy=multi-user.target" | sudo tee /etc/systemd/system/nginx.service
启动nginx

systemctl daemon-reload

systemctl start nginx

systemctl enable nginx

 代理服务器本地验证

curl -I https://blog.csdn.net/ -v -x 127.0.0.1:8080
如图 出现"HTTP/1.1 200 Connection Established" 表当代理服务器已经成功建立了毗连
https://img-blog.csdnimg.cn/direct/005f505962c94a239a5acc9310e3bc11.png

  内网服务器验证

curl -I https://blog.csdn.net/ -v -x 192.168.0.97:8080
如图 直接curl不通,加上代理所在端口是通的
(这一步要确保内网主机和外网服务器之间端口互通) 可以使用telnet测试
https://img-blog.csdnimg.cn/direct/0cf54fa5e8bd47d5a2536efe80f7fc9e.png
https://img-blog.csdnimg.cn/direct/8682fc8775d0400f9b80c43bfcd66d8e.png
 将代理所在添加到环境变量中直接使用

vi /etc/profile

#编辑/etc/profile文件 在最后一行加入

export http_proxy=192.168.0.97:8080
export https_proxy=192.168.0.97:8080

#192.168.0.97:8080 为你的代理服务器ip和端口
注意 使用source命令使其见效
source /etc/profile 直接curl https://blog.csdn.net/  成功访问到  代理成功
https://img-blog.csdnimg.cn/direct/57610178b2834420b7bb3f945178a85f.png

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 使用Nginx正向代理让内网主机通过外网主机访问互联网