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

devtools/2025/1/18 10:05:33/

目录

环境概述

流程说明

在外网服务器上安装部署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
流程说明
  1. 内网服务器发送请求:内网服务器通过HTTP或HTTPS发送请求到外网代理服务器的8080端口。

  2. 代理服务器接收请求:外网代理服务器接收到请求后,根据请求的协议(HTTP或HTTPS)使用proxy_pass将请求转发到目标互联网服务器。

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

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

    代理流程:

    A[内网主机 172.211.216.242] – 请求 --> B[Nginx代理 192.168.0.97:8080]
    B – 转发请求 --> C[目标服务器]
    C – 返回响应 --> B
    B – 返回响应 --> A

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

nginx_76">在外网服务器上安装部署nginx
安装前准备

由于Nginx默认不支持HTTPS代理,我们需要额外添加模块。使用的模块是ngx_http_proxy_connect_module。使用模块前需请确保模块和Nginx版本匹配。如图:

我这里有用的是1.20.2版本所以使用proxy_connect_rewrite_1018.patch


可以直接通过下载压缩包,解压之后通过patch命令打入补丁。

#安装patch:
yum install patch -ycd /root
wget https://github.com/chobits/ngx_http_proxy_connect_module/archive/refs/tags/v0.0.2.zipunzip v0.0.2.zip
nginx_95">下载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_112">编译安装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#编辑
vi  nginx.conf

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

# 设置Nginx主进程数量为1,通常在单核服务器上只需要一个主进程
worker_processes  1;# 每个工作进程能够同时处理的最大连接数
events {worker_connections  1024;
}http {# 引入mime.types文件,定义文件扩展名和对应的MIME类型include       mime.types;# 设置默认的MIME类型为application/octet-streamdefault_type  application/octet-stream;# 使用sendfile系统调用来发送文件,提高性能sendfile        on;# HTTP连接的超时时间,这里是65秒keepalive_timeout  65;server {# 服务器监听的端口号为8080listen                           8080;# 服务器名称为localhostserver_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_208">启动nginx
systemctl daemon-reloadsystemctl start nginxsystemctl enable nginx
代理服务器本地验证
 curl -I https://blog.csdn.net/ -v -x 127.0.0.1:8080

如图 出现"HTTP/1.1 200 Connection Established" 表示代理服务器已经成功建立了连接

内网服务器验证
curl -I https://blog.csdn.net/ -v -x 192.168.0.97:8080

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

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

将代理地址添加到环境变量中直接使用
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/ 成功访问到 代理成功


http://www.ppmy.cn/devtools/151531.html

相关文章

服务器怎样防范网络蠕虫病毒?

蠕虫病毒是一种较为常见的计算机病毒&#xff0c;会通过计算机网络中存在的漏洞进行传播&#xff0c;破坏计算机功能和篡改数据信息和系统&#xff0c;蠕虫病毒的传播范围广传播速度比较快&#xff0c;不需要宿主程序即可传播&#xff0c;对于企业来说该怎样防范服务器中的网络…

你会选择java还是node做后台管理

目前后台开源千千万&#xff0c;但说好用且容易上手的也就那几个。 node和java就看你怎么选了 如果你擅长Java&#xff0c;那RuoYi首选 RuoYI后台管理系统https://gitee.com/y_project/RuoYi-Vue有vue2又有vue3。MIT协议全免费开源&#xff0c;功能齐全&#xff01; 如果你擅…

校园水电费管理小程序的设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

【机器学习实战入门项目】MNIST数字分类机器学习项目

Python 深度学习项目&#xff1a;手写数字识别 为了使机器更加智能&#xff0c;开发者们正在深入研究机器学习和深度学习技术。人类通过不断练习和重复来学习执行某项任务&#xff0c;从而记住如何完成这些任务。然后&#xff0c;大脑中的神经元会自动触发&#xff0c;他们能够…

Node.js 完全教程:从入门到精通

Node.js 完全教程&#xff1a;从入门到精通 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境&#xff0c;允许开发者在服务器端使用 JavaScript。它的非阻塞 I/O 和事件驱动架构使得 Node.js 非常适合于构建高性能的网络应用。本文将详细介绍 Node.js 的安装、基本语…

元宇宙和边缘计算是什么?两者有什么关系?

元宇宙&#xff08;Metaverse&#xff09;和边缘计算&#xff08;Edge Computing&#xff09;是两个在科技领域中经常提及的概念&#xff0c;它们各自代表了不同的技术趋势&#xff0c;并且在某些应用场景下可能会有交集。 元宇宙 (Metaverse) 元宇宙是一个虚拟共享空间&…

Ruby JSON 优化之路:性能提升的探索与实践

在 Ruby 编程的世界里&#xff0c;JSON 处理是一个至关重要的环节。今天&#xff0c;就来深入探讨一下 Ruby JSON 的优化过程&#xff0c;看看如何让它的性能更上一层楼。 一、批量 API 优化&#xff1a;解决哈希表构建效率问题 在之前的工作中&#xff0c;我们已经着手进行了…

mayavi -> python 3D可视化工具Mayavi的安装

前言 Mayavi是一个基于VTK&#xff08;Visualization Toolkit&#xff09;的科学计算和可视化工具&#xff0c;主要用于数据可视化和科学计算领域。 它提供了一系列的高级可视化工具&#xff0c;包括2D和3D图形、表面和体积渲染、流场可视化等。Mayavi可以通过Python脚本进行调…