我在日常使用中发现移动网络运营商或者 GFW 会对长期与某一个固定境外 IP 端口的连接进行干扰,严重的时候直接无法访问启用了 V2ray 服务的端口。那么如何应对呢?
首先简单介绍下我的设备和网络环境,我的移动设备是一台 iPhone,上面安装了 Shadowrocket,当我长时间使用某一个节点后,会间歇性的无法连接,这个过程会持续好几个小时然后又突然恢复。
我的 V2ray 节点是自己部署在韩国节点的,使用的加密方式是 Websocket+TLS,本身的速度虽然不是特别快,但绝对不会卡顿成这样,每次卡顿的时候我手动更改端口后就可以立即恢复正常,所以应该是 GFW 在从中作梗。
我简单讲一下我的解决思路吧,花了点时间研究了一下 V2ray 自带的动态端口功能,虽然可以解决我的需求,但这还是需要一个主端口用来通讯,这样情况下主端口被干扰的话,也会无法使用。
动态端口-V2ray:
而服务器上自动定时更换端口不现实,因为我的移动设备并不知道当前最新的端口是什么。那么要如何才能让服务器更换端口后,移动设备又能知道当前的端口号呢?
下面是我写的一个小脚本,使用了 Python 的 Flask 框架,下面的代码主要是写个思路,并不能直接拿来用的。它的功能就是来了一个请求,将之前使用的端口弃用,随机一个新的端口号,并将这个端口转发到本地的 443 端口。最后将新的端口号码生成新的 vmess 订阅链接。
with open('port_nums', 'r', encoding='utf-8') as f: old_port = f.read() del_cmd = f'''sudo iptables -t nat -D PREROUTING -p tcp --dport {old_port} -j REDIRECT --to-port 443''' os.system(del_cmd) new_port = random.randint(40000, 50000) add_cmd = f'''sudo iptables -t nat -A PREROUTING -p tcp --dport {new_port} -j REDIRECT --to-port 443''' os.system(add_cmd) with open('port_nums', 'w', encoding='utf-8') as k: k.write(str(new_port)) r1 = f'auto:318d18d5-4b00-43ba-abf5-60f3f4312345@1.2.3.4:{new_port}' r2 = str(base64.b64encode(r1.encode("utf-8"))).replace("b'","").replace("'","") r3=f'''vmess://{r2}?emarks=baidu.com&obfsParam=baidu.com&path=/v2ray&obfs=websocket&tls=1&tfo=1&mux=1&alterId=0''' r4 = base64.b64encode(r3.encode("utf-8")) return r4
最后我使用 Shadowrocket 的订阅功能,定时向服务器获取最新的端口号,服务器收到订阅更新的请求后,关闭之前的通讯端口,随机启用一个端口号,再将新端口加入到订阅链接中返回给移动端设备。
这样移动端设备就可以通过更新订阅来使用最新的端口连接到服务器了。
因为我的移动设备是 iPhone,所以我理所当然的使用了快捷指令!如果你也是iPhone,并且你也安装了快捷指令和 Shadowrocket 那么可以点击这个链接获取这个快捷指令,就如同它的名字一样,它只有一个功能:更新订阅
将其添加到快捷指令后,接下来就是有趣的部分了,我们可以为iPhone 设置自动化,然后每2个小时自动向服务器请求新的端口。根据我用了大约一周的测试下来,几乎没有任何可以感知的干扰发生了。
最近工作很忙,没时间学习和提升自己,抽出空解决了一个困扰我很久的小问题还是挺有意思的。如果这个小脚本有人需要的话,欢迎可以评论告诉我。
想要安全的激活Windows系统,自建KMS服务器是最好的选择。
对象存储服务(Cloud Object Storage,COS)是面向企业和个人开发者提供的高可用,高稳定,强安全的云端存储服务。
将脚本其设置为自动运行,每半个小时获取一次数据。
抑郁常见的症状包括持续的心境低落、兴趣和乐趣的丧失、睡眠和食欲的改变等。
ubuntu系统自带的数独真的是超好玩,不过智商有限,10分钟左右才能解开一个简单的谜题。
目录
热门标签
更多语言
站点信息