域前置一般都是配合CDN来使用的,除了wiki上写得那些支持域前置的CDN外,经过我的简单测试,cloudflare支持同顶级域名的域前置(有的测试不成功我猜应该需要根据sni拿到的证书也必须包含host),腾讯云完全支持域前置,不过在国内域前置也就只是为了骗一下网络监控,同顶级域名的域前置也没太大意义,域前置需要有host而且要配合cdn,所以只能用ws,施行起来也很简单,套上cdn后dns查一下ip有哪些,再把ip反查一下有什么域名也解析上去了,然后一个个用https(http是没有意义的)去访问,哪个能访问,就把tls里的servername改成那个域名(v2rayN称为SNI),ws里的host写真正要连接的域名,这样从表面看起来就根本不知道要连接的域名是什么,比如说sni是microsoft,host是自己的域名,microsoft肯定是在白名单里的,白名单政策地区可以试一下。
直连域前置也能用,不过没啥用,host也是假的就好了,要是懒得搞根证书认证用允许不安全的连接就不会暴露域名了,如果是用来做匹配器path就足够了,host和path都经过tls加密,没有安全上的区别。
另外我最近发现了个有意思的东西,v2ray把utls作为一个新的传输层安全选项,我试了一下nosni,配合caddy已经成功了,如果有地区使用白名单阻断的可以尝试一下这个方法,我也不知道有没有用,服务端的日志里servername是空的,sni阻断应该可以化解了,而且这个过程由真正的web服务器来完成,只是比较可惜目前utls只支持ws和tcp,tcp不能用caddy反代,所以只能用ws了,而且v2ray也可以判断是否是可信证书,这样想要阻断一个域名就从识别sni变成识别证书了,但是tls1.3的密钥交换证书对于中间人来说也是加密的,也就是说这个方法不进行中间人攻击或是主动探测是看不到证书域名的,而且这也不是esni或ech会遭到特殊对待,还是明文的,只是空的而已。
配置文件只能是v5版本的,只需要客户端的配置更改,服务端只有caddy需要更改,v2ray服务端可以保持原样。
{
"log": {
"access": {
"type": "Console",
"level": "Warning"
},
"error": {
"type": "Console",
"level": "Warning"
}
},
"inbounds": [
{
"port": 1080,
"listen": "127.0.0.1",
"tag": "socks-inbound",
"protocol": "socks",
"sniffing": {
"enabled": true,
"destOverride": ["http", "tls"]
}
}
],
"outbounds": [
{
"protocol": "vmess",
"settings": {
"address": "xxx.xxx.com",
"port": "443",
"uuid": "xxxxxxxxxxxxxxxxxxxx"
},
"tag": "proxy",
"streamSettings": {
"transport":"ws",
"transportSettings":{
"path":"/ws"
},
"security":"utls",
"securitySettings":{
"tlsConfig": {
"serverName":"xxx.xxx.com" //仅用于验证服务端证书是否包含这个域名
},
"imitate":"edge_auto",
"noSNI": true //不发送sni
}
}
}
]
}这个配置要用v2ray run -format jsonv5来启动,我没有写Routing,因为v5实再是太麻烦了,不如用clash的规则建立一个127.0.0.1:1080的socks5连接。
caddy全局要加几行东西
{
servers :443 {
strict_sni_host insecure_off
}
default_sni *.xxx.com #指定没有收到sni时的默认sni,如果下面是通配符,这里也必须用通配符,需要和下面保持一致
}
*.xxx.com {
...
}