WireGuard inbound: Fix multi-peer; Fix potential routing issue#5843
WireGuard inbound: Fix multi-peer; Fix potential routing issue#5843
Conversation
|
ipc 里的 listen_port 也可以去掉,有的话也只是触发一次 BindUpdate 然后传给 bind.Open 还发现一个新的问题,短时间内触发大量 device.logger.Verbosef 日志好像会卡住 |
|
异步日志怎么还能丢日志的... 改到 64 暂时解决了,没有再丢了 还是保留了 listen_port 改用 closedCh 来获知 bind close,readQueue 则不关闭,把 recover 去掉了 |
|
顺便既然要改入站的话看一下 #5555 ,主要是能复现和能测试确认修复 |
|
嗯,继 5554 之后 wg in 处于不可用状态,不过思路没啥问题,我还把 recover 优化掉了,顺便解决了启动入站的时候冒出一堆 channel closed 日志的问题, 之前这么设计的应该是假定每个 peer 都会持有从 recv func 发来的 readQ,但实现的时候 recv func 数量又不严格和 peer 数量对应,所以就很迷,不过这个设计也只能用在出站,入站随便打来一个 udp 包都会持有 readQ,所以还是保持目前这个方案 5555 只是应用上 sniff 吗,应该就 ctx 变量设置下就行了,让我看看 |
|
sniff 我测试是正常的啊, 对于入站的 sniff,是以 session content 的形式储存在 ctx 里, Xray-core/app/proxyman/inbound/always.go Lines 60 to 68 in cb7bfeb Xray-core/app/proxyman/inbound/worker.go Lines 367 to 374 in cb7bfeb 而 wg 在创建新 ctx 时已经把 content 复制过去了,所以 sniff 是有效的,而我实际测试确实是这样,下面是测试配置 Xray-core/proxy/wireguard/server.go Lines 141 to 143 in cb7bfeb |
{
"log": { "loglevel": "debug" },
"inbounds": [
{
"tag": "socks",
"listen": "127.0.0.1",
"port": 1080,
"protocol": "socks",
"settings": {
"auth": "noauth",
"udp": true
}
},
{
"tag": "wg-in",
"listen": "127.0.0.1",
"port": 1081,
"protocol": "wireguard",
"settings": {
"secretKey": "uJX4Xm3JmWzYpqIZFiKP+JlDXUpD39eqHJ1Bsn5R5nc=",
"peers": [
{
"publicKey": "Eq5K/cMuaVF7NucLpSqzxOQ+/iMFj1ZU2PpeJAscvic="
}
],
"noKernelTun": true,
"domainStrategy": "ForceIP"
},
"sniffing": {
"enabled": true,
"destOverride": ["http", "tls"]
}
}
],
"outbounds": [
{
"tag": "direct",
"protocol": "freedom"
},
{
"tag": "block",
"protocol": "blackhole"
},
{
"tag": "wg-out",
"protocol": "wireguard",
"settings": {
"secretKey": "YKjJrIBGR3QjDvhXSIK4ndxiyDgNOzTJOu8teRxHQGU=",
"peers": [
{
"endpoint": "127.0.0.1:1081",
"publicKey": "ZaUsMjS5OeCRHLMAtp3rMDBVRYur622DRL71Bx9kjno="
}
],
"noKernelTun": true,
"domainStrategy": "ForceIPv4"
}
}
],
"routing": {
"rules": [
{
"inboundTag": ["socks"],
"outboundTag": "wg-out"
}
// ,{
// "domain": ["ident.me"],
// "outboundTag": "block"
// }
]
}
}
可以看到很明显的重定向,把注释去掉可以看到路由也是成功的 |
|
等下,--connect-to 少打一个冒号, |
|
还是没问题,换 255.255.255.254 就好了,255.255.255.255 都出不到 forwardConnection 那里,所以 sniff 是没问题的
|
|
它是好的 就是一些竞争小问题 所以那个issue我没关 |
|
看了下 issue, 不看那个 issue,对于每个 Process 的 ctx 在用的 dispatcher inboundTag contentTag 似乎不会再变化了,来个 sync once 赋值一次应该就可以 |
|
不变的东西让它去赋值也没关系 反正又不是map并发访问会崩溃 主要是content会动 里面有嗅探结果什么的 |
|
那也没事,forwardConnection 也用不上嗅探的结果,iirc 每个 func 里的 ctx 都是一份 copy,上游 func 改变了当前 func 和下游 func 不会影响 这条评论比较有用 新 wg 我测试的时候有 sniffed domain, |
|
@LjhAUMEM 还有看一下 mKCP 的 header 啥的能不能再压缩一下(比如 varint),新版顺带 XKCP 算了,分享链接可带 mtu |
|
|
|
也就是 mtu 加到 fm 里?没地方放啊,可改 mtu 就 wg 和 kcp,quicParams 也不合适
|
|
只是给 mkcp 分享链接加 mtu 和 tti,不是放 fm 里,代码不用改,现在主要的问题是国人 GUI 没跟上,HAPP 啥的倒不担心 XKCP 准备搁置一下了,毕竟 XDNS 这种方式还能在伊朗活多久都不确定, @LjhAUMEM WG 入站的小问题你看一下要不要修,暂时不修的话我直接合并这个 PR 发稳定版了 |
|
不知道有啥问题主要是,那个 issue 说的 sniff 无效我测试了是有效的, |
|
那个 issue 说的是偶尔失效,可能是 ctx 没 deep clone 然后多并发时同一份 content 被改来改去的,需要多并发,你看看 |
|
原来是这个,确实,构建新入站应该用新 content,wg 的特殊性导致从 process 来的并不是入站,到 forwardConnection 才是,就不能也不应该复用 process 来的 session content |
|
当初留着这个开始是因为这个 forwardconnection 丢失了全部关于源的信息 因为源信息是从process传入的 这修的是当初没注意的 protocol 翻转问题 影响protocol分流 之前会串sniff dest的问题比较大那个早修了 |
|
|
|
现在的东西是每个 process 都根据传来的inbound更新一下 Server.info |
|
看了下 sniff 里的 protocol 是会存在 content 上下文里,每个新 Dispatch 持有独立的 content 没啥问题, 现在 sniff protocol 的问题解决了,forwardconnection 现在丢失掉的应该也只剩 peer 对端 ip,好奇如果两个 peer 在 tun 里的 laddr 是相同的 wg 是怎么处理, |
|
|
|
还有我感觉 core 底层传输那里处理 UDP 的逻辑过于复杂了,套来套去的,造成性能堪忧,@LjhAUMEM 有空时优化一下 |
|
freedom 还是 raw udp 入站,我有空看看吧,不过之前给 udp hub 接 fm 的时候看到 hub 也分几个 os 用 ReadUDPMsg 暂时是没看出来什么用途 |
|
这个 #5843 (comment) 是我纯凭经验猜的,刚看了下 #5555 也有相关改动, |
|
@LjhAUMEM 现在有空把 noise 的拆出另一个 PR 吗,标题不好写 |
|
哦哦,稍等 |
Uh oh!
There was an error while loading. Please reload this page.