v2ray突然失效超时问题处理

今天打开Google,发现不能用了,折腾了近两个小时,才不完美的解决了。

问题描述

这个问题的直接表现就是,Google打不开。查了下v2ray客户端日志,发现如下记录:

1
2
2020/05/22 13:43:00 [Info] [1562828084] v2ray.com/core/transport/internet/tcp: dialing TCP to tcp:1.1.1.1:11111
2020/05/22 13:43:01 [Warning] [1562828084] v2ray.com/core/app/proxyman/outbound: failed to process outbound traffic > v2ray.com/core/proxy/vmess/outbound: failed to find an available destination > v2ray.com/core/common/retry: [dial tcp 1.1.1.1:11111: i/o timeout dial tcp 1.1.1.1:11111: operation was canceled] > v2ray.com/core/common/retry: all retry attempts failed

(保密起见,记录中ip地址和端口号已经替换成假的,下文同。)

上述日志表明,连接远程v2ray服务端发生了网络IO超时。这意味着,要么服务器出故障了,要么网络出故障了。
那就一项一项排查呗,先检查服务器,再检查网络。

服务器排查

第一步,检查一下服务器是否还在正常工作。一般情况下用服务器ip是否能够ping通作为判断标准。

1
2
3
4
5
6
ping 1.1.1.1
PING 1.1.1.1 (1.1.1.1): 56 data bytes
64 bytes from 1.1.1.1: icmp_seq=0 ttl=50 time=205.611 ms
Request timeout for icmp_seq 1
64 bytes from 1.1.1.1: icmp_seq=2 ttl=50 time=205.445 ms
64 bytes from 1.1.1.1: icmp_seq=3 ttl=50 time=207.564 ms

可见,服务器本身是好的。

第二步,检查v2ray服务端端口是否正常工作。
在本地用tcping工具检查v2ray服务端的端口号,发现端口状态为“closed”。

1
2
# tcping 1.1.1.1 11111
1.1.1.1 port 11111 closed.

端口closed。似乎抓到背后问题的尾巴了!
顺手再查查其他端口比如80、443等常用HTTP端口,发现状态都是“open”。
那么,这里可以下一个初步结论:这个端口从本机访问不了了。
不过这种情况还无法直接定位到问题根源,需要继续排查。

第三步,检查服务器中v2ray程序是否启动。

1
2
# ps -ef | grep v2ray
root 2988 1 0 14:02 ? 00:00:02 /usr/bin/v2ray/v2ray -config /etc/v2ray/config.json

第四步,检查服务器上v2ray监听端口是否开启。

1
2
# netstat -nap | grep 11111
tcp6 0 0 :::11111 :::* LISTEN 2988/v2ray

经过以上两个步骤,可以看出v2ray服务端并没有什么问题,仍在正常工作中。
第五步,检查服务器防火墙配置,看看有没有禁用v2ray的监听端口。

1
2
3
4
5
6
7
# iptables --list
...
Chain IN_public_allow (1 references)
...
ACCEPT tcp -- anywhere anywhere tcp dpt:6170 ctstate NEW,UNTRACKED
ACCEPT udp -- anywhere anywhere udp dpt:6170 ctstate NEW,UNTRACKED
...

可见,防火墙对v2ray监听端口也正确设置了放行规则。

经过以上检查步骤,断定服务器端配置没有问题。另外,由于本地电脑和服务器都是我一个人在用,也不存在别人改了我的配置,导致本机v2ray和服务端配置不一致的情况。

网络排查

其实经过上面服务器端检查的第二步,已经能够说明很多问题了。网站服务可正常访问,ssh也能用,唯独v2ray服务受到影响,可见不是服务器机房网络的问题了,而是涉及该端口11111的流量,在传输过程中被ban了。这种情况就难以下确切结论了,只能想其他办法了。

不断试错,最终解决

找不到根本原因,那就求助万能的搜索引擎吧,看看网友们怎么说。谷歌用不了就只能度娘了。打开百度输入关键词”v2ray连接超时“,竟然第一条就找到了一个貌似提供解决方案的blog,打开一看发布日期,”2020年5月20日“,哦哦,还就是这两天发布的,看来靠谱。该博文给出的方案是v2ray服务器端绑定ipv4监听地址,其实就是修改v2ray配置文件/etc/v2ray/config.json,在inbound节点中加上"listen": "1.1.1.1"这样的配置项,然后保存退出,重启v2ray。
按这个方案试了一下,不行。 回头看博文下面的评论,讨论挺热烈,大家都说方案跑不通。
再翻翻其他博文,也都说的云里雾里。

实在没辙了,先换个端口试试吧。
修改服务器端v2ray配置文件,端口号由原来的11111改为22222。

1
2
3
4
5
6
7
# vim /etc/v2ray/config.json
...
"inbound": {
"port": 11111, <------这里修改端口
"protocol": "vmess",
"listen":"12.34.56.78",
...

修改后,同步修改本机v2ray客户端配置里的端口号。另外别忘了在服务器防火墙里配置开放这个端口。
再次打开Google测试,竟然可以访问了!

喜大普奔!

冷静下来后,再次检查本机v2ray日志:

1
2
3
4
5
6
2020/05/22 14:08:11 [Info] [713431801] v2ray.com/core/app/dispatcher: default route for tcp:www.google.com:443
2020/05/22 14:08:11 [Info] [713431801] v2ray.com/core/transport/internet/tcp: dialing TCP to tcp:1.1.1.1:22222
2020/05/22 14:08:11 tcp:127.0.0.1:63193 accepted tcp:www.gstatic.com:443 [proxy]
2020/05/22 14:08:11 tcp:127.0.0.1:63192 accepted tcp:www.google.com:443 [proxy]
2020/05/22 14:08:11 [Info] [3172428981] v2ray.com/core/proxy/vmess/outbound: tunneling request to tcp:www.gstatic.com:443 via tcp:1.1.1.1:22222
2020/05/22 14:08:11 [Info] [713431801] v2ray.com/core/proxy/vmess/outbound: tunneling request to tcp:www.google.com:443 via tcp:1.1.1.1:22222

发现跟远程服务器端的tunnel通道已经成功建立了。
最后总结一句话解决办法: 换端口

问题反思

这次问题算是临时得到了解决。至于为什么原来的端口不能用了,怀疑是跟网络运营商,或是国际线路节点有关,可能是因为一些不能明说的原因比如BT下载等,这个端口或端口区间被ban了。这种情况也没办法说理去,只能换端口了。下次要是遇到类似的情况,估计还得换端口。所以说这是不完美的解决办法。