基于nginx正向代理去访问那些无法访问网站的一种方法

首先,这个不是翻墙教程,好了,想访问google的可以离开了。
你要是没走的话,我可以偷偷摸摸告诉你,其实可以,但是要买国外的主机搭建nginx才行。
另外,根据中国法律规定,禁止私自建立国际信道。
但是正向代理并不算建立国际信道,他只是把我在客户端访问的请求交给了我的服务器,再在服务器上面去访问我要访问的网站,网站的再回复给我的服务器,服务器在回复给我,本质上面来说,实际访问网站的是我的服务器,而不是我,我的服务器只是中间件(nginx本身也就是中间件)而已。
最后如果我进去了,我希望技术无罪。
好了不多BB,先看一下业务策略。
我的客户端127.0.0.1想访问不了访问的网站129.0.0.1,很好,不能访问肯定是有理由的,至少政府是这样认为的,不然为什么不能访问呢。你们说是吧。
我不能访问129.0.0.1是因为我的主机127.0.0.1在墙内(就是大型局域网啦,大概有中国内地那么大的局域网)。那么我要去129.0.0.1该怎么去呢,我想了一下,我只要用大型局域网外面的ip访问不就完了?于是我想到了位于新加坡的128.0.0.1,这个128.0.0.1不在墙内可以去129.0.0.1,很好,但是问题来了我该怎么用128.0.0.1去访问129.0.0.1,而我可以在127.0.0.1上面实现这一技术呢?
于是我想到了正向代理,将我127.0.0.1上面的所有请求全部通过128.0.0.1发出,我就可以畅游全球了,挺棒的,那么开始事实吧?
首先你得有一台服务器,基于lnmp(linux+nginx,剩余的mysql跟php与我本文章无关联,很好,一个操作系统加上一个中间件就行了)。
nginx正向代理http, https亲测可用
上面的网站是在nginx上面配置代理的插件

server {
listen 8000;# dns resolver used by forward proxying
resolver 223.5.5.5;
# 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;
proxy_set_header Host $host;
}
}

其中的proxy_connect的这个组件需要自己编译一下,先看看怎么编译
github希望你自己编译nginx,但是考虑到你们大概率不太会,我也就勉为其难的解释一下,来,我们一句句的解释
咦17.30了?下班了,溜了溜了,写个屁的文章。
好了现在是4月2日,下午14点,我们继续吧,先让我看看我昨天写到哪里了。
喔喔,上面的编译命令我们慢慢看吧
我说你们不会编译就算了,自己百度一下行不行嘛,算了我还是讲解一下嘛

正向代理组件

这个是这个组件的github, 你可以去看看
组件希望你能按你的nginx版本来选择对应的组件,那我们就乖乖的听他的话,先看看nginx版本吧。

root@pi:/home/pi# nginx -v
nginx version: nginx/1.19.1

使用nginx -v命令可以看到对应的版本号,比如我的是1.19,如果你有一定的想法能看出来,我们选择的组件版本是proxy_connect_rewrite_1018.patch,如果你没看出来,那我建议你老老实实用vpn,莫用正向了,你不适合。
继续看命令,先是第一句

wget http://nginx.org/download/nginx-1.9.12.tar.gz

wget命令是从服务端(这里的服务端并不一定是服务器,你可以把他理解成对方;提供服务的一方)获取uri资源,这里的uri指的是一个明确的资源,他跟url的区别,建议去知乎看看

HTTP 协议中 URI 和 URL 有什么区别?

考虑到每次都有人跟我吐槽说我说的东西不适合小白,我寻思到,我就算说的再详细,该听不懂的,还不是听不懂,算了算了,我还是讲细一点吧。
wget命令后面跟的uri会把资源下载到当前shell(就是ssh连接的那个软件或者命令)所处的位置

root@pi:/home/pi# wget http://nginx.org/download/nginx-1.9.12.tar.gz
Will not apply HSTS. The HSTS database must be a regular and non-world-writable file.
ERROR: could not open HSTS store at '/home/pi//.wget-hsts'. HSTS will be disable d.
--2021-04-02 14:10:59-- http://nginx.org/download/nginx-1.9.12.tar.gz
正在解析主机 nginx news (nginx news)... 52.58.199.22, 3.125.197.172, 2a05:d014:edb :5702::6, ...
正在连接 nginx news (nginx news)|52.58.199.22|:80... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:899183 (878K) [application/octet-stream]
正在保存至: “nginx-1.9.12.tar.gz”
nginx-1.9.12.tar.gz 100%[===================>] 878.11K 412KB/s 用时 2.1s
2021-04-02 14:11:02 (412 KB/s) - 已保存 “nginx-1.9.12.tar.gz” [899183/899183])

可以看到他把资源保存在了/home/pi下,因为我的shell目前就在该目录下。

tar -xzvf nginx-1.9.12.tar.gz
cd nginx-1.9.12/

上面的命令我不解释,该看得懂的,一看就懂,该不懂的,连cd是什么都不知道
给小白一个建议:不懂相对路径和绝对路径的就老老实实用绝对路径。

patch -p1 < /path/to/ngx_http_proxy_connect_module/patch/proxy_connect.patch

如果你没有忘我上面的那句nginx -v的话,你就会明白在这里需要改一下,而不是照抄
有点不友好的地方就是/path/to这个地方,这里是让你填写你的路径,不是让你照抄
由于我用的是脚本编译,nginx里面有其他组件,所以我的路径只做参考,怎么看你的nginx应该在那个地方呢,我只能建议你看看你目前nginx编译会用到那些东西,再看看他用的那些组件在哪里,这样简单一点。
我的原组件文件在这里,那我的命令行就应该是

cd /home/pi/oneinstack/src/nginx-1.19.1/

才对,由于我是脚本编译,还想要加入其他模块,所以需要把这个组件放到对应位置,防止在编译时由于丢失已编译组件导致加入组件失败
使用nginx -V可以看到我目前以编译的组件,那么这些组件都要加进去才行,对了你要记得把

patch -p1 < /path/to/ngx_http_proxy_connect_module/patch/proxy_connect.patch

中的proxy_connect.patch 改成nginx对应的版本,我这里改成proxy_connect_rewrite_1018.patch就行了
于是完整的命令是

patch -p1 </home/pi/oneinstack/src/nginx-1.19.1/ngx_http_proxy_connect_module/patch/proxy_connect_rewrite_1018.patch

如果你卡这步的话,有可能是我说的不清楚,但是我希望你能从自身出发考虑一下。

当你正确加入组件以后应该是获取到以下信息

aster/patch/proxy_connect_rewrite_1018.patch
patching file src/http/ngx_http_core_module.c
patching file src/http/ngx_http_parse.c
patching file src/http/ngx_http_request.c
patching file src/http/ngx_http_request.h
patching file src/http/ngx_http_variables.c

如果你获取到的是例如

Reversed (or previously applied) patch detected!  Assume -R? [n]

之类的信息时,你应该考虑是否是补丁配置错误

./configure --add-dynamic-module=/path/to/ngx_http_proxy_connect_modulepre

这一步是加入配置,由于我已有其他组件,所以这步要加入我已编译的组件才行。
这一步一个问题需要注意的就是,原有组件会提供上面的命令找到对应的组件位置,这里的组件位置是相对路径。

--prefix=/usr/local/nginx --user=www --group=www --with-http_stub_status_module --with-http_v2_module --with-http_ssl_module --with-http_gzip_static_module --with-http_realip_module --with-http_flv_module --with-http_mp4_module

上面的部分可以不管,但是下面的由于用到了相对路径需要确保你目前shell所处的位置是以下代码的正确位置

--with-openssl=../openssl-1.1.1g

你需要保证shell的上级目录下有一个叫penssl-1.1.1g 文件夹
我目前在root@pi:/home/pi/oneinstack/src/nginx-1.19.1下,我的上级目录是home/pi/oneinstack/src/,该目录下有openssl-1.1.1g ,那么我的路径就是对的,我就可以编译

--with-pcre=../pcre-8.44 --with-pcre-jit --with-ld-opt=-ljemalloc --with-http_dav_module --add-module=/home/pi/oneinstack/src/nginx-1.19.1/nginx-dav-ext-module

上面的命令仍然是需要保证路径是准确的。

--add-module=/home/pi/oneinstack/src/nginx-1.19.1/ngx_http_proxy_connect_module-master

终于可以加入正向代理组件了,之所以我不用相对路径是因为,我也怕做错啊,还是绝对路径安全。官方的命令行只需要写到文件夹就行了,那我也点到为止,写到文件夹,是否需要文件夹后加入“/”,我认为这个是一个好习惯,我没加所以我没养成好习惯

make && make install

你觉得没问题了就编译吧,等大约10分钟应该就可以了,你可以用nginx -V查看目前的组件中有没有正向代理的组件
如果有的话,你就编译成功了,那么nginx加入了组件,接下来就是写套字节了,也就是开放端口

server {
listen 96;
# dns resolver used by forward proxying
resolver 223.5.5.5;
# 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;
proxy_set_header Host $host;
}
}

这句没什么好说的,照抄就行了,listen就是使用的端口号,我选择96是因为,其他的端口号我在用,不信你扫我ip看,这样就编译完了,在浏览器里面的代理上面写上你的端口号跟ip或者域名,你就能通过代理的ip去访问你要访问的网页了。
但是这并不意味着你就能安全的上网了,你不要忘了,法律的最终的解释权在法院,不在人民,也就是,法律认为你是在翻墙,你就是在翻墙,仍然违反,“禁止非法建立国际信道”的罪名,我不一样,我的代理服务器是联通的成都ip,我只是在公司用家里面的联通访问一些公司的电信宽带不能访问的网站比如github什么的,我可没翻墙喔,这个要声明一下。
总结一下,正向代理就是指使用另外一台电脑帮自己访问要访问的网站,然后把访问的内容在传输回来,实现的一种方法,他并不是翻墙软件,他只是一种技术,本身不应该用来干这种事,事实上,也确实没有干翻墙事情吗,至少我是这样的。
参考文章:
1、正向代理组件
2、nginx正向代理http, https亲测可用

Made by qwe

基于debian的nginx搭建正向代理服务,基于联通家庭宽带搭建服务器cdn与api,基于j2900搭建服务器硬件。
点赞

发表评论

必填项已用 * 标注

百度已收录