V2ray ws tls Caddy使用动态端

VMESS,nginx,ss,封端口,封ip

Views:  times Updated on April 8, 2023 Posted by elmagnifico on February 22, 2023

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也不支持动态端口的设置

iptables动态端口方式

还有看到别人直接用iptable将所有动态端口的流量转发给v2ray工作端口

如下是将本机的4444端口流量转发给本地的22端口

iptables -t nat -A PREROUTING -p tcp --dport 4444 -j REDIRECT --to-ports 22

删除刚才的规则

iptables -t nat -D PREROUTING -p tcp --dport 4444 -j REDIRECT --to-ports 22

批量转发,将40000到60000的端口全部转发给443端口(nginx或者caddy所在)

iptables -t nat -A PREROUTING -p tcp --dport 40000:60000 -j REDIRECT --to-ports 443

实测,这样以后v2rayn在40000-60000端口之间随便选择一个端口即可,被封了换一个就是了,也可以像评论里的办法,直接批量加一些端口,来回切就是了

最差的情况就是整个IP被封了,动态端口就没啥用了。

centos

iptables持久化,先把配置好的表保存起来

iptables-save > /etc/sysconfig/iptables

设置开机启动时自动恢复这个内容

vi /etc/rc.d/rc.local

加入下面的内容,从保存未知恢复iptables

iptables-restore < /etc/sysconfig/iptables

记得要给文件运行权限,否则可能无法执行脚本

chmod +x /etc/rc.d/rc.local

脚本化

iptables-save > /etc/sysconfig/iptables;echo "iptables-restore < /etc/sysconfig/iptables" >> /etc/rc.d/rc.local;chmod +x /etc/rc.d/rc.local

ubuntu

安装持久化工具,一路保存即可

sudo apt-get install iptables-persistent -y

开机启动

sudo systemctl enable netfilter-persistent

防封手段

总结一些其他的防封手段,或许以后可以用得上

  • naiveproxy,一个小众的新协议,只是目前用的人少,没被针对,但是同样的各个软件的支持还不够好,不够普及,鲜少听到被封的
  • 禁止回国流量,总有小白开全局,导致大量回国流量,会带来额外风险吧
  • 启用fingerprint,目前只有较新版本的软件支持,老版本的还不支持,而且这个设置还没被加到订阅分享链接中
  • 禁止使用老版本的软件和core,可能有各种bug或者特征带来风险(其实反过来说也有可能,老协议可能没人针对了,反而放得松)
  • 不要用443端口,前置nginx或者其他代理伪装一个网页出来(其实没用,我被封的都是这种带伪装的)
  • 转发流量,国内使用某一个固定地址并做好备案等操作,然后出国到各种vps上
  • IPLC,直接不过墙,但其实也有监管,出问题的时候会被清退
  • REALITY ,最新的协议,可惜目前支持不够全,很多客户端不支持

2023.3.21,距离本文发布刚好一个月后,新换的端口又被封了,后续还是得换成比较通用的小众协议或者换IP,否则还是会经常遇到被封端口

其他关于封锁的信息分享

我目前大概有十五个左右的VPS和节点,总结一下,看我其他文章,也能大概知道经历过了哪些情况。

  • 被运营商封锁,腾讯云,这种本身就不合法,可以理解,但是我一共3个腾讯云香港,只有2个被封,其中有一个现在依然健在,也是正常使用的,所以不是很理解这个封禁到底是怎么判定的。
  • 被封ip,最初瓦工刚用了一年的时候,被封了ip,花钱换了ip,相同配置下,之后跑满流量、继续使用一年再也没遇到过封ip和端口的情况,无论何时都正常使用。之前kurun的vps也有被封ip,大概两三个月后端口被放出来了,又继续使用,暂时还没被墙。
  • 被封端口,最近被封端口数量大概是过去4年的3倍,封一个我换一个,由于这样太折腾了,所以弄了动态端口,动态端口目前被封还没遇到解封的情况
  • 瓦工,瓦工新开的机器,基本上没多久就被封端口了,只要不是弱协议应该不会封IP,当然你也可以花钱换到一个完全不相干的IP段去,防止老是被检查。
  • 纯vmess+tcp或者纯ss,只要你有流量经过,最晚是几天内就会给你封了ip,注意是ip不是端口。但是目前的经历告诉我,这种情况会在几周内解封(再无弱协议代理流量的情况下,同时跑tls+tls好像没问题)

总结,IP段可能有一部分是被经常检测的,所以这一部分IP段如果遇到弱协议,是直接封禁IP的。同样的,有些ip可能不在墙检测的范围内,所以墙不会主动探测他们,也就放过了。

  • 不要开启v2ray中的ss或者非tls类的协议,一旦被探测,就是100%死

Summary

可惜的是客户端普遍不支持动态端口的设定,如果能自动随机选一个端口,那就好了

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/