打通一条小路

vps Dec 5, 2022

最近被关小黑屋了好几个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过去就行了,它死不死没关系,反正咱们直接连接的是腾讯云。

看看咱的账单:

噜啦啦噜啦啦噜啦噜啦——累~~


注:本实验室不提供任何代理相关资源,[参考]

Tags