apernet / hysteria

Hysteria is a powerful, lightning fast and censorship resistant proxy.
https://v2.hysteria.network/
MIT License
15.21k stars 1.7k forks source link

h2客户端可以链接但是clash和surge连接不上 #965

Closed txl263 closed 7 months ago

txl263 commented 9 months ago

描述问题 在一台arch VPS 上运行了几个月的h2,最近几天无法连接,客户端用的clash,经过测试发现h2的客户端可以连接,但是clash和surge连接不上。

如何复现

预期行为

日志

ar 05 00:49:19 archDo systemd[1]: Started Hysteria Server Service.
Mar 05 00:49:19 archDo hysteria[292]: 2024-03-05T00:49:19+08:00        INFO        server mode
Mar 05 00:49:19 archDo hysteria[292]: 2024-03-05T00:49:19+08:00        INFO        server up and running        {"listen": ":443"}
Mar 05 01:01:56 archDo hysteria[292]: 2024-03-05T01:01:56+08:00        INFO        client connected        {"addr": "111.194.▆▆▆.227:46177", "id": "user", "tx": 12500000}
Mar 05 01:11:40 archDo hysteria[292]: 2024-03-05T01:11:40+08:00        INFO        client disconnected        {"addr": "111.194.▆▆▆.227:46177", "id": "user", "error": "accepting stream failed: timeout: no recent network activity"}
Mar 05 13:59:52 archDo hysteria[292]: 2024-03-05T13:59:52+08:00        INFO        client connected        {"addr": "146.190.▆▆▆.118:43174", "id": "user", "tx": 12500000}
Mar 05 14:03:16 archDo hysteria[292]: 2024-03-05T14:03:16+08:00        ERROR        TCP error        {"addr": "146.190.▆▆▆.118:43174", "id": "user", "reqAddr": "api.hy2.io:443", "error": "readfrom tcp4 146.190.▆▆▆.118:33500->172.67.208.246:443: timeout: no recent network activity"}
Mar 05 14:03:16 archDo hysteria[292]: 2024-03-05T14:03:16+08:00        INFO        client disconnected        {"addr": "146.190.▆▆▆.118:43174", "id": "user", "error": "accepting stream failed: timeout: no recent network activity"}
Mar 05 14:06:27 archDo hysteria[292]: 2024-03-05T14:06:27+08:00        INFO        client connected        {"addr": "146.190.▆▆▆.118:57662", "id": "user", "tx": 12500000}
Mar 05 14:07:08 archDo hysteria[292]: 2024-03-05T14:07:08+08:00        ERROR        TCP error        {"addr": "146.190.▆▆▆.118:57662", "id": "user", "reqAddr": "api.hy2.io:443", "error": "readfrom tcp4 146.190.▆▆▆.118:34382->104.21.69.135:443: timeout: no recent network activity"}
Mar 05 14:07:08 archDo hysteria[292]: 2024-03-05T14:07:08+08:00        INFO        client disconnected        {"addr": "146.190.▆▆▆.118:57662", "id": "user", "error": "accepting stream failed: timeout: no recent network activity"}

设备和操作系统 Linux archDo 6.7.8-arch1-1 #1 SMP PREEMPT_DYNAMIC Sun, 03 Mar 2024 00:30:36 +0000 x86_64 GNU/Linux

额外信息

txl263 commented 9 months ago
hysteria -c config.yaml
2024-03-05T15:08:20+08:00       INFO    client mode
2024-03-05T15:08:20+08:00       INFO    connected to server     {"udpEnabled": true, "tx": 2500000, "count": 1}
2024-03-05T15:08:20+08:00       INFO    use this URI to share your server       {"uri": "hysteria2://▆▆▆@146.190.▆▆▆.118:443/?insecure=1&sni=▆▆▆.top"}
2024-03-05T15:08:20+08:00       INFO    SOCKS5 server listening {"addr": "127.0.0.1:1080"}
2024-03-05T15:08:20+08:00       INFO    HTTP proxy server listening     {"addr": "127.0.0.1:8080"}
txl263 commented 8 months ago

求指点怎么排错,现在shellclash和clash-verge都连不上

haruue commented 8 months ago

您好。 如果您遇到的问题仅在第三方客户端复现, 建议您先通过第三方客户端的 Issue 或社群寻求帮助。

txl263 commented 8 months ago

您好。 如果您遇到的问题仅在第三方客户端复现, 建议您先通过第三方客户端的 Issue 或社群寻求帮助。

感谢,那我先去shellclash那边提个bug问一下

txl263 commented 7 months ago

更新一下 自从之前出问题后一直没有找到解决办法,今天尝试再次查找问题

  1. 首先用 hysteria2 官端尝试登录
    hysteria -c config.yaml
    2024-04-17T11:01:31+08:00   INFO    client mode
    2024-04-17T11:01:32+08:00   FATAL   failed to initialize client {"error": "connect error: CRYPTO_ERROR 0x12a (local): tls: failed to verify certificate: x509: certificate has expired or is not yet valid: current time 2024-04-17T11:01:32+08:00 is after 2024-02-23T05:20:57Z"}

    证书过期了,但是看日期就很奇怪,证书应该是在2024-02-23之后过期了,但是看我提交 bug 的时间是在 3 月 5 日,当时证书已经过期了,但是官端和NekoBox可以正常连接,但是 clash-verge 和 clashshell 不能连接。

上服务器查询证书

./acme.sh --list
Main_Domain     KeyLength  SAN_Domains     CA                                                              Created               Renew
*.mo██████.top  "2048"     no              https://acme.freessl.cn/v2/DV90/directory/70vibszd██████brauio  2023-01-16T11:33:26Z  2023-03-16T11:33:26Z
mo██████.top    "2048"     *.mo██████.top  LetsEncrypt.org                                                 2023-11-25T06:20:59Z  2024-01-23T06:20:59Z
  1. 更新证书 ./acme.sh --renew 查询证书
    ./acme.sh --list
    Main_Domain     KeyLength  SAN_Domains     CA                                                              Created               Renew
    *.mo██████.top  "2048"     no              https://acme.freessl.cn/v2/DV90/directory/70vibszd██████brauio  2024-04-17T03:12:37Z  2024-06-15T03:12:37Z
    mo██████.top    "2048"     *.mo██████.top  LetsEncrypt.org                                                 2024-04-17T03:13:22Z  2024-06-15T03:13:22Z
  2. 重启 hysteria 服务
  3. 下载证书到本地
  4. 尝试官端登录,提示doesn't contain any IP SANs
    hysteria -c config.yaml
    2024-04-17T11:18:01+08:00   INFO    client mode
    2024-04-17T11:18:01+08:00   FATAL   failed to initialize client {"error": "connect error: CRYPTO_ERROR 0x12a (local): tls: failed to verify certificate: x509: cannot validate certificate for ███.███.███.███ because it doesn't contain any IP SANs"}
  5. 然后又试了一下 clash-verge 和clashshell,却都可以连接。

总结一下就是,上次证书过期的时候官端可以连接,但是 clash-verge 不可以,今天更新证书后官端连接失败但是 clash-verge 却可以连接了,我不了解技术细节,但是看 clash-verge 的配置没有证书的相关配置,问题是不是在这里。关于“doesn't contain any IP SANs”的问题我先去搜索一下其他 issue。

haruue commented 7 months ago

您好。 doesn't contain any IP SANs 这个问题, 应该是客户端配置中 server 是填的 IP 地址, 并且没有指定 tls.sni 导致的。

txl263 commented 7 months ago

您好。 doesn't contain any IP SANs 这个问题, 应该是客户端配置中 server 是填的 IP 地址, 并且没有指定 tls.sni 导致的。

看了一下配置文件,sni 之前在 tls 外边,现在放到了 tls 下。新的报错 2024-04-17T13:55:43+08:00 FATAL failed to initialize client {"error": "authentication error, HTTP status code: 301"}

haruue commented 7 months ago

authentication error, HTTP status code: 301

这个通常是客户端填错了密码, 然后你服务端有配置 masquerade, 背后的站点返回了 301。

另外我建议你把完整的服务端和客户端配置文件发上来。

txl263 commented 7 months ago

authentication error, HTTP status code: 301

这个通常是客户端填错了密码, 然后你服务端有配置 masquerade, 背后的站点返回了 301。

另外我建议你把完整的服务端和客户端配置文件发上来。

服务器config.yaml

listen: :443
tls:
    cert: /usr/share/nginx/cert.pem
    key: /usr/share/nginx/key.pem

auth:
  type: password
  password: ████████

masquerade:
  type: proxy
  proxy:
    url: https://bing.com
    rewriteHost: true

hy2客户端config.yaml

server: 146.███.███.118
auth: 443
password: ████████
tls:
  sni: m████m.top
  insecure: 1
  ca: /Users/Eric/.dotfiles/.config/hysteria/cert.pem

bandwidth:
  up: 20 mbps
  down: 100 mbps

socks5:
  listen: "127.0.0.1:1088"
http:
  listen: "127.0.0.1:9090"
haruue commented 7 months ago

您提供的配置中有格式不正确的地方。

下面的示例假设您服务器的地址是 146.123.45.118 , 端口是 443, 密码是 ac1688d4c5f8, 你需要按照真实的配置进行替换。

您需要将客户端配置中的下面几行

server: 146.123.45.118
auth: 443
password: ac1688d4c5f8

修改成

server: 146.123.45.118:443

auth: ac1688d4c5f8

请阅读我们的配置文档了解正确的格式: https://hysteria.network/zh/docs/advanced/Full-Client-Config/

txl263 commented 7 months ago

@haruue 感谢,终于找到问题了。我是把本地 dotfile 集中存放用来方便备份,然后在原本的位置做硬链接的。 配置文件本来格式是正确的(第一次提交这个 bug 的时候应该是正确的),今天为了调试不小心把配置文件硬链接到了错误的文件夹。 现在所有的客户端都能正常连接了。 现在看起来最初提交 bug 的时候,clash-verge 和 shellClash 不能连接可能是因为证书过期了?

txl263 commented 7 months ago

@haruue 感谢,终于找到问题了。我是把本地 dotfile 集中存放用来方便备份,然后在原本的位置做硬链接的。 配置文件本来格式是正确的(第一次提交这个 bug 的时候应该是正确的),今天为了调试不小心把配置文件硬链接到了错误的文件夹。 现在所有的客户端都能正常连接了。 现在看起来最初提交 bug 的时候,clash-verge 和 shellClash 不能连接可能是因为证书过期了?

用原来的配置文件更新证书后所有的客户端就都正常了