Foreword
新买的2个BWG,没挺过一个月,443端口就被墙了,还有一个CN2的也是莫名其妙被墙了,套了CF,感觉还是非常浪费的,于是打算做个实验,试一试动态端口是否还会被墙。
以目前的经验来看,墙是基于他的检测周期内(他的检测时间未知),如果有不明的大流量,tls套tls,那么这种不明流量,大概率会被直接封端口。但是他的检测到底是基于某一ip的总流量呢,还是某一端口的总流量,那就不知道了。最坏的情况也就是IP被封,然后再套CF,既然不能更差,那就试试动态端口吧。
配置动态端口
平常用动态端口的比较少,可以参考的ws+tls+caddy或者nginx的配置都很少,所以试了几次才弄好。
配置动态端口,只需要服务端设置即可,客户端基本可以不变。首次通信还是原协议,然后沟通以后,通过detour重新约定协议和端口,之后就按照新端口进行通信了。
首先修改V2ray的配置,增加一个detour的配置
{
"log": {
"access": "/var/log/v2ray/access.log",
"error": "/var/log/v2ray/error.log",
"loglevel": "warning"
},
"inbounds": [
{
# 这个是原端口,客户端也是用这个端口
"port": 63966,
"protocol": "vmess",
"settings": {
"clients": [
{
"id": "我的动态端口服务器",
"level": 1,
"alterId": 0
}
],
# 这里需要指定detour,重新沟通端口
"detour": {
"to": "dynamicPort"
}
},
"streamSettings": {
"network": "ws"
},
"sniffing": {
"enabled": true,
"destOverride": [
"http",
"tls"
]
}
},
# 这一整条配置都是重新沟通的设置
{
"protocol": "vmess",
# 使用动态端口
"port": "30000-60000",
"tag": "dynamicPort",
# 下面的设置和前面初始端口一样即可
"settings": {
"clients": [
{
"id": "我的动态端口服务器",
"level": 1,
"alterId": 0
}
]
},
"streamSettings": {
"network": "ws"
},
"sniffing": {
"enabled": true,
"destOverride": [
"http",
"tls"
]
},
# 多一个动态分配设置
"allocate": {
"strategy": "random",
# 设置一次随机使用多少个端口
"concurrency": 20,
# 设置端口多久更换一次,这里是300分钟
"refresh": 300
}
}
],
"outbounds": [
{
"protocol": "freedom",
"settings": {
"domainStrategy": "UseIP"
},
"tag": "direct"
},
{
"tag": "netflix",
"port": 443,
"protocol": "vmess",
"settings": {
"vnext": [
{
"port": 443,
"address": "我的netflix服务器",
"users": [
{
"alterId": 0,
"security": "auto",
"id": "我的netflix服务器"
}
]
}
]
},
"streamSettings": {
"network": "ws",
"security": "tls",
"tlsSettings": {
"allowInsecure": false,
"serverName": "我的netflix服务器"
},
"wsSettings": {
"path": "我的netflix服务器",
"headers": {
"host": "我的netflix服务器"
}
}
}
},
{
"protocol": "blackhole",
"settings": {},
"tag": "blocked"
}
],
"dns": {
"servers": [
"https+local://dns.google/dns-query",
"8.8.8.8",
"1.1.1.1",
"localhost"
]
},
"routing": {
"domainStrategy": "IPOnDemand",
"rules": [
{
"type": "field",
"ip": [
"geoip:private"
],
"outboundTag": "blocked"
},
{
"type": "field",
"domain": [
"geosite:netflix"
],
"outboundTag": "netflix"
},
{
"type": "field",
"domain": [
"domain:epochtimes.com",
"domain:epochtimes.com.tw",
"domain:epochtimes.fr",
"domain:epochtimes.de",
"domain:epochtimes.jp",
"domain:epochtimes.ru",
"domain:epochtimes.co.il",
"domain:epochtimes.co.kr",
"domain:epochtimes-romania.com",
"domain:erabaru.net",
"domain:lagranepoca.com",
"domain:theepochtimes.com",
"domain:ntdtv.com",
"domain:ntd.tv",
"domain:ntdtv-dc.com",
"domain:ntdtv.com.tw",
"domain:minghui.org",
"domain:renminbao.com",
"domain:dafahao.com",
"domain:dongtaiwang.com",
"domain:falundafa.org",
"domain:wujieliulan.com",
"domain:ninecommentaries.com",
"domain:shenyun.com"
],
"outboundTag": "blocked"
},
{
"type": "field",
"protocol": [
"bittorrent"
],
"outboundTag": "blocked"
}
]
},
"transport": {
"kcpSettings": {
"uplinkCapacity": 100,
"downlinkCapacity": 100,
"congestion": true
}
}
}
随机端口不能超过总端口的1/3,其实可以给很多很多端口出去的
有了以上设置以后,v2ray基本就能多端口运行了,但是这里还有tls和ws的问题,用了caddy反代,所以反代也需要修改一下对应的端口
{
http_port 80
# 443被封了,所以可以换成别的端口继续用
https_port 4396
}
我的动态端口服务器 {
reverse_proxy 我的web服务器 {
header_up Host {upstream_hostport}
header_up X-Forwarded-Host {host}
}
handle_path /转发路径 {
# 初次沟通端口
reverse_proxy 127.0.0.1:63966
# 最终的动态端口
reverse_proxy 127.0.0.1:30000-60000
}
}
import sites/*
以上配置完成以后就可以测试使用了,如果是nginx同理,设置一下动态端口范围即可
测试
已经可以正常上网了
[root@rave-push-1 ~]# netstat -anp | grep v2ray
tcp 0 0 我的服务器:58916 91.108.56.138:443 ESTABLISHED 26785/v2ray
tcp 0 0 我的服务器:40658 142.251.2.188:5228 ESTABLISHED 26785/v2ray
tcp 0 0 我的服务器:41290 142.250.68.110:443 ESTABLISHED 26785/v2ray
tcp 0 0 我的服务器:58918 91.108.56.138:443 ESTABLISHED 26785/v2ray
tcp 0 0 我的服务器:41288 142.250.68.110:443 ESTABLISHED 26785/v2ray
tcp 0 0 我的服务器:43942 203.205.254.34:443 ESTABLISHED 26785/v2ray
tcp 0 0 我的服务器:40824 8.8.8.8:443 ESTABLISHED 26785/v2ray
unix 3 [ ] STREAM CONNECTED 866036 26785/v2ray
可以看到已经有不同的端口连接着了,不过这都是出的端口,得看入口
看到所有入口的ip,依然是4396端口,而实际上v2rayN根本没做多端口
tcp 0 36 我的服务器:29499 我的客户端:60503 ESTABLISHED 28295/sshd: root@pt
tcp6 0 0 我的服务器:4396 我的客户端:60338 ESTABLISHED 26768/caddy
tcp6 0 0 我的服务器:4396 我的客户端:59386 ESTABLISHED 26768/caddy
tcp6 0 2004 我的服务器:4396 我的客户端:59397 ESTABLISHED 26768/caddy
tcp6 0 0 我的服务器:4396 我的客户端:59993 ESTABLISHED 26768/caddy
tcp6 0 0 我的服务器:4396 我的客户端:59296 ESTABLISHED 26768/caddy
本地抓包发现,好像所有依然走的是4396,其他端口并没有走
TCP 192.168.1.163:59386 我的服务器:4396 ESTABLISHED 5732
TCP 192.168.1.163:59397 我的服务器:4396 ESTABLISHED 5732
TCP 192.168.1.163:59993 我的服务器:4396 ESTABLISHED 5732
TCP 192.168.1.163:60338 我的服务器:4396 ESTABLISHED 5732
TCP 192.168.1.163:60503 我的服务器:29499 ESTABLISHED 438
29499是我的ssh端口,所以并不是v2ray
客户端不支持动态端口
之前从没注意过竟然不支持
https://github.com/2dust/v2rayN/issues/3342
新版本种的V2rayN会一直报错,而老版本的V2rayN虽然不报错,但是实际上并没有走动态端口
2023/02/24 20:29:34 [Warning] [1402096796] app/proxyman/outbound: failed to process outbound traffic > proxy/vmess/outbound: failed to find an available destination > common/retry: [transport/internet/websocket: failed to dial WebSocket > transport/internet/websocket: failed to dial to (wss://我的服务器:44378/us6): > tls: first record does not look like a TLS handshake transport/internet/websocket: failed to dial WebSocket > transport/internet/websocket: failed to dial to (wss://我的服务器:31978/us6): > tls: first record does not look like a TLS handshake transport/internet/websocket: failed to dial WebSocket > transport/internet/websocket: failed to dial to (wss://我的服务器:56840/us6): > tls: first record does not look like a TLS handshake transport/internet/websocket: failed to dial WebSocket > transport/internet/websocket: failed to dial to (wss://我的服务器:34497/us6): > tls: first record does not look like a TLS handshake transport/internet/websocket: failed to dial WebSocket > transport/internet/websocket: failed to dial to (wss://我的服务器:40583/us6): > tls: first record does not look like a TLS handshake] > common/retry: all retry attempts failed
实测Clash也不支持动态端口的设置
其他动态端口方式
还有看到别人直接用iptable将所有动态端口的流量转发给v2ray工作端口,这种方式我没测试,可能也行。
防封手段
总结一些其他的防封手段,或许以后可以用得上
- naiveproxy,一个小众的新协议,只是目前用的人少,没被针对,但是同样的各个软件的支持还不够好,不够普及,鲜少听到被封的
- 禁止回国流量,总有小白开全局,导致大量回国流量,会带来额外风险吧
- 启用fingerprint,目前只有较新版本的软件支持,老版本的还不支持,而且这个设置还没被加到订阅分享链接中
- 禁止使用老版本的软件和core,可能有各种bug或者特征带来风险(其实反过来说也有可能,老协议可能没人针对了,反而放得松)
- 不要用443端口,前置nginx或者其他代理伪装一个网页出来(其实没用,我被封的都是这种带伪装的)
- 转发流量,国内使用某一个固定地址并做好备案等操作,然后出国到各种vps上
- IPLC,直接不过墙,但其实也有监管,出问题的时候会被清退
Summary
所以目前来看动态端口应该是没啥用,除非是直接裸启动v2ray-core或者是在中继上配置动态端口,否则根本无法生效
Quote
https://github.com/v2ray/v2ray-core/issues/2410
https://github.com/v2ray/v2ray-core/issues/634
https://toutyrater.github.io/advanced/dynamicport.html
https://v2xtls.org/xtls-vision%E4%BB%8B%E7%BB%8D%E5%8F%8A%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/