背景
略
方案
利用ssh隧道的常规和加密特点,不易被封堵;采用nps在服务端灵活管理穿透。
- 采用docker-compose部署autossh,维持稳定的ssh隧道,建立本地端口转发。
- 采用docker-compose部署npc,通过ssh隧道连接到nps端。
- 在NPS灵活的创建管理穿透服务(frp在服务端管理不够灵活)。
步骤
docker安装部署
略
部署autossh服务+NPC客户端
- 生成 ed25519 密钥(现代算法,安全性高,密钥短小,推荐优先使用)
ssh-keygen -t ed25519 -C "[email protected]"
- 将~/.ssh/id_ed25519.pub内容添加到nps服务端的authorized_keys中
- 创建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端徐需先创建一个客户端
- 运行autossh.yaml文件
docker compose -f autossh.yaml up -d
- 验证 在穿透客户端上执行,查看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/
💬