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

努力的Andy 2024-08-10 16:37:02 阅读 99

目录

环境概述

流程说明

在外网服务器上安装部署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将请求转发到目标互联网服务器。

  互联网服务器处理请求:目标互联网服务器接收到请求后处理并生成响应。

  代理服务器返回响应:互联网服务器将响应发送回外网代理服务器,然后代理服务器将响应转发回内网服务器。

<code> 代理流程:

A[内网主机 172.211.216.242] -- 请求 --> B[Nginx代理 192.168.0.97:8080]code>

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

可以直接通过下载压缩包,解压之后通过<code>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.2code>

#编译和安装Nginx

make && make install

开始配置正向代理

cd /usr/local/nginx/conf/

#习惯性备份

cp nginx.conf nginx.conf.bak

#编辑

vi nginx.conf

可以直接参考这个 (可以直接拷贝使用)

# 设置Nginx主进程数量为1,通常在单核服务器上只需要一个主进程

worker_processes 1;

# 每个工作进程能够同时处理的最大连接数

events {

worker_connections 1024;

}

http {

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

include mime.types;

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

default_type application/octet-stream;

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

sendfile on;

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

keepalive_timeout 65;

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 "[Unit]

Description=The NGINX HTTP and reverse proxy server

After=network.target

Wants=network.target

[Service]

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

[Install]

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" 表示代理服务器已经成功建立了连接

  内网服务器验证

<code>curl -I https://blog.csdn.net/ -v -x 192.168.0.97:8080

如图 直接curl不通,加上代理地址端口是通的

(这一步要确保内网主机和外网服务器之间端口互通) 可以使用telnet测试

 将代理地址添加到环境变量中直接使用

<code>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/  成功访问到  代理成功



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。