源码:https://gitee.com/winshu/go-netbus

已编译的可执行文件:

链接:https://pan.baidu.com/s/1AJdXS8P-dFA-UoK7vuosuw 
提取码:ekks 
 

项目介绍

有时候,我们在外想要访问家里或公司主机的资料,要么由于主机处于内网下,要么就是是运营商随机分配的一个公网IP,都很难直接连上主机获取资料。

那么,有什么办法可以解决这一难题?答案就是内网穿透。当内网中的主机没有静态IP地址要被外网稳定访问时可以使用内网穿透。

go-netbus【网络直通车】是为解决内网穿透问题开发的工具。

功能列表

  • 基于 TCP 协议
  • 支持多端口穿透
  • 支持断线重连
  • 支持指定访问端口
  • 支持身份认证,引入基于有效期的身份失效机制
  • 单服务支持多个连接

工作原理

go-netbus介绍:Golang 内网穿透

通常我们需要访问一个服务,只需要直接通过地址连接就可以了,但是如果服务处在一个与访问者隔离的内网环境里,我们就不能访问了。 不过也不是没有办法,如果内网服务可以访问外网的话,我们就可以找到突破点。

实现步骤

服务端部分

  1. 启动tunnel_bridge, 监听tunnel_client的连接。
  2. 启动tunnel_server, 监听用户的访问请求。

客户端部分

  1. 启动tunnel_client, 向tunnel_bridge拨号,建立连接。
  2. 如果用户发起请求,则向内网服务拨号,建立连接。
  3. 处理连接双方的通讯,实现穿透。

如何部署实现内网穿透

服务端 需要一台具有公网 IP 的服务器(比如阿里云),配置不限,将服务端部署上去。
客户端 部署在内网服务器,与需要穿透的服务(比如 mysql)在同一个局域网。

需要注意的是,实现穿透后,就相当于将服务暴露在互联网,会面临被攻击的风险。

如何编译

# linux
$ go build -o netbus main.go

# windows
$ go build -o netbus.exe main.go

生成带失效时间的“短期 key”

注意:此 key 仅用于客户端,服务端用的还是原 key

# 假如希望生成到期日期为 2019-12-31 的 key,使用命令:

$ netbus -generate <key> [expired-time]

# key                原 key , 必填参数
# expired-time       到期日期,如:2019-12-31,未输入此参数的话,生成有效期为一个月的 key

启动方式

支持两种方式启动:

  • 纯命令行启动(不需要配置文件)
  • 配置文件启动(需要配置文件)【推荐】

命令行启动

# 启动服务端

$ netbus -server <key> <port>

# 注释
# key                 建议长度 6-16 个字符,用于身份校验
# port                服务端端口,不要使用保留端口,必填
# access-port-range   访问端口范围,必填,如 10000-20000
# 启动客户端

$ netbus -client <key> <server:port> <local:port:mapping> [tunnel-count]

# 注释
# key                与服务端保持一致
# server:port        服务端地址,格式如:45.32.78.129:6666
# local:port:mapping 被代理服务地址及访问端口(访问端口省略时表示不进行端口转换),多个以逗号隔开,比如:127.0.0.1:3389,127.0.0.1:3306:13306
# tunnel-count       隧道条数,默认为1,范围[1-5]

配置文件启动

启动前准备
config_demo.ini重命名为config.ini

服务端配置

# 服务端配置
[server]
# 代理端口
port = 6666
# Key 建议长度 6-16 个字符,用于身份校验
key = winshu

客户端配置

# 客户端配置
[client]
# 与服务端保持一致
key = winshu
# 服务端地址,格式 ip:port
server-host = 127.0.0.1:6666
# 内网被代理服务地址及访问端口(多个用逗号隔开),格式如 192.168.1.100:3389:13389
# 内网IP:内网端口:访问端口
local-host-mapping = 127.0.0.1:3389:13389
# 隧道条数,默认为1,范围[1-5]
tunnel-count = 1

启动命令

# 启动服务端
$ netbus -server

# 启动客户端
$ netbus -client

相关文章: