打通一条小路
最近被关小黑屋了好几个IP,基本寿命都不长,我很不开心。
于是,打一条稍微绕一些但是也许稍微安全一点点的小路。
首先,准备一只米国鸡,比如[这里]的。我这只已经换过两次IP了,还花了3美刀,肉疼。
装一个nginx,找个网站,代理一下,比如[cnet],没啥讲究的,我就是找了一个会有内容更新的,也比较安全的速度不慢的网站。这里我用了我自己的二级域名:cnet.54np.net来代理www.cnet.com:
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name cnet.54np.net;
ssl_certificate /opt/cert/cnet/cert.pem;
ssl_certificate_key /opt/cert/cnet/key.pem;
access_log off;
error_log off;
location / {
proxy_set_header Host www.cnet.com;
proxy_set_header X-Real-IP $remote_addr;
add_header Strict-Transport-Security "max-age=31536000;includeSubDomains" always;
proxy_pass https://www.cnet.com;
}
}
SSL证书是用acme.sh脚本搞来的,具体可以看[这里],如果不想走这个麻烦,从腾讯云什么的搞一个免费的ssl证书也可以。只是,我的这个域名没备案,解析也不在dnspod上。或者,你也可以用caddy代替nginx,它可以自动去搞ssl。
然后,把80强跳到443:
server {
listen 80 default_server;
listen [::]:80 default_server;
root /opt/www;
server_name _;
return 301 https://cnet.54np.net;
}
重载nginx,访问cnet.54np.net,会自动HSTS到https上,并显示cnet网站:
其实,显示啥内容不重要,我就是想要个能在443 ssl上正常访问的网站。然后——
来装个v2ray,写点配置:
{
"inbounds": [{
"port": 3306,
"listen": "127.0.0.1",
"protocol": "vmess",
"settings": {
"clients": [
{
"id": "<一个奇奇怪怪的UUID>",
"level": 1,
"alterId": 64
}
]
},
"streamSettings": {
"network": "websocket",
"wsSettings": {
"path": "/wss"
}
},
"detour": {
"to": "proxy"
}
}],
"outbounds": [{
"protocol": "freedom",
"settings": {},
"tag": "proxy"
},{
"protocol": "blackhole",
"settings": {},
"tag": "blocked"
}]
}
这是干啥的呢~~?首先,它会监听一个127.0.0.1:3306端口,看起来好像是个mysql,然后只能本地访问,至于端口,其实无所谓,3306只是看起来比较迷惑。
这条连接会尝试用vmess来理解内容,关于vmess,可以参考[这里]。并且使用websocket通讯方式,websocket的path为/wss。
同时,确保一条freedom的出站规则,这个用来“上网”。
如果要发电报,可以再开一条MTProto规则。
然后,咱们来把前面仿造的cnet网站的/wss代理到v2ray上去:
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name cnet.54np.net;
ssl_certificate /opt/cert/cnet/cert.pem;
ssl_certificate_key /opt/cert/cnet/key.pem;
access_log off;
error_log off;
location /wss {
proxy_redirect off;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $http_host;
proxy_pass http://127.0.0.1:3306;
}
location / {
proxy_set_header Host www.cnet.com;
proxy_set_header X-Real-IP $remote_addr;
add_header Strict-Transport-Security "max-age=31536000;includeSubDomains" always;
proxy_pass https://www.cnet.com;
}
}
重载nginx,https://cnet.54np.net/wss就可以upgrade成websocket with ssl了。
下面,在路的另一端,也就是咱的电脑上,同样搞一个v2ray:
{
"log": {
"loglevel": "warning"
},
"inbounds": [
{
"port": 1080,
"listen": "127.0.0.1",
"tag": "socks-inbound",
"protocol": "socks",
"settings": {
"auth": "noauth",
"udp": false,
"ip": "127.0.0.1"
},
"sniffing": {
"enabled": true,
"destOverride": [
"http",
"tls"
]
}
}
],
"outbounds": [
{
"protocol": "vmess",
"settings": {
"vnext": [
{
"address": "cnet.54np.net",
"port": 443,
"users": [
{
"id": "<还是那个UUID>",
"level": 1,
"alterId": 64
}
]
}
]
},
"streamSettings": {
"network": "websocket",
"security": "tls",
"wsSettings": {
"path": "/wss"
}
},
"tag": "proxy"
},
{
"protocol": "blackhole",
"settings": {},
"tag": "blocked"
}
]
}
入站规则根据自己想要的样子,设置一下。这里是127.0.0.1:1080的socks5。出站规则使用路那头相同的vmess+websocket,这里不同的是,websocket entrypoint是带有tls的,目标地址是咱们的美国鸡。
设置好本地代理(可以靠神器[SwitchyOmega]),google一下,ok:
到这里,咱们的小路看起来是:
[这一头]->(socks5)->v2ray->(websocket+tls)->nginx->(websocket)->v2ray->[那一头]
其中“websocket+tls”这一段,就是公网越洋的载体。它是正常网站的一部分,它安全吗?我不知道。所以,再来一下子,咱们来搞个CDN,把美国鸡藏起来。
CDN其实在很多时候,是减速的,不过这里咱是为了增加安全性的。这也是为啥咱要选择websocket通道,很多CDN都支持websocket,比如cloudflare啥的。
cloudflare国际版的免费CDN,在境内访问起来其实挺一般的,我搞了一下更一般的腾讯云,它有每月免费的10G流量可以嫖:
不过,这个白嫖的流量包,是不能用于ECDN的!!!
创建一个加速域名,这里其实创建一个中国境内的加速就可以。腾讯云的CDN地域指的是访问方,不是回源:
注意加速类型,为了可以正常使用websocket,需要开通ECDN,腾讯云会提示计费方式与普通CDN不同,不搭理它,先嫖上。
CDN部署成功之后,访问一下加速域名,一样也可以访问到cnet,这时的cnet已经经过两次代理了。当然我们的目的本来也不是为了访问cnet。
修改本地的v2ray配置,把websocket目标地址改成加速域名,重启服务,测试,成功:
现在,这条小路变成了:
[这一头]->(socks5)->v2ray->(websocket+tls)->腾讯云CDN->(websocket+tls)->nginx->(websocket)->v2ray->[那一头]
腾讯云的可连通性,一定是没问题的,而且国内的两千多个节点,解决了运营商的线路适应性问题。
腾讯云到米国鸡之间是正常的CDN回源。
米国鸡的nginx和3306之间是本地连接,而且它已经不归功夫网管了。
如果,咱们还有已经死掉的ip,也不想花钱救它,直接让米国鸡的nginx proxy过去就行了,它死不死没关系,反正咱们直接连接的是腾讯云。
看看咱的账单:
噜啦啦噜啦啦噜啦噜啦——累~~
注:本实验室不提供任何代理相关资源,[参考]