natpass 内网穿透工具 - 基于tls链接,protobuf进行数据传输

Related tags

Network natpass
Overview

natpass

natpass Go Report Card go-mod license platform QQ群711086098

内网穿透工具

实现原理

基于tls链接,protobuf进行数据传输,下面举例在办公网络穿透到家庭网络, 并通过rdp进行连接家庭网络下的某台windows设备

rdp

server端配置(10.0.1.1):

listen: 6154       # 监听端口号
secret: 0123456789 # 预共享密钥
log:
  dir: /opt/natpass/logs # 路径
  size: 50M   # 单个文件大小
  rotate: 7   # 保留数量
tls:
  key: /dir/to/tls/key/file # tls密钥
  crt: /dir/to/tls/crt/file # tls证书

家庭网络client配置(192.168.1.100):

id: home              # 客户端ID
server: 10.0.1.1:6154 # 服务器地址
secret: 0123456789    # 预共享密钥,必须与server端相同,否则握手失败
log:
  dir: /opt/natpass/logs # 路径
  size: 50M   # 单个文件大小
  rotate: 7   # 保留数量

办公网络client配置(172.16.1.100):

id: work              # 客户端ID
server: 10.0.1.1:6154 # 服务器地址
secret: 0123456789    # 预共享密钥,必须与server端相同,否则握手失败
log:
  dir: /opt/natpass/logs # 路径
  size: 50M   # 单个文件大小
  rotate: 7   # 保留数量
tunnel:                         # 远端tunnel列表可为空
  - name: rdp                   # 链路名称
    target: home                # 目标客户端ID
    type: tcp                   # 连接类型tcp或udp
    local_addr: 0.0.0.0         # 本地监听地址
    local_port: 3389            # 本地监听端口号
    remote_addr: 192.168.1.101  # 目标客户端连接地址
    remote_port: 3389           # 目标客户端连接端口号

工作流程如下:

  1. 办公网络与家庭网络中的np-cli创建tls连接到np-svr
  2. np-cli服务发送握手包,并将配置文件中的secret字段进行md5哈希
  3. np-svr等待握手报文,若等待超时则为非法链接,直接断开
  4. 办公网络客户机创建新连接到172.16.1.100的3389端口
  5. 172.16.1.100上的np-cli接收到新请求后创建新的link并生成链接id
  6. 172.16.1.100上的np-cli发送connect_request消息,告知连接类型和链接目标地址和端口
  7. np-svr转发connect_request消息至192.168.1.100上的np-cli
  8. 192.168.1.100上的np-cli接收到connect_request消息,根据请求信息创建链接到目标地址和端口
  9. 192.168.1.100上的np-cli根据链接创建结果返回connect_response消息
  10. np-svr转发connect_response消息至172.16.1.100上的np-cli
  11. 172.168.1.100上的np-cli接收到connect_response消息后根据是否成功来决定是否需要断开rdp客户端链接
  12. 链路打通,两端各自发送data消息到对应链路

编译

./build

linux部署

  1. 将init.d/np-cli和init.d/np-svr拷贝至/etc/init.d目录

  2. 创建/opt/natpass和对应目录

     sudo mkdir -p /opt/natpass/bin /opt/natpass/conf
    
  3. 将编译出的二进制文件拷贝至/opt/natpass/bin目录

  4. 将配置文件拷贝至/opt/natpass/conf目录,并修改对应参数

  5. 设置开机启动项

     sudo systemctl enable np-svr
     或
     sudo systemctl enable np-cli
    
  6. 启动对应服务

     sudo /etc/init.d/np-svr start
     或
     sudo /etc/init.d/np-cli start
    

iperf3压测对比

使用相同参数,iperf3压测1分钟

# natpass
[ ID] Interval           Transfer     Bitrate         Retr
[  5]   0.00-60.00  sec  69.6 MBytes  9.73 Mbits/sec   38             sender
[  5]   0.00-63.74  sec  62.1 MBytes  8.17 Mbits/sec                  receiver

# frp单路复用stcp,tls
[ ID] Interval           Transfer     Bitrate         Retr
[  5]   0.00-60.00  sec  67.5 MBytes  9.44 Mbits/sec   42             sender
[  5]   0.00-60.22  sec  58.7 MBytes  8.17 Mbits/sec                  receiver
Issues
  • 编译出错

    编译出错

    执行 build_all ,在编译 linux amd64 时出错,详细日志如下: 代码分支 v0.8.3

    `natpass git:(heads/v0.8.3) ✗ ./build_all [+] Building 3.3s (7/7) FINISHED
    => [internal] load build definition from Dockerfile 0.0s => => transferring dockerfile: 37B 0.0s => [internal] load .dockerignore 0.0s => => transferring context: 2B 0.0s => [internal] load metadata for docker.io/library/debian:stable-slim 3.2s => [1/3] FROM docker.io/library/debian:[email protected]:091320245c2637337fc612baf22430ec1735fd395e2c97e2c90136137d156f63 0.0s => CACHED [2/3] WORKDIR /build 0.0s => CACHED [3/3] RUN sed -i "s|deb.debian.org|mirrors.ustc.edu.cn|g" /etc/apt/sources.list && sed -i "s|security.debian.org|mirrors.ustc.edu.cn|g" /etc/apt/sources.list && 0.0s => exporting to image 0.0s => => exporting layers 0.0s => => writing image sha256:02faaa823400e4098f801bf50b212737f81314da3cbe5348d46615083e9cd7de 0.0s => => naming to docker.io/library/natpass 0.0s

    Use 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them 2022/03/07 08:44:13 [INFO]go env... GO111MODULE="" GOARCH="amd64" GOBIN="" GOCACHE="/root/.cache/go-build" GOENV="/root/.config/go/env" GOEXE="" GOEXPERIMENT="" GOFLAGS="" GOHOSTARCH="amd64" GOHOSTOS="linux" GOINSECURE="" GOMODCACHE="/root/go/pkg/mod" GONOPROXY="" GONOSUMDB="" GOOS="linux" GOPATH="/root/go" GOPRIVATE="" GOPROXY="https://goproxy.cn,direct" GOROOT="/usr/local/go" GOSUMDB="sum.golang.org" GOTMPDIR="" GOTOOLDIR="/usr/local/go/pkg/tool/linux_amd64" GOVCS="" GOVERSION="go1.17.7" GCCGO="gccgo" AR="ar" CC="gcc" CXX="g++" CGO_ENABLED="1" GOMOD="/build/go.mod" CGO_CFLAGS="-g -O2" CGO_CPPFLAGS="" CGO_CXXFLAGS="-g -O2" CGO_FFLAGS="-g -O2" CGO_LDFLAGS="-g -O2" PKG_CONFIG="pkg-config" GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build3024449258=/tmp/go-build -gno-record-gcc-switches" 2022/03/07 08:44:35 [INFO]build target linux/amd64... 2022/03/07 08:44:36 [INFO]build server... 2022/03/07 08:44:41 [INFO]build client... # github.com/lwch/rdesktop/keycode /usr/bin/ld: skipping incompatible /usr/lib/i386-linux-gnu/libX11.so when searching for -lX11 /usr/bin/ld: skipping incompatible /usr/lib/i386-linux-gnu/libX11.a when searching for -lX11 /usr/bin/ld: cannot find -lX11 /usr/bin/ld: skipping incompatible /usr/lib/i386-linux-gnu/libX11.so when searching for -lX11 collect2: error: ld returned 1 exit status panic: exit status 2

    goroutine 1 [running]: github.com/lwch/runtime.Assert(...) /root/go/pkg/mod/github.com/lwch/[email protected]/assert.go:6 main.build({{0x4f09db, 0x5}, {0x4f0972, 0x5}, {0x0, 0x0}, {0x0, 0x0}, {0x0, 0x0}, ...}) /build/contrib/build/build_all.go:207 +0x132f main.main() /build/contrib/build/build_all.go:114 +0x305 exit status 2`

    bug 
    opened by uriddle 8
  • 小建议

    小建议

    • 代码目录结构:可否参照下相关golang开源项目或者规范靠一下呢,暂可忽略
    • windows支持:既然当前只支持windows vnc,不知是否有调测,配置文件是否单独抽出windows支持的配置路径格式,或者程序处理转义路径形式。windows报错,启动panic,尴尬
    • panic: 直接使用panic处理所有错误,太硬了,出问题哪里抛出的都不一定能直接找到,估摸的一层一层去找了,生产环境定然不能直接这样,推荐log信息埋点加时间event关键词是否会更友好点
    • 直接上tls: 个人感觉有必要,也有点硬,门槛拉高了,只是想使用下,或者放置个默认试用证书? 或者配置tls开启、关闭 客服考虑下
    • 开发者文档:暂可忽略

    目前看想试用下跑起来有点费劲。测试各种panic 泪崩

    opened by liuhaogui 6
  • 按照文档运行没有任何日志,运行失败

    按照文档运行没有任何日志,运行失败

    在同一台机器上运行了服务端和控制端 [[email protected] natpass-server]# sudo systemctl start np-svr [[email protected] natpass-server]# sudo systemctl start np-cli 启动后没有任何提示,也没有日志输出,打开对应端口也是失败的

    opened by ChinaArJun 2
  • v0.7.2

    v0.7.2

    1. 截屏库统一抽取到https://github.com/lwch/screenshot
    2. 修正windows下的错误日志显示格式问题
    3. 修正windows下的配置文件include问题
    4. 支持linux远程桌面

    注:linux受控端需使用np-cli.vnc程序进行启动,且目前无法以systemd等方式运行

    opened by lwch 0
Releases(v0.8.6)
Owner
李文超
李文超