一种更好的外网回家方法,兼报告V2Fly-CoreDocker安装的一个坑

【写作说明】:这篇文章不是教程,没有提供详细的设置方法。只是把思路和过程描述一下,供有需要的人在解决问题时多一个思路。

广告广州家具安装师傅_找师傅不花冤枉钱,全国安装一口价×

由于去年疫情,学校上网课,电信的福利,给合作学校的老师家里的电信上行带宽升到了100M,这可是1000M套餐才有的待遇啊。家里没有老师,不过有个好朋友是。为了薅这个羊毛,我把我的NAS放到他家去了。100M上行带宽真是挺牛的,公网ip,ddns连接,外网看NAS上的电影,除了个别码率特别高的看起来有点卡,4k的电影也能流畅观看。我还同时分享给别的朋友一起看,实测2个人同时看1080p的电影基本无压力。

对NAS远程操作也很方便,基本与局域网操作没有什么区别。说基本无差别,其实还是有一点差别的。比如说有的服务需要在先在内网登录,开通允许外网访问之后才能外网继续操作。这就比较麻烦了,不好意思老是去人家家里鼓捣NAS,我朋友是电脑小白,电话指导他操作也挺废劲,于是就引出了外网伪装内网访问的需求。

我之前的实现方法是在docker里装一个oldiy/chrome-novnc,这个chrome是在NAS上运行的,可以直接访问内网ip。这样基本解决了问题,除了可以用局域网ip访问NAS之外,还可以访问路由器后台。不足之处就是这样运行chrome有点卡,敲字进去有一点微小的滞后,提醒你这不是正常的运行方式。而且vnc连接有点不稳定,有时候连接失败,需要容器重启一下才能访问。

前几天在学习V2Fly,从零入手学习比较困难,最好的方式就是搭建一个环境边学边试。于是我在NAS上装了V2Fly-Core,本机上(远程)也装了一个,测试各种config的配置。在测试过程中突然想到,如果配置一个私有IP全部有vmess隧道送到远程服务器上,不就也可以访问内网了吗?试了一下,想法确实可行,在V2Ray客户端上做一个分流,路由策略用IPOnDemand,geoip:private对应的outbound用vmess到NAS上Docker安装的V2Ray远程服务器上,其他ip都到freedom的outbound上。实测下来,操作路由器后台与本地连接相比,感觉不出差异。这个方法远优于docker chrome访问。

顺便报告一下docker安装V2Ray的一个坑,官网上给出了docker run启动窗口的命令,给出的例子是-p 8888:8888。我的理解是dockerfile已经固定了监听端口是8888,恰好我的8888端口已经被占用,于是我就按常规改成了-p 9888:8888,以NAS的9088端口映射到docker内部的8888端口,同时把NAS的9088端口用uPnP开放访问。我的想法是客户端访问路由器的9888端口,路由器把9888端口的访问引导到NAS的9888端口,再映射给V2Ray服务器的8888端口,实现通讯。两侧的V2Ray服务器都跑起来了,但是连接一直不通,我把log level设成debug,发现客户端在试图与远程服务器建立TCP通道时报错:failed to process outbound traffic > proxy/vmess/outbound: connection ends > proxy/vmess/outbound: failed to read header > proxy/vmess/encoding: Unable to Read Header Len > EOF,而服务器的log里没有任何访问信息和错误信息。在github的issue里面查到了1条同样的报错,管理者没有回答这个提问,关闭了这个issue,同时指向另一条报错信息相似的issue,在那条issue下有详细的讨论,管理者给出的结论是这是AEAD引发的错误,是由于config里alterId为0,和版本不匹配所造成的。这条回答误导了我,花了好多时间测试alterId的值,无果。后来在google上搜这条错误信息,提问的人倒是都解决了,问题有2种情况,客户端和服务器时间不匹配;客户端和服务器uuid不匹配。这2种情况我都反复检查过,不存在。不过从这里可以看出这条错误信息说明服务器和客户端的vmess协议没有握手。再仔细阅读新V2Ray白话文指南里的排错部分,怀疑过是客户端的socks协议版本不对,chrome不能设置代理,通过switchyOmega插件做代理,确保了是Socks5协议,但故障情况依然。在翻找资料的时候突然在指南的docker安装部分发现了这么一句话:

假如你的配置换了端口号,那么相应的端口映射也要更改,假如你在配置文件中把监听端口改为了 9999,则-p参数应该这样写:

-p  9999:9999

突然想到,V2Ray会不会没有在容器中固定端口,而是在安装的时候指定。于是修改容器的端口映射为本机和容器都是9888,重新启动容器。哈哈,一下子就通了。V2Ray容器的这种处理方法,与一般容器的逻辑不一样,凭经验很容易出错,在这里特地记录一下。这也提醒我们,还是要仔细阅读文档,跳跃式阅读最后花的时间反而多出好多倍。