XTLS / Xray-core

Xray, Penetrates Everything. Also the best v2ray-core, with XTLS support. Fully compatible configuration.
https://t.me/projectXray
Mozilla Public License 2.0
25.78k stars 3.97k forks source link

[BUG] `sockopt.interface` 在Darwin平台未对UDP生效 #4007

Closed ghost closed 1 week ago

ghost commented 1 week ago

完整性要求

描述

如题,darwin平台设置interface会漏udp,看了下确实没有对udp进行处理

https://github.com/XTLS/Xray-core/blob/44b1dd0e674347691c62a13d227edf0d36b7e290/transport/internet/sockopt_darwin.go#L100-L148

自己参考隔壁sb和v2,把 unix.SetsockoptInt 放到外面来,编译后运行会出现如下错误

2024/11/12 14:39:24 [Info] transport/internet: failed to apply socket options to incoming connection > transport/internet: failed to set Interface > invalid argument

希望官方能把这个问题修复,这对XHTTP上下行分离还是挺实用的,以及tun2socks前置场景 (感觉更像feature reqest而不是bug report

重现方式

客户端配置


{
  "outbounds": [
    {
      "protocol": "vless",
      "streamSettings": {
        "sockopt": { "interface": "en0" },
        "network": "splithttp",
        "security": "tls",
        "tlsSettings": { "serverName": "", "alpn": ["h3"], "fingerprint": "chrome", "allowInsecure": false },
        "splithttpSettings": {
          "path": "/",
          "host": "",
          "scMaxEachPostBytes": "100000-2000000",
          "scMaxConcurrentPosts": "50-100",
          "scMinPostsIntervalMs": "30-50",
          "xPaddingBytes": "100-1000"
        }
      },
      "mux": { "enabled": false },
      "tag": "proxy",
      "settings": {
        "vnext": [
          {
            "address": "",
            "users": [{ "id": "", "encryption": "none", "flow": "", "level": 0 }],
            "port": 443
          }
        ]
      }
    },
    {
      "tag": "direct",
      "protocol": "freedom",
      "settings": { "domainStrategy": "UseIP" },
      "streamSettings": {
        "sockopt": { "interface": "en0" }
      }
    }
  ]
}

服务端配置

客户端日志

服务端日志

RPRX commented 1 week ago

看了下代码,好像不止 darwin,Xray 在所有平台上都只有 isTCPSocket https://github.com/XTLS/Xray-core/issues/4007#issuecomment-2469777576

话说我看有人提过这个 interface 无效,你测试一下 h2 是有效的吗 https://github.com/XTLS/Xray-core/issues/4007#issuecomment-2469768041

ghost commented 1 week ago

测试h2有效,还有,这里貌似还漏了v6的处理

Fangliding commented 1 week ago

老生常谈的问题了 go自己的binddevice只在Linux实现了 照搬setsockopt不行那就gg 相关资料很少 只能说谁用mac谁修了 买的时候就该考虑到生态问题 要不就是当初qv群里的笑话 赞助开发者一台mac就修

ghost commented 1 week ago

¿坏了,我成end user了

RPRX commented 1 week ago

我又看了下,仅 interface 而言,Xray 在 win 和 linux 上是放在 isTCPSocket 外面的,只有 darwin 是放在 isTCPSocket 里面

把 unix.SetsockoptInt 放到外面来,编译后运行会出现如下错误

如果简单放外面不行的话,那确实我们没有测试环境,你修一下看看

RPRX commented 1 week ago

@Fangliding 话说 linux 上的 CustomSockopt 应该移到 isTCPSocket 外面,对 UDP 也生效,加个判断 level

还有顺序改为 level、opt、value、type 似乎更好

Fangliding commented 1 week ago

位子我当初没注意可以改一下 但是顺序我觉得原来是对的 和代码里顺序是一样的 SetsockoptInt/String level opt value

RPRX commented 1 week ago

位子我当初没注意可以改一下 但是顺序我觉得原来是对的 和代码里顺序是一样的 SetsockoptInt/String level opt value

然鹅代码里最后才判断是 int 还是 str 才决定调用哪个函数,所以 type 放最后更合理

Fangliding commented 1 week ago

为了方便只能这样写 要不封装一下两个函数 顺序真没啥好纠结的 反正投到config里顺序也是随便写 没有什么逻辑含义 xhttp里一堆变量名还叫splithttp呢

RPRX commented 1 week ago

为了方便只能这样写 要不封装一下两个函数

不用,只是你提到了代码里的顺序,我说代码里其实也是 type 放最后,因为本来就是 type 放最后更合理些

其实当初似乎应该无需用户指定 type,json 填数字就是 int,填字符串就是 str,现在 break 还来得及

Fangliding commented 1 week ago

故意的 因为除了这两种实际上还有更高级的sockopt操作 以后可能会有用才留在这 当然现在好像还没什么必要去加 这个功能说难听点可以叫堵嘴 一是避免sockopt里的东西堆得越来越长 二是避免以后有人可能请求新选项

RPRX commented 1 week ago

不过不确定能不能区分 0 还是 "" https://github.com/XTLS/Xray-core/pull/3517#issuecomment-2217023138

RPRX commented 1 week ago

还有顺序改为 level、opt、value、type 似乎更好

话说我发现代码里两个结构体的顺序本来就是这样,只是你写文档时不知道为啥把 type 放最上面了,改文档就行了

但是顺序我觉得原来是对的 和代码里顺序是一样的

这下被我抓到风扇没看代码在这儿尬聊了