免责声明:这篇文章中提到的方法仅能用于研究与学习使用,严禁用于商业或非法用途。
最后更新:2020.1.18 更正细节,补充内容
引子
临近开学,我又把服务器迁移回了线路对移动友好的新加坡。使用中国移动网络,在白天非高峰时段能够流畅的观看YouTube 1080p;然而到了高峰期的晚间时段,速度却只有几十k。同一个服务器,同样的线路为什么会这样呢?跟我有相同遭遇的应该有不少吧?
先来讲讲当今主流的出国软件,分为两大类,一类是强加密型的,例如SS,V2
ray的Vmess模式,他们利用私有协议进行强加密,使得通信过程十分安全,墙无法嗅探出传输的内容,只知道这是一种未知的传输协议,传输未知的流量。另一类是像SSR,V2 ray websocket模式,他们通过混淆,把自己的流量混淆成其他正常可以出国的协议,以达到穿墙的目的。运营商的网络出口带宽是有限的。高峰时段,在非常有限的国际出口带宽下,运营商会优先放行某些端口或某些协议,而其他的协议则会被疯狂丢包。这就是Qos,很明显,我遇到了运营商的Qos策略。V2
ray和SS默认的协议就很不典型,容易被运营商Qos,也很容易被墙识别。使用带混淆功能的SSR?SSR的混淆协议基本能够被嗅探了,被阻断的可能性非常大。除了氪金,氪诸如政企专线之类的网络,应该怎么办呢?我们可以利用Nginx和Websocket,将V2
ray的流量包装成正常的TLS流量走443端口,不久可以绕过运营商的Qos了吗?原理图
还没明白的话,下面的原理图能说明一下,还看不懂的话.......emmm......
实现过程
域名准备:
- 你得有一个域名,免费的.tk的那种也行。
- 建立一个指向服务器的A记录,如
v2.example.com
,将它指向你的服务器。
Nginx服务器准备:
- 新建一个虚拟主机,如
v2.example.com
,这个虚拟主机需要有证书,因为我们要用到证书来建立TLS连接。用acme.sh生成的Let's Encrypt证书就可以。我使用的是oneinstack,建议使用oneinstack,lnmp一键安装包这样的工具进行。 - 编辑Nginx配置文件
v2.example.com.conf
,通常安装包会帮你安放在在/usr/local/nginx/conf/vhost
下。在合适的地方加入以下内容:location /v2/ { #/ws为v2
ray路径,随便填写比如/v2 ray/,但要记住后面要用 proxy_redirect off; proxy_pass http://127.0.0.1:233; #你的v2入站端口,随意设置,要记住后面要用 proxy_http_version 1.1; #websocket还是http1.1的,但在服务器内部进行,几乎没有影响啦~ proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $http_host; }
注意:为了避免运营商Qos,Nginx的https端口必须为标准的443端口。
- 重启Nginx
service nginx restart
服务端V2
ray设置:默认都已经安装好V2
ray服务端了,官方有白话文教程,有点基础都能看懂,官方脚本一行命令的事
服务端需要开启ws+tls模式,配置文件一般在/etc/v2
ray下。inbound的配置文件如下:"inbound": {
"streamSettings": {
"network": "ws",
"wsSettings": {
"headers": {
"host": "v2.example.com" //你的二级域名
},
"path": "/v2/" //混淆路径,跟你刚才填写的一致即可
}
},
"protocol": "vmess",
"port": 233, //入站端口,与上面填写的一致
"settings": {
"clients": [
{
"alterId": 64,
"security": "auto",
"id": "填写你的uuid",
"level": 1
}
]
}
},
然后重启服务端:service v2r
ay restart
可以观察以下日志,没有报错信息就算启动成功:journalctl -u v2
日志界面按方向键滚动,按q退出。没有报错,你可以访问一下 rayhttps://v2.example.com/v2/
,如果提示bad request,http状态码为400,那么服务端就配置完成啦。
客户端V2r
ay设置:客户端当然也需要开启ws+tls模式,outbound的配置文件如下:
"outbounds": [{
"protocol": "vmess",
"settings": {
"vnext": [
{
"address": "v2.example.com", //你的二级域名
"port": 443, //Nginx对外提供https的端口,绝大多数情况下都是443,避免Qos也只能填443
"users": [
{
"id": "你的uuid",
"alterId": 64,
"security": "auto"
}
]
}
]
},
"streamSettings" : {
"network": "ws", //使用websocket
"security": "tls", //使用Tls
"wsSettings" : {
"path" : "\/v2\/", //混淆路径,跟你上面填写的一致即可
"headers" : {
"Host" : "v2.example.com" //你的二级域名
}
},
"tlsSettings" : { //Tls安全设置
"serverName" : "v2.example.com", //你的二级域名
"allowInsecure" : false //禁止不安全的https连接
}
},
"tag": "direct"
},{
"protocol": "blackhole",
"settings": {},
"tag": "blocked"
}],
然后重启客户端。
效果~挺明显的
晚间高峰时段YouTube 1080基本无卡顿,进度条还算饱满~速度测试截图如下:
晚上再也不用忍受打不开Google只能用百度的情况咯~
2019.10.1 补充一点:
如果直连服务器的速度、丢包率不理想,可以利用cloudflare等此类cdn服务进行加速,尽管延迟可能会稍微增高,但能有效提高使用体验。
此外,结合第三方dns解析可以实现分线路解析。我的服务器目前在新加坡,移动网络访问体验非常好,但联通电信的体验非常差,尤其是电信,绕路美国,延迟400+,疯狂丢包。
于是我就将移动网络解析到源服务器上,将电信联通解析到最快的CF cdn上,一个域名,多条线路,起到“智能线路分配”的作用。
详情可以看我的这篇文章
上没被墙的网站看视频依然感觉晚上比白天慢得多,视频走的不是TLS?
现在国内大视频站都是HTTPS,都是走443端口的TLS的。一些人的梯用的是高位端口,容易被Qos,文章里提到的方法是就是走443端口的TLS,伪装成正常流量以减少减少Qos。你提到的这种情况...应该是国内高峰期网络负载大了,这样就会慢很多,这跟Qos没关系的。
我说的是境外网站。
没被墙的境外网站跟国内网站的情况是一样的,他们都是TCP,TLS,速度慢是因为骨干网负载大引起来的,Qos在家宽里面已经比较高了。Qos当然有,TCP的Qos级别要比UDP高,走443端口伪装成TLS的Qos级别也比高位端口未知协议的高。