背景

方案

利用ssh隧道的常规和加密特点,不易被封堵;采用nps在服务端灵活管理穿透。

  1. 采用docker-compose部署autossh,维持稳定的ssh隧道,建立本地端口转发。
  2. 采用docker-compose部署npc,通过ssh隧道连接到nps端。
  3. 在NPS灵活的创建管理穿透服务(frp在服务端管理不够灵活)。

步骤

docker安装部署

部署autossh服务+NPC客户端

  1. 生成 ed25519 密钥(现代算法,安全性高,密钥短小,推荐优先使用)
ssh-keygen -t ed25519 -C "[email protected]"
  1. 将~/.ssh/id_ed25519.pub内容添加到nps服务端的authorized_keys中
  2. 创建autossh.yaml文件
version: '3.7'

services:
  # 本地端口18024转发
  ssh-local-forward:
    image: jnovack/autossh
    container_name: autossh-local-forward
    environment:
      - SSH_REMOTE_USER=autossh #nps服务端用户名,前面的公钥需要添加到该用户名下
      - SSH_REMOTE_HOST=nps服务端IP #nps服务端IP
      - SSH_REMOTE_PORT=50322 #nps服务端ssh端口,默认22
      - SSH_BIND_IP=0.0.0.0
      - SSH_TUNNEL_PORT=18024 #与模式配合的隧道端口
      - SSH_TARGET_HOST=127.0.0.1 #目标服务IP
      - SSH_TARGET_PORT=18024 # 目标服务端口
      - SSH_MODE=-L # -L 本地端口转发
    restart: always
    ports:
      - "127.0.0.1:18024:18024" #只在宿主机可访问
    volumes:
      - /root/.ssh/id_ed25519:/id_rsa #autossh容器使用宿主机的密钥
  
  # 通过本地18024端口,连接NPS服务
  npc:
    image: ffdfgdfg/npc
    container_name: npc
    depends_on:
      - ssh-local-forward
    restart: always
    network_mode: "host" # 使用宿主机网络,nps服务端创建隧道后天然可访问,无需映射端口
    command:
      - -server=127.0.0.1:18024
      - -vkey=nps端验证密钥 #nps端徐需先创建一个客户端
  1. 运行autossh.yaml文件
docker compose -f autossh.yaml up -d
  1. 验证 在穿透客户端上执行,查看18024端口是否监听
netstat -tlnp | grep 18024
tcp 0 0 127.0.0.1:18024  0.0.0.0:*  LISTEN  232270/docker-proxy

在NPS服务端查看客户端连接状态

参考资料:

https://blog.skyju.cc/post/nps-frp-over-v2ray/ https://github.com/ehang-io/nps https://github.com/jnovack/autossh https://github.com/ffdfgdfg/npc https://logan.tw/posts/2015/11/15/autossh-and-systemd-service/