Published on

使用docker运行hysteria2

Authors

前言

hysteria2是基于udp的协议,卖点是Brutal拥塞控制算法,可以通过用户手动指定所需速率来抵抗丢包。

测速

curl -Lso- bench.sh | bash

 Node Name        Upload Speed      Download Speed      Latency
 Speedtest.net    444.96 Mbps       594.47 Mbps         37.92 ms
 Los Angeles, US  452.46 Mbps       597.77 Mbps         11.79 ms
 Dallas, US       486.78 Mbps       427.94 Mbps         39.87 ms
 Montreal, CA     443.80 Mbps       487.58 Mbps         66.85 ms
 Paris, FR        412.13 Mbps       750.76 Mbps         148.18 ms
 Amsterdam, NL    417.30 Mbps       458.14 Mbps         145.63 ms

运行上面的命令,测试服务器的上传和下载速率,等会要填入配置。我服务器的上传大概400Mbps,下载450Mbps。

安装

使用sing-box来运行hysteria协议,我使用sing-box的docker来运行,可以使用二进制。

1. 拉取镜像

docker pull ghcr.io/sagernet/sing-box:latest

2. 编辑hysteria服务端配置文件

生成bing.com自签名证书

openssl req -x509 -nodes -newkey ec:<(openssl ecparam -name prime256v1) -keyout sing-box/server.key -out sing-box/server.crt -subj "/CN=bing.com" -days 36500 
#&& sudo chown hysteria sing-box/server.key && sudo chown hysteria sing-box/server.crt
# 某些脚本需要运行上面的命令

我使用的是bing.com自签名证书

vim sing-box/hysteria2.json
 {
  "inbounds": [
    {
      "type": "hysteria2",
      "listen": "::",
      "listen_port": 8080,
      "up_mbps": 450,
      "down_mbps": 450,
      "users": [
        {
          "name": "sekai",
          "password": "123456"
        }
      ],
      "tls": {
        "enabled": true,
        "server_name": "bing.com",
        "key_path": "/etc/sing-box/server.key",
        "certificate_path": "/etc/sing-box/server.crt"
      }
    }
  ]
}

3. 启动容器

docker run -d --name hysteria2 -p 30100:8080/udp --restart unless-stopped -v /root/sing-box:/etc/sing-box ghcr.io/sagernet/sing-box:latest run -c /etc/sing-box/hysteria2.json

客户端配置

windows GUI

我用的是windows GUI客户端,nekobox,手动输入选择hysteria2协议,输入ip地址、端口号和密码,sni处输入配置里server_name的域名, 我是用的是bing.com,因为是自签名证书,勾选不检查服务器证书。

上传速度和下载速度设置,以客户端实际的速度为准。

sing-box

{
  "outbounds": [
    {
      "type": "hysteria2",
      "server": "127.0.0.1",
      "server_port": 8080,
      "up_mbps": 100,
      "down_mbps": 100,
      "password": "<password>",
      "tls": {
        "enabled": true,
        "server_name": "example.org",
        "insecure": true
      }
    }
  ]
}

在outbounds加入这项即可,具体细节按照服务端配置即可。

疑难杂症

android客户端无法访问google.com

IPv6路由关闭

后查询hysteria2文档得知,可能是由于访问google.com的ipv6地址时,走的是http/3协议,该协议会 导致一些问题,所以需要将udp/443端口屏蔽。一般在tun模式下才会出现(手机vpn模式也是tun)

可以在 https://http3check.net/ 查询网站是否支持http/3,advanced可以看到ip地址和端口号

  • nekobox客户端 在路由处添加一条规则,port选择443,network选择udp

  • PC客户端nekoBox 左上角 程序-> 首选项-> 路由设置-> 自定义路由(在下面),将下面的配置粘贴进去:

    {
      "rules": [
          {
              "network": "udp",
              "outbound": "block",
              "port": [
                  443
              ]
          }
      ]
    }
    
  • sing-box cli 在路由处加入上面的配置即可