[ Docker ] 部署 nps 和 npc 实现内网穿透

news/2024/6/3 18:23:05 标签: docker, 容器, 运维

nps 原作者已停止维护,现在用 yisier1/nps

云主机上运行 nps

创建目录

mkdir -p /root/docker/nps
mkdir /root/repo

下载必要文件

docker-镜像">Docker 镜像

docker pull yisier1/nps

Git 仓库

git clone https://github.com/yisier/nps.git /root/repo
cp -r /root/repo/nps/conf /root/docker/nps/config

修改配置

vim /root/docker/nps/config/nps.conf

打开后重点关注下面这几项:


bridge_port=8024    # 客户端连接端口

web_username=admin  # 后台管理用户名
web_password=123    # 后台管理密码
web_port=8080       # 后台管理端口

以上是默认的配置,建议改掉。

容器">运行容器

docker run -d --restart=always --name nps --net=host -v /root/docker/nps/config:/conf -v /etc/localtime:/etc/localtime:ro yisier1/nps

现在 nps 已经开始运行了。

现在可以在网页端访问 <ip_addr>:<web_port>,并通过用户名 <web_username> 和密码 <web_password> 登录后台管理界面了。
能够成功访问后,继续下面的步骤。

添加客户端

点击左侧菜单栏的 客户端 选项,再点击新增。

image

设置一个 客户端验证密钥,这里可以随便填。压缩、加密愿意的话也可以选 yes。

image

设置好后点击 新增 即可。

image

留意一下这里的 id 和 vkey

本地机上运行 npc

本地机建议选择一台 7*24 小时运行的设备,一般是路由器或者 NAS。

下载必要文件

docker-镜像-1">Docker 镜像

docker pull yisier1/npc

容器">创建容器

docker run -d --restart=always --name npc --net=host yisier1/npc -server=$ip:$ridge_port -vkey=$vkey

服务端功能创建运行后,在 nps 后台可以看到客户端已经在线。

image

后台配置 nps

前面部署 nps 时候已经配置了一部分了,接下来要配置的就是具体需要穿透的端口了。

添加 tcp 隧道

这里举例配置一下 Jellyfin 的 http 端口 8096
进入 nps 后台管理,点击左侧菜单栏的 客户端 选项,再点击新增。

image

  • 类型
    这里选 tcp 不用动它。
  • 备注
    随便填,方便自己记就行。
  • 服务器端口
    指外放访问端口,我这里跟 Jellyfin 内网一致了,这里只是为了演示用默认,等下就会改掉。
  • 目标
    指内网对应服务的地址和端口。
  • 客户端 id
    就是上面我说了要留意一下的 id,我这里是 3

image

然后点击 新增

image

这样一条隧道就添加好了。

至此内网穿透算是部署好了。

尝试访问一下 Jellyfin。

image

容器保活">容器保活

有时候运行的容器会自己挂掉,虽然不经常发生,但是偶尔来一次,遇上刚好要用的时候就很烦人。
下面演示我在服务端如何让容器保活的,方法比较粗暴但有效。

创建目录

创建目录来存放脚本和日志文件。

mkdir -p /root/docker/nps/script
mkdir -p /root/docker/nps/log

容器-id">获取容器 ID

docker ps -a --no-trunc | perl -alne 'print $F[0] if /\bnps$/'

会得到一长串 ID,记下来 <nps_id>

keepActive.sh

创建 bash 脚本,放到 /root/docker/nps/script/keepActive.sh

#!/bin/bash
cur=$(cd $(dirname $0); pwd -P)
log="$cur/../log/log"
a=$(docker ps -q --no-trunc | grep '<nps_id>')  # 这里其实就是去匹配看看当前运行中的容器有没有nps,<nps_id>改成上一步获取到的。
if [[ "_$a" == "_" ]]; then
    docker restart nps  # 第一次重启 nps
    if [[ $? == 0 ]]; then
        echo "Revive  $(date +'%F %T')" >> $log
    else
        echo "Failed  $(date +'%F %T')" >> $log
        systemctl restart docker.service  # 重启失败大概率是 docker 服务挂了,这里重启服务
        docker restart nps
        echo "Restart $(date +'%F %T')" >> $log
    fi
else
    echo "Active  $(date +'%F %T')" >> $log
fi

如果是服务器 docker 挂了,且重启失败,那就不是保不保活的问题了,登上服务器检查吧。

crontab.set

创建一个 crontab.set,用来配置定时任务。这个文件就随便放了,一次性的。

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

*  *  *  *  * /root/docker/nps/script/keepActive.sh

接着运行:

crontab crontab.set

这里是配置一分钟运行一次 keepActive.sh 脚本,所以如果 nps 挂了,一分钟内它就会重启了。

如果你还配置了其他的定时任务,那你应该知道怎么设置 crontab,别把以前配置的任务给覆盖了。 


http://www.niftyadmin.cn/n/4934373.html

相关文章

为什么vue3 watch不能直接监听对象属性值

1.因为不能确定是哪个对象的值&#xff0c;假如多个监听对象有相同的值&#xff0c;这样产生不必要的歧义和麻烦 const person reactive({ name : person }) const car reactive({ name : car }) watch( person.name, () > {console.log(ohoh) }) 显然watch得到是一…

网络:路由

1. 路由器 路由器工作在三层&#xff0c;每个接口都处于不用的网段中&#xff0c;即不同的广播域。但大多情况下&#xff0c;两台路由器直接相连的接口是同一个广播域&#xff0c;即一个网段。 路由器具有判断网络地址和选择路径的功能&#xff0c;能在多网络互联的环境中&…

【C#】判断打印机共享状态

打印机共享状态 /// <summary>/// 打印机共享状态/// </summary>public enum PrinterShareState{/// <summary>/// 无打印机/// </summary>None -1,/// <summary>/// 未共享/// </summary>NotShare 0,/// <summary>/// 已共享/// …

LabVIEW开发图像采集和基于颜色的隔离

LabVIEW开发图像采集和基于颜色的隔离 在当今的工业和工厂中&#xff0c;准确性和精度是决定特定行业生产力的两个重要关键点。为了优化生产力&#xff0c;各行各业正在从手动操作转向自动操作和控制。机器人技术在工业过程中的出现为人类提供了机械辅助。机器视觉在工业机器人…

MySQL相关的SQL语句、数据库、数据表、字段、类型

文章目录 前言MySQL整数类型MySQL字符串类型MySQL小数类型MySQL时间类型常用的基本SQL语句详细内容数据库的概念SQL常用的3个部分SQL与JAVA的数据类型对比链接数据库查看数据库列表创建数据库删除数据库创建数据时设置编码修改数据库编码进入或切换数据库显示当前数据库信息查看…

【Spring Boot】夺名连环问(持续更新ing)

Spring的了解与特性 简单介绍&#xff1a;快速开发Spring项目的脚手架。简化Spring应用的初始搭建以及开发过程。 特性 提供了很多内置的Starter结合自动配置&#xff0c;对主流框架的无配置集成、开箱即用。即不需要自己去引入很多依赖。 并且管理了常用的第三方依赖的版本&…

eNSP 实现 CLI 窗口叠放

文章目录 1 问题截图2 问题解决3 扩展3.1 打开所有 CLI3.2 CLI&#xff1a;Command line interface 1 问题截图 问题描述&#xff1a;命令行窗口是分开的&#xff0c;找对应的窗口太麻烦了 2 问题解决 解决办法&#xff1a;点下图控件即可。 效果展示&#xff1a; 3 扩展 …

Java中声明,定义,分配内存,初始化,赋值,是啥?

一. 声明&#xff0c;定义和分配内存 在Java中&#xff0c;声明和定义是同一个意思&#xff0c;不做区分。下面这些都是声明&#xff08;定义&#xff09;一个变量。 栈&#xff1a;存放局部变量&#xff08;包括基本数据类型的变量和对象的引用&#xff09; 堆&#xff1a;存…