Skip to content
Carbon edited this page Mar 2, 2023 · 45 revisions

VPS 搭建TLS 443代理实现翻墙上网

简述

GFW越来越强大了,
很多代理模块,
花样不管怎么变化,
加密算法不管多么强大,
最后都会被特征捕获而面临封禁可能。

私认为目前最有效的伪装应该是TLS,
使用443端口模仿web https访问,
使得流量看起来和正常web https访问完全一致,
GFW探测时拿到的和正常https 443结果是一样的。

原理

  1. VPS搭建 nginx 服务端,提供http和https访问应答。
  2. VPS的 nginx服务端应答https后进行应答分流,
    普通请求返回web页面,特殊请求转发给后端例如v2ray进行处理。
  3. 前端客户机器使用websocket封装请求,再交给https进行TLS封装。
    流量和普通web访问无任何差异。
  4. 这样大大降低了前端和后端的运算负担,只有一个TLS加密。
    绝大部分平台CPU都有硬件加速,纳秒级别,
    不管后端使用什么做法,都不需要再额外进行加解密运算,
    只需要转发请求完成代理功能即可。

备注

虽然流量特征看起来是绕过了GFW探测,
但是仍然可以通过社会工程学人为判断该IP站点是否可疑。
因为如果你的客户机器一直访问一个IP地址,
而那个IP地址仅仅提供一个简单web页面应答,
或者Baidu之类的镜像地址转发,
却产生了巨额的访问流量,
那么这个IP地址就是可疑的,
这就会带来被封禁的可能性。

但是比起其它的加密代理方法,
这个已经是天花板级别的了。
如果这样子还不幸被封禁,
那么其它的代理其实也很难幸免,
解决办法是多备几个VPS吧。

实操

下面开始实际操作,将会涉及:

1. 购买VPS并搭建环境

VPS是搭建代理的基础,
购买海外的服务商提供的云服务,
可以根据个人经济状况和宽带速度稳定性来进行选择。

需要注意的点是:
远离华人背景的供应商,搞不好什么时候他被统战,
你就被当猪仔卖掉了,你的信息也就完全暴露
这里我不做广告了(有需求的可以发邮件给我咨询哪些VPS好用)
(WOW玩家可以在Windows端用Netch代理连接台服魔兽)

拿到VPS的IP地址之后,选择预装Ubuntu系统
使用ssh登录到VPS:
1.1 关闭ssh的密码认证登录。
1.2 开启ssh key认证登录。
1.3 将端口22更改为其它不常用的端口。
1.4 安装v2ray:

bash <(curl -L https://raw.githubusercontent.com/v2fly/fhs-install-v2ray/master/install-release.sh)  

1.5 更新系统

apt update && apt upgrade -y  

这些操作是为了防范恶意扫描和攻击。
操作细节请自行搜索。
如果访问不了这个安装脚本,可以发邮件给我要一个。

2. 购买域名(10美元以内)

Name.com有很多on sale的域名,
有些甚至低到2美刀,不建议去搞免费域名。
随机输入一些不起眼的名字,点击search,
等待结果,可以看到很多打折的域名,
选择心仪的域名添加到购物车然后买单。

3. DNS绑定IP和域名(无难度操作)

第2步购买了域名之后,
这里开始绑定之前购买VPS的IP地址到域名上。
Domain列表中可以看到已经购买的域名。

点击你的域名进入配置菜单,
然后滑动到Domain Details列表,
选择DNS列的Manage DNS Records
Host中填*,ANSWER中填IP地址,代表所有未匹配的子域名都会由DNS解析匹配到这个IP地址。
Host中填www,ANSWER中填IP地址,代表www.example.xx的域名会由DNS解析匹配到这个IP地址。
Host中填子域名,比如subdomain,ANSWER中填IP地址,代表subdomain.example.xx会由DNS解析匹配到这个IP地址。
TTL默认即可。

没有测试过最多可以添加多少个DNS记录,
我平常使用添加了5个DNS记录给3个VPS使用,
没有发现问题。
每次输入完成之后,点击ADD RECORD添加DNS解析记录。
添加完成之后最迟24小时生效,一般是几分钟就可以ping域名查看是否生效了。

4. 申请域名证书

在拥有了域名和IP地址之后,
就可以申请个人web站点的域名证书了。
这里选择个人建站广泛使用的letsencrypt来申请证书。
下面开始使用ssh登录到VPS进行命令操作。

安装证书申请工具:

apt install socat  
bash <(curl https://get.acme.sh)  
ln -s /root/.acme.sh/acme.sh /usr/local/bin/acme.sh  
acme.sh --set-default-ca --server letsencrypt  

申请证书(需要80端口,请确保该端口没有被占用,如果nginx开了,记得关闭):
-d 后面接你要申请证书的域名,
一次可以为多个域名申请证书,
但是建议一个VPS的IP申请一个域名证书即可,方便管理。
这里必须确保域名是已经和VPS的IP绑定了的。

acme.sh --issue -d example.com -d www.example.com --standalone -k ec-256 --force  

稍等片刻,静候证书下发。

5. 安装域名证书

安装证书:

acme.sh --installcert -d example.com -d www.example.com --ecc --key-file /usr/local/etc/v2ray/server.key --fullchain-file /usr/local/etc/v2ray/server.crt  

将所有申请到的证书都安装至v2ray的配置文件目录。
也可以是其它目录,但是要记下来后面要用到。
就像之前说的,一般只建议一个VPS域名申请一个证书。
这里为了方便举例使用了之前的2个域名证书的例子。
开启证书工具自动维护:

acme.sh  --upgrade  --auto-upgrade  

6. VPS搭建nginx服务

安装nginx:

apt install nginx  

7. 配置nginx

这里以镜像站转发访问baidu作为举例,
如果会自己编写开发web站点, 那请自行修改为你自己的web服务。
配置文件内容:/etc/nginx/nginx.conf

这一段是负责正常访问的返回,简单的将访问重定向到baidu页面:

location / {  
    proxy_pass https://www.baidu.com/;  
    proxy_redirect off;  
    sub_filter_once off;  
    sub_filter "baidu.com" "example.com";  
    proxy_set_header Host "www.baidu.com";  
    proxy_set_header Referer $http_referer;  
    proxy_set_header X-Real-IP $remote_addr;  
    proxy_set_header User-Agent $http_user_agent;  
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  
    proxy_set_header X-Forwarded-Proto https;  
    proxy_set_header Accept-Encoding "";  
    proxy_set_header Accept-Language "zh-CN";  
}  

实操中需要将example.com替换为VPS绑定的域名。
重定向的域名可以选择微博网易baidu或者bing之类的。

下面这一段是将特殊访问转发给v2ray处理:

location /3d9a9a26-4966-11ed-afa8-5752d2b08905 {  
    proxy_redirect off;  
    proxy_pass http://127.0.0.1:8388;  
    proxy_http_version 1.1;  
    proxy_set_header Upgrade $http_upgrade;  
    proxy_set_header Connection "upgrade";  
    proxy_set_header Host $host;  
    proxy_set_header X-Real-IP $remote_addr;  
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  
 }  

路径3d9a9a26-4966-11ed-afa8-5752d2b08905是用uuid命令生成的值。
这个路径ID请使用uuid命令自行生成并且保密不要轻易泄露。

最后一段不列出来了,
那是将80端口的http访问转为https返回。

8. 安装v2ray(为了你的安全,请勿使用xray和其它不开源的工具)

bash <(curl -L https://raw.githubusercontent.com/v2fly/fhs-install-v2ray/master/install-release.sh)  

如果访问不了这个安装脚本,可以发邮件给我要一个。

9. 配置v2ray和passwall实现代理访问

配置文件:/usr/local/etc/v2ray/config.json
"id": "e089144a-4968-11ed-a04c-2fd85d90a885" 是使用uuid命令生成的。
请使用uuid命令自行生成并且保密不要轻易泄露。
"path": "/3d9a9a26-4966-11ed-afa8-5752d2b08905" 的值和 /etc/nginx/nginx.conf的转发路径值一致。

10. 备注:

如果证书过期由于各种未知原因没有自动续
则手动续证书:

systemctl stop nginx  
acme.sh --renew-all  

因为续证书需要80端口,所以需要短暂关闭nginx
成功之后重启nginx即可

systemctl restart nginx  

11. passwall配置

passwall节点

12. 启动nginx和v2ray

systemctl enable v2ray  
systemctl enable nginx  
systemctl start v2ray  
systemctl start nginx  

13. 查看运行状态

systemctl status v2ray  
systemctl status nginx  

14. Enjoy

Have Fun.

后记

开启web服务后,
有很多爬虫或者二逼的访问攻击,
可以配置一下把这些IP的访问禁止掉。

  1. 查看哪些IP访问我们的VPS
awk '{print $1}' /var/log/nginx/access.log |sort |uniq -c|sort -n -r  

该命令会搜集所有访问的IP地址,
并按照访问的频繁度进行排序。

  1. 在/etc/nginx/目录创建配置文件
cd /etc/nginx  
touch deny_ip.conf  
vi deny_ip.conf  

将前几名频繁访问VPS的IP添加到deny_ip.conf文件。
记得别把你的运行商的国外出口IP给封了,
那样你就无法访问外网了。
如果你对IP地址不确定,
那就用Biadu或者Google搜索一下那个IP地址,
一般就能看到它的来源,
添加格式如下:

deny 66.249.79.248;  
deny 66.249.79.93;  
deny 66.249.79.91;  
deny 66.249.79.89;  
  1. 配置nginx

打开/etc/nginx/nginx.conf文件,

vi nginx.conf  

把下面代码前面的注释去掉即可:

include deny_ip.conf;  

使用命令测试:

nginx -t

测试通过之后reload并重启服务即可:

systemctl reload nginx  
systemctl restart nginx  

后记2 防火墙

开启防火墙保护我们的VPS

apt-get install ufw  

默认放行所有出去的端口
默认拒绝所有进来的端口

ufw default allow outgoing  
ufw default deny incoming  

enable ssh with port 21221
放行ssh通过端口21221访问VPS

ufw allow 21221/tcp  

enable nginx service
放行nginx的http和https服务端口

ufw allow 'Nginx HTTP'  
ufw allow 'Nginx HTTPS'

enable ufw
启用防火墙

ufw enable  
systemctl enable ufw  

查找Nginx服务的防火墙规则的配置信息

ufw app info 'Nginx Full'

查看防火墙的状态

ufw status numbered