在企业网络环境中,通常会存在内网与外网的隔离,内网机器无法直接访问外部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[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
安装前准备
由于Nginx默认不支持HTTPS代理,我们需要额外添加模块。使用的模块是ngx_http_proxy_connect_module。使用模块前需请确保模块和Nginx版本匹配。如图:
我这里有用的是1.20.2版本所以使用proxy_connect_rewrite_1018.patch
可以直接通过下载压缩包,解压之后通过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
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" 表示代理服务器已经成功建立了连接
内网服务器验证
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/ 成功访问到 代理成功
原来客户访问生产业务,都是通过ip地址访问,随着生产业务越来越多,现在客户强烈要求使用域名方式访问业务。但是鉴于内网环境复杂,不好部署域名服务器,部署了访问业务也比较困难。
后来学习nginx,知道nginx可以实现正向代理实现域名转发。整体思路如下:
1、在阿里云上配置域名解析。例如OA.XXXX.COM,解析地址为内网地址172.31.101.36
2、172.31.101.36是vip地址,是由两台nginx配置kee
方案一:(前提:外网域名映射服务器外网IP)
1.nginx配置域名监听且访问静态资源
2.重点来了!!!静态资源请求API的地址由192.168.1.12:8080修改为域名访问方式(abc.ab.com:8080)
重启nginx即可
其他方案等博主验证完后放上来!!
补充知识:用nginx实现反向代理,实现外
nginx做正向代理,假设监听80端口,而一个用户请求的url带非80端口号,nginx会默认将该url请求转到80端口,百度了一番,网友提供的方法都无法解决问题,于是自己用lua解决了:
1、最多的解决方式就是在$host后面添加端口,不能解决;
2、其次解决方式是增加cookie值,能解决50%;
3、本人用lua解决方法,解决100%。
环境:CentOS7.6、Nginx 1.16
说明:nginx正向代理默认只支持http,不支持https,需借助第三方模块“ngx_http_proxy_connect_module
”来实现(https://github.com/chobits/ngx_http_proxy_connect_module)。
nginx安装:(这里使用当前稳定版本,nginx1.16)
[root@local...
我一般都是使用 nginx 做反向代理 tomcat 和其他应用的,其实 nginx 也是支持正向代理的
所谓正向代理就是内网用户通过网关访问外部资源,就是电脑上网时浏览器设置下 http 代理地址访问互联网
而反向代理就是外部用户通过网关访问内网资源,通俗讲就是,你的网站跑在内网的 8080 端口,别人能够通过 80 端口来访问它
http 代理配置
# 正向代理上网
server {
listen 38080;
# 解析域名
resolver 8.8.8.8;
location / {
proxy_pass $scheme://$http_host$r
nginx不仅可以来做反向代理,也可以用来做正向代理(透明代理,代理上网)。反向代理,外部机器通过网关访问网关后面服务器上的内容,网关起到了反向代理的功能,我们平时通过浏览器访问远程的web服务器大都是这样实现的。正向代理,就是上面的过程反过来,我们平时说的代理上网,局域网中的用户通过网关做代理访问外部的网络。nginx同样可以实现代理上网的功能,配置如下:user www;
worker_pro...
proxy_pass http://myserver;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
上述配置中,`upstream` 指定了内网服务器的地址和端口,`server` 部分则定义了对外提供的服务。
其中,`proxy_pass` 指定了请求转发的目标地址,这里是 `http://myserver`,即内网服务器。
`proxy_set_header` 部分则设置了请求头,其中 `Host` 和 `X-Real-IP` 分别为代理服务器的主机名和客户端的 IP 地址。
3. 启动 Nginx:执行 `nginx` 命令启动 Nginx。
4. 配置客户端:在客户端浏览器中设置代理服务器地址和端口,即可通过代理服务器访问互联网。
需要注意的是,这里的正向代理只是实现了内网访问互联网的功能,如果需要实现反向代理或负载均衡等功能,还需要进行相应的配置。