natpass 新一代NAT内网穿透+shell+rdp工具

natpass 新一代NAT内网穿透+shell+rdp工具

natpass简介

新一代NAT内网穿透+shell+vnc(暂未实现)工具,支持tcp隧道、shell隧道

工具原理

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

natpass 新一代NAT内网穿透+shell+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消息到对应链路

natpass下载地址

①GitHub:

natpass_0.4.0_freebsd_386.tar.gz11.2 MB
natpass_0.4.0_freebsd_amd64.tar.gz11.4 MB
natpass_0.4.0_freebsd_arm.tar.gz10.7 MB
natpass_0.4.0_freebsd_arm64.tar.gz10.7 MB
natpass_0.4.0_linux_386.tar.gz11.2 MB
natpass_0.4.0_linux_amd64.tar.gz11.6 MB
natpass_0.4.0_linux_arm.tar.gz10.8 MB
natpass_0.4.0_linux_arm64.tar.gz10.7 MB
natpass_0.4.0_linux_mips.tar.gz10.5 MB
natpass_0.4.0_linux_mips64.tar.gz10.6 MB
natpass_0.4.0_linux_mips64le.tar.gz10.4 MB
natpass_0.4.0_linux_mipsle.tar.gz10.4 MB
natpass_0.4.0_netbsd_386.tar.gz10.8 MB
natpass_0.4.0_netbsd_amd64.tar.gz11.1 MB
natpass_0.4.0_netbsd_arm.tar.gz10.4 MB
natpass_0.4.0_netbsd_arm64.tar.gz10.3 MB
natpass_0.4.0_openbsd_386.tar.gz10.8 MB
natpass_0.4.0_openbsd_amd64.tar.gz11.1 MB
natpass_0.4.0_openbsd_arm.tar.gz10.4 MB
natpass_0.4.0_openbsd_arm64.tar.gz10.4 MB
natpass_0.4.0_windows_386.zip20.4 MB
natpass_0.4.0_windows_amd64.zip22 MB
natpass_0.4.0_windows_arm.zip19.9 MB

②云中转网盘:

此处仅提供Windows_amd64和Linux_amd64的包

yunzhongzhuan.com/#sharefile=9IpMQXN6_14039
解压密码:www.ddosi.org

natpass部署方法

首先需要准备一张tls证书,推荐使用阿里云腾讯云的免费证书。

注:以下示例均在debian系统下进行,其他系统请自行查找相关系统命令, windows系统可通过services.msc命令进入系统服务管理面板进行服务管理。

server端部署

  1. 在服务器上下载并解压到任意目录
  2. 修改server.yaml配置文件,设置keycrt参数到你的证书所在路径
  3. 修改conf.d/conn.yaml配置文件,修改secret密钥,建议使用以下命令生成随机16位密钥
tr -dc A-Za-z0-9 < /dev/urandom|dd bs=16 count=1 2>/dev/null

使用以下命令将np-svr注册为系统服务,其中-conf参数后跟配置文件所在路径,-user参数后为程序启动身份(建议使用nobody身份启动)

sudo ./np-svr -conf server.yaml -action install -user nobody

将该服务设置为系统启动项,并启动服务

sudo systemctl enable np-svr sudo systemctl start np-svr

远端部署

在远端机器上下载并解压到任意目录

修改client.yaml配置文件,设置id为remote,设置server地址,并删除以下配置#include tunnel.d/*.yaml

修改conf.d/conn.yaml配置文件,修改secret密钥,该密钥必须与服务器端保持一致

使用以下命令将np-cli注册为系统服务,其中-conf参数后跟配置文件所在路径,-user参数后为程序启动身份(建议使用nobody身份启动)

sudo ./np-cli -conf server.yaml -action install -user nobody

将该服务设置为系统启动项,并启动服务

sudo systemctl enable np-cli sudo systemctl start np-cli

本地部署

  1. 在本地机器上下载并解压到任意目录
  2. 修改client.yaml配置文件,设置id为local,设置server地址
  3. 修改conf.d/conn.yaml配置文件,修改secret密钥,该密钥必须与服务器端保持一致
  4. 修改tunnel.d目录下的tunnel配置文件,tunnel配置方法
  5. 使用以下命令将np-cli注册为系统服务,其中-conf参数后跟配置文件所在路径,-user参数后为程序启动身份(建议使用nobody身份启动)
sudo ./np-cli -conf server.yaml -action install -user nobody

将该服务设置为系统启动项,并启动服务

sudo systemctl enable np-cli sudo systemctl start np-cli

tunnel隧道配置方法

所有隧道均为正向隧道,由连接发起方进行配置

tcp隧道

tcp隧道用于反向代理远程的任意服务,如rdp、ssh、http等

- name: rdp               # 链路名称
  target: that            # 目标客户端ID
  type: tcp               # 连接类型tcp或udp
  local_addr: 0.0.0.0     # 本地监听地址
  local_port: 3389        # 本地监听端口号
  remote_addr: 127.0.0.1  # 目标客户端连接地址
  remote_port: 3389       # 目标客户端连接端口号
  1. name: 该隧道名称,必须全局唯一
  2. target: 对端客户端ID
  3. type: tcp
  4. local_addr: 本地监听地址,如只允许局域网访问可绑定在局域网IP地址上
  5. local_port: 本地监听端口号
  6. remote_addr: 目标客户端连接地址,该地址为127.0.0.1时表示连接本机服务,也可连接局域网或广域网上的其他地址
  7. remote_port: 目标客户端连接端口号

shell隧道

shell隧道用于创建一个网页端的命令行操作页面

- name: shell             # 链路名称
  target: that            # 目标客户端ID
  type: shell             # web shell
  local_addr: 0.0.0.0     # 本地监听地址
  local_port: 8080        # 本地监听端口号
  #exec: /bin/bash        # 运行命令
                          # windows默认powershell或cmd
                          # 其他系统bash或sh
  env:                    # 环境变量设置
    - TERM=xterm
  1. name: 该隧道名称,必须全局唯一
  2. target: 对端客户端ID
  3. type: shell
  4. local_addr: 本地监听地址,如只允许局域网访问可绑定在局域网IP地址上
  5. local_port: 本地监听端口号
  6. exec: 连接建立成功后的启动命令
    • 指定该参数:直接使用设定的命令运行
    • linux系统:优先查找bash命令,若没有则查找sh命令,否则报错
    • windows系统:优先查找powershell命令,若没有则查找cmd命令,否则报错
  7. env: 进程启动时的环境变量设置

连接成功后即可使用浏览器访问local_port所对应的端口来创建shell隧道,

http://127.0.0.1:8080

shell隧道

linux命令行效果

natpass 新一代NAT内网穿透+shell+rdp工具

windows命令行效果

natpass 新一代NAT内网穿透+shell+rdp工具

iperf3压测对比

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

# natpass10路复用,读写均为1s超时
[ ID] Interval           Transfer     Bitrate         Retr
[  5]   0.00-60.00  sec  70.0 MBytes  9.79 Mbits/sec   22             sender
[  5]   0.00-60.02  sec  57.9 MBytes  8.10 Mbits/sec                  receiver

# frp10路复用stcp,tls
[ ID] Interval           Transfer     Bitrate         Retr
[  5]   0.00-60.00  sec  66.2 MBytes  9.26 Mbits/sec   31             sender
[  5]   0.00-60.10  sec  57.7 MBytes  8.05 Mbits/sec                  receiver

TODO

  1. 支持include的yaml配置文件
  2. 通用的connect、connect_response、disconnect消息
  3. 所有隧道的portal页面
  4. 文件传输
  5. web远程桌面
  6. 流量监控统计页面,server还是client?

Leave a Reply

您的电子邮箱地址不会被公开。 必填项已用 * 标注