xiaorouji / openwrt-passwall

7.2k stars 2.65k forks source link

[Bug]: 订阅含有IPV6的链接失败 #2419

Closed iceliuhacker closed 1 year ago

iceliuhacker commented 1 year ago

描述您遇到的bug

订阅的内容有ipv4和ipv6节点,发现订阅后只有ipv4的订阅成功,ipv6的节点都忽略了。

复现此Bug的步骤

一、节点订阅 二、添加含有ipv6节点的订阅

您想要实现的目的

不要忽略ipv6的节点

日志信息

无,不需要

截图

image

系统相关信息

git-24.086.49405-8fb6827

其他信息

No response

xiaorouji commented 1 year ago

看了一下订阅代码,应该正常不会被忽略的。 但是有可能是因为订阅节点的ipv6地址包含[]括号?(麻烦确认一下)

iceliuhacker commented 1 year ago

看了一下订阅代码,应该正常不会被忽略的。 但是有可能是因为订阅节点的ipv6地址包含[]括号?(麻烦确认一下)

vless我觉得是不是应该有才对,因为同样的地址在手机里导入成功,或者能否设置兼容性,无论有没有中括号都能加成功。 之后我用手动模式单独导入某一个带IPV6的URL就出现这样的问题: image 以下为我的个人建议,从IPV6的结构看: xxxx:xxxx::xxxx:xxxx 使用的是“:”作为分隔符。 如果带上端口号,由于通常端口和IP之间的分隔符也是“:”,就出现了: xxxx:xxxx::xxxx:xxxx:456 这样就很容易把456也看作是ipv6的一部分。 因此我推荐使用中括号:

再加上现在浏览器、curl等对ipv6的识别都是中括号,因此我个人推荐兼容中括号是非常有必要的。 以上您看呢?

xiaorouji commented 1 year ago

我没有ipv6的订阅节点测试。 不过你可以按我说的操作一下试试: 修改/usr/share/passwall/subscribe.lua https://github.com/xiaorouji/openwrt-passwall/blob/dfe8eaa435a40d7806eb8e46a0909400328fe3b5/luci-app-passwall/root/usr/share/passwall/subscribe.lua#L1133 把这行的datatypes.ipmask6(result.address)改成datatypes.ipmask6(result.address:gsub("%[", ""):gsub("%]", ""))后 重新订阅看看

xiaorouji commented 1 year ago

你可以把手动导入的链接在这里发我测试一下,记得把敏感内容改一改

iceliuhacker commented 1 year ago

你可以把手动导入的链接在这里发我测试一下,记得把敏感内容改一改

感谢! 2种格式我都提供以下: vless://xxxxxxxx-xxxxxx-xxxxxxxx-xxxxxxxx@[2406:da14::92c4:9954]:7004?security=tls&encryption=none&alpn=h2&headerType=none&fp=random&type=tcp&flow=xtls-rprx-vision&sni=vr-lb.domain.com#176.3.3.3_JP_IPv6-VLESS_VS vless://xxxxxxxx-xxxxxx-xxxxxxxx-xxxxxxxx@[2406:da14::92c4:9954]:6010?security=reality&encryption=none&alpn=h2&pbk=GpLwEiXslrNfTqH3xI&headerType=none&fp=random&spx=%2F&type=tcp&flow=xtls-rprx-vision&sni=www.microsoft.com&sid=bb9e26a9b665#35.3.3.3_JP_IPv6-VLESS_VS_RL 本来还有一个VMESS_GRPC,但是被BASE64编码了,不方便提供。

iceliuhacker commented 1 year ago

这样修改后,vmess系列好了,我想因该是因为vmess用的是json,有双引号作为分割。但是vless系列IPV6和端口都是冒号,导致失败。 我看了下vless代码 if Info[2]:find(":") then
hostInfo = split(Info[2], ":")
result.address = hostInfo[1]
local idx_port = 2
if hostInfo[2]:find("?") then
hostInfo = split(hostInfo[2], "?") idx_port = 1
end
if hostInfo[idx_port] ~= "" then port = hostInfo[idx_port] end 确实用:作为分割,这样就分割出问题了。 另:指纹伪造的值fp=random好像被丢弃了。

xiaorouji commented 1 year ago

请更新一下最新的源码测试一下

liuhgiceblood commented 1 year ago

请更新一下最新的源码测试一下

image 单独更新了这2个文件,好用了。

liuhgiceblood commented 1 year ago

但是独立导出导入这一块是不是没更新?还是因为我更新的文件不全造成? image 单独导出某一个节点发现不带中括号,这样就导致导入做截取也就失败。

xiaorouji commented 1 year ago

你只更新了订阅脚本,没有更新js。

iceliuhacker commented 1 year ago

你只更新了订阅脚本,没有更新js。

哈哈,我的错,更新了link_share那个文件后解决了。 这一块之前我用到的地方完美了。很赞!

jh0072110 commented 1 year ago

说到ipv6,借楼问一下,ipv6的tcping都是超时啊……

xiaorouji commented 1 year ago

说到ipv6,借楼问一下,ipv6的tcping都是超时啊……

你的网络问题,检查一下

jh0072110 commented 1 year ago

说到ipv6,借楼问一下,ipv6的tcping都是超时啊……

你的网络问题,检查一下

能连上 但是tcping那里显示的超时 应该…是哪里的问题呢……

kumoonkey commented 1 year ago

说到ipv6,借楼问一下,ipv6的tcping都是超时啊……

你的网络问题,检查一下

能连上 但是tcping那里显示的超时 应该…是哪里的问题呢……

我的ipv6节点也是能用,但tcping显示超时。