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 -h
或tunnel -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.key
,client.crt
到.tunnel
- 创建配置文件
tunnel.yml
中.tunnel
- 启动所有隧道
$ tunnel -config ./tunnel/tunnel.yml start-all
运行服务器:
- 安装
tunneld
二进制文件 - 制作
.tunneld
目录 - 复制
server.key
,server.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
:隧道协议http
,tcp
或sni
addr
:将流量转发到此本地端口号或网络地址,因为proto=http
它可以是完整的URL,即https://machine/sub/path/?plus=params
支持URL方案http
和https
auth
:(proto=http
)(可选)基本身份验证凭据,可对通过隧道传输的请求进行强制执行,格式user:password
host
:(proto=http
,proto=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