go-http-tunnel 通过HTTP / 2的快速安全隧道

322次阅读
没有评论

共计 2803 个字符,预计需要花费 8 分钟才能阅读完成。

Go HTTP隧道是基于HTTP / 2的反向隧道。它使您可以在没有公共IP的情况下共享本地主机。

特征:

  • 具有基本身份验证的 HTTP代理
  • TCP代理
  • SNI虚拟主机代理
  • 客户端自动重新连接
  • 客户管理和驱逐
  • 易于使用的CLI

常见用例:

  • 在家托管游戏服务器
  • 开发Webhook集成
  • 管理物联网设备

安装

生成最新版本。

go get -u github.com/mmatczuk/go-http-tunnel/cmd/...

或者下载最新版本。对于Linux使用amd64_linux即可

运行

有两个可执行文件:

  • tunneld -隧道服务器,将在AWS或GCE之类的公共主机上运行
  • tunnel -隧道客户端,可以在本地计算机或专用网络上运行

要获取有关命令参数的帮助,请运行tunneld -htunnel -h

隧道要求客户端和服务器都使用TLS证书。

$ openssl req -x509 -nodes -newkey rsa:2048 -sha256 -keyout client.key -out client.crt 
$ openssl req -x509 -nodes -newkey rsa:2048 -sha256 -keyout server.key -out server.crt

运行客户端:

  • 安装tunnel二进制文件
  • 制作.tunnel在项目目录目录
  • 复制client.keyclient.crt.tunnel
  • 创建配置文件tunnel.yml.tunnel
  • 启动所有隧道
$ tunnel -config ./tunnel/tunnel.yml start-all

运行服务器:

  • 安装tunneld二进制文件
  • 制作.tunneld目录
  • 复制server.keyserver.crt.tunneld
  • 启动隧道服务器
$ tunneld -tlsCrt .tunneld/server.crt -tlsKey .tunneld/server.key

这将在80端口上运行HTTP服务并且在443端口运行HTTPS服务,如果要使用HTTPS,建议获取正确签名的证书,以避免安全警告。

使用Systemd在Ubuntu上运行服务器即服务:

  • 成功完成上述步骤后,为您的服务创建一个新文件(您可以随意命名,只需将下面的名称替换为您选择的名称即可)。
  • $ vim tunneld.service

    将以下配置添加到文件

  • [Unit]
    Description=Go-Http-Tunnel Service
    After=network.target
    After=network-online.target
    
    [Service]
    ExecStart=/path/to/your/tunneld -tlsCrt /path/to/your/folder/.tunneld/server.crt -tlsKey /path/to/your/folder/.tunneld/server.key
    TimeoutSec=30
    Restart=on-failure
    RestartSec=30
    
    [Install]
    WantedBy=multi-user.target
    • 保存并退出该文件。
    • 将此新文件移动到/ etc / systemd / system /
    $ sudo mv tunneled.service / etc / systemd / system /
    • 更改文件权限以使其运行。
    $ sudo chmod u + x /etc/systemd/system/tunneld.service
    • 启动新服务,并确保您没有任何错误,并且您的客户端能够连接。
    $ sudo systemctl启动tunnel.service
    • 您可以通过以下方式停止服务:
    $ sudo systemctl停止tunnel.service
    • 最后,如果您希望服务在重启服务器时自动启动,则需要启用它。
    $ sudo systemctl 启用 tunneled.service

    systemd服务还有更多选项,但这并不是穷举配置文件。

设置

隧道客户端tunnel需要配置文件,默认情况下它将尝试读取tunnel.yml您当前的工作目录。如果要指定其他文件,请使用-config标志。

样本配置公开:

  • localhost:8080 如 webui.my-tunnel-host.com
  • 主机在专用网络中进行ssh连接

看起来像这样

server_addr: SERVER_IP:5223
   tunnels:
     webui:
       proto: http
       addr: localhost:8080
       auth: user:password
       host: webui.my-tunnel-host.com
     ssh:
       proto: tcp
       addr: 192.168.0.5:22
       remote_addr: 0.0.0.0:22
     tls:
 	    proto: sni
 	    addr: localhost:443
 	    host: tls.my-tunnel-host.com

配置选项:

  • server_addr:服务器TCP地址,即 54.12.12.45:5223
  • tls_crt:客户端TLS证书的路径,默认值: client.crt 在配置文件目录中
  • tls_key:客户端TLS证书密钥的路径,默认值: client.key 在配置文件目录中
  • root_ca:可信根证书颁发机构池文件的路径,如果为空,则接受任何服务器证书
  • tunnels / [name]
    • proto:隧道协议httptcpsni
    • addr:将流量转发到此本地端口号或网络地址,因为proto=http它可以是完整的URL,即https://machine/sub/path/?plus=params支持URL方案httphttps
    • auth:(proto=http)(可选)基本身份验证凭据,可对通过隧道传输的请求进行强制执行,格式user:password
    • host:(proto=httpproto=sni)要请求的主机名(需要保留名称和DNS CNAME)
    • remote_addr:(proto=tcp)绑定远程TCP地址
  • backoff
    • interval:如果连接断开,客户端将在重拨服务器之前等待多长时间,指数补偿初始间隔,默认值: 500ms
    • multiplier:如果重新连接失败,则间隔乘数,默认值: 1.5
    • max_interval:客户端重拨服务器之前等待的最长时间,默认值: 1m
    • max_time:如果连接断开,客户端将尝试重新连接到服务器的最长时间0默认设置为永不停止尝试 15m

怎么运行的

客户端打开与服务器的TLS连接。服务器仅接受来自已知客户端的连接。客户端通过其TLS证书ID进行识别。该服务器是公开可用的,并且代理到客户端的传入连接。然后,该连接将进一步代理到客户端的网络中。

隧道基于HTTP / 2,以提高速度和安全性。客户端和服务器之间只有一个TCP连接,所有代理连接都使用HTTP / 2进行多路复用。

Github地址:https://github.com/mmatczuk/go-http-tunnel

正文完
 
admin
版权声明:本站原创文章,由 admin 2019-12-27发表,共计2803字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)
验证码