Skip to content

Proposal: move udpHop to mask#6327

Open
LjhAUMEM wants to merge 24 commits into
XTLS:mainfrom
LjhAUMEM:mask-udphop
Open

Proposal: move udpHop to mask#6327
LjhAUMEM wants to merge 24 commits into
XTLS:mainfrom
LjhAUMEM:mask-udphop

Conversation

@LjhAUMEM

Copy link
Copy Markdown
Collaborator

还是草案,抽空给新 wg 测试了下 hop,基本没什么问题,移动可以顺便实现两个增益

  • wg hop
  • ips hop

第二点背景:iptables 在转发 udp 包时可以根据之前五元组修改返回包的 src ip port,所以搭配 ipt 的服务端天然支持 ips hop,只欠客户端

另外除了 ip addr add 还有个便捷添加 /64 的方法,src

IFACE="eth0"
SUBNET="2:2:2:2::/64"
sysctl net.ipv6.ip_nonlocal_bind=1
ip route add local $SUBNET dev $IFACE
apt install -y ndppd
cat << EOF > /etc/ndppd.conf
route-ttl 30000
proxy $IFACE {
    router no
    timeout 500
    ttl 30000
    rule $SUBNET {
        static
    }
}
EOF
systemctl restart ndppd

@LjhAUMEM

Copy link
Copy Markdown
Collaborator Author

重写了一遍才发现旧 udphop 存在内存泄露的可能,取决于 close 的时候 recvQueue 是否未取完

今晚再实测一下这个 pr 应该就差不多了

@LjhAUMEM

Copy link
Copy Markdown
Collaborator Author

今晚再实测一下

现在才有空测试

slices.Backward 好像把 index 也反过来了,不是 0 开始,位于最后一层的判断冲突,还得基于 6331 再改下

@LjhAUMEM

Copy link
Copy Markdown
Collaborator Author

现在才有空测试

wg + salamander 仅 ips hop 正常,仅 ports hop 正常,ips + ports hop 正常

hy + salamander 仅 ips hop 正常,仅 ports hop 正常,ips + ports hop 正常

应该没什么要改的了

@RPRX

RPRX commented Jun 22, 2026

Copy link
Copy Markdown
Member

之前我说把 udpHop 弄成 mask 你又说不合适,感觉现在这个设计得有点混乱,sockopt 咋也来了,然后 realm 那个又没它

要不改成 destHop 什么的名字让 TCP 也能用上吧

@LjhAUMEM

Copy link
Copy Markdown
Collaborator Author

之前我说把 udpHop 弄成 mask 你又说不合适

之前确实除了 hy2 xp3 其他都用不了,重构 wg 后我才发现 wg 内部默认是支持 peer 修改 ep 的,但是因为使用了 udp hub 把这个特性掩盖了

sockopt 咋也来了

理论上调用了 internet dialsystem 都可以配置这个字段

要不改成 destHop 什么的名字让 TCP 也能用上吧

wrap 是基于已有的连接,而且我也想不到 tcp 能怎么用

@RPRX

RPRX commented Jun 22, 2026

Copy link
Copy Markdown
Member

这东西本来就是强特征,UDP 能用,TCP 为啥不能用,比如开个 VLESS Encryption 然后 iptables 转发,反正都不在乎特征了

@Fangliding

Copy link
Copy Markdown
Member

tcp有状态啊

@LjhAUMEM

Copy link
Copy Markdown
Collaborator Author

这东西本来就是强特征

这种迁移的能力利好网络变化的场景,但是主动 hop 确实,现在最小是 5 秒一次,wg 里配置是无法取消 Roaming 的,要主动调用 device 的接口

TCP 为啥不能用

那首先服务端要支持连接迁移,不是单客户端 hop 就行

@RPRX

RPRX commented Jun 24, 2026

Copy link
Copy Markdown
Member

tcp有状态啊

啊?刚刚给我喝的不是牛奶?

咳搞串了,我的意思是:啊?这个端口跳跃是把已有连接也迁移了吗?我一直以为只是新连接

@LjhAUMEM

Copy link
Copy Markdown
Collaborator Author

其实移到 mask 也只增加了一个 wg 可使用,kcp, raw udp 还不行

@RPRX

RPRX commented Jun 24, 2026

Copy link
Copy Markdown
Member

其实移到 mask 也只增加了一个 wg 可使用,kcp, raw udp 还不行

kcp 为啥还不行,服务端没支持连接迁移(发包到新的来源端口)吗?那你写一下吧

@LjhAUMEM

Copy link
Copy Markdown
Collaborator Author

kcp 为啥还不行,服务端没支持连接迁移(发包到新的来源端口)吗?那你写一下吧

kcp 似乎是面向单条tcp连接而不是面向客户端(mux tcp),所有客户端的新连接都是个新的端口,而且这识别连接的方式只能靠五元组
image

即使有魔改可能没重新实现+了解过一遍 c++ kcp 我是不会下手的,我得对自己的修改负责

@LjhAUMEM

LjhAUMEM commented Jun 27, 2026

Copy link
Copy Markdown
Collaborator Author

不过也可以利用每条连接都是新 socket 的特性,mask 只做个 dest overwrite 不新 dial,这样 kcp 也可以搭配 ipt 做出类似 hop 的效果

还没想好是新开个 dest-overwrite mask 还是给 udphop 加个 overwrite dest only 配置 @RPRX

不过kcp能自己在dial的时候选择随机目标也用不到mask

@RPRX

RPRX commented Jun 27, 2026

Copy link
Copy Markdown
Member

你说的是客户端?但是 KCP 服务端还是得实现往新的来源二元组发包,不然只是上行 hop 了

@LjhAUMEM

Copy link
Copy Markdown
Collaborator Author

纯客户端,就是新连接自动随机 dest,但这个配置项要应用其实应该配在上层

@LjhAUMEM

Copy link
Copy Markdown
Collaborator Author

先集成在了 udphop 里,缺点是暂时无法搭配 dialerproxy,如果以后解决了 dp 里的 b.udp 那这个缺点也可以消除

开启 overwrite only 是全系通用
关闭只有 hy2 xp3 wg 可用

当然服务端都需要开启 ipt

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants