Docker上怎么部署nps和npc实现内网穿透

本文讲解"Docker上如何部署nps和npc实现内网穿透",希望能够解决相关问题。

云主机上运行 nps

创建映射目录

mkdir -p ~/docker/nps/config

拉取镜像

docker pull oldiy/nps-server

运行容器 创建容器

docker run -d --name nps --net=host -v /root/docker/nps/config:/nps/conf oldiy/nps-server

现在 nps 已经开始运行了。

停止运行容器

docker stop nps

为什么这里要停止运行呢?

因为这时候在 config 目录下已经生成了一些配置文件,考虑到安全性,我们需要做一些改动。

修改配置

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

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

...
bridge_port=8024    # 客户端连接端口
...
web_username=admin  # 后台管理用户名
web_password=123    # 后台管理密码
web_port = 8080     # 后台管理端口
...

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

启动容器

docker start nps

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

添加客户端

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

Docker上怎么部署nps和npc实现内网穿透

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

Docker上怎么部署nps和npc实现内网穿透

设置好后点击 新增 即可。

Docker上怎么部署nps和npc实现内网穿透

留意一下这里的 id 和 vkey。

本地机上运行 npc

本地机建议选择一台 7*24 小时运行的设备,一般是路由器或者 NAS ,我这里就选择群晖了,DSM 有很好用的 docker 图形化管理套件,所以下面用图形化界面演示如何部署 npc 。

拉取镜像

点击菜单栏中的注册表,搜索 npc-client,下载第一个就行。

Docker上怎么部署nps和npc实现内网穿透

创建容器

点击菜单栏中的映像,找到下载好的npc,启动。

Docker上怎么部署nps和npc实现内网穿透

在高级设置->网络中注意勾选使用与 Docker Host 相同的网络。

Docker上怎么部署nps和npc实现内网穿透

再到高级设置->环境中修改两个环境变量:

SERVERIP

对应云主机的 <ip>:<bridge_port> VKEY

对应上面添加过的客户端的 vkey

Docker上怎么部署nps和npc实现内网穿透

接着一路点击 应用,启动容器即可。

这时候在 nps 后台可以看到客户端已经在线。

Docker上怎么部署nps和npc实现内网穿透

后台配置 nps

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

添加 tcp 隧道

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

Docker上怎么部署nps和npc实现内网穿透

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

Docker上怎么部署nps和npc实现内网穿透

然后点击 新增。

Docker上怎么部署nps和npc实现内网穿透

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

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

尝试访问一下 Jellyfin。

Docker上怎么部署nps和npc实现内网穿透

容器保活

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

创建目录

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

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

获取容器 ID

docker ps -q --no-trunc

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

如果你返回了多个 ID,那你应该知道要怎么区分那个是 nps 的。

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,别把以前配置的任务给覆盖了。

Docker的容器化技术为应用的部署和管理带来了很大的便利性,尤其是在内网穿透这种需要部署多个应用的场景下。

关于 "Docker上如何部署nps和npc实现内网穿透" 就介绍到此。希望多多支持编程教程

下一章:kubernetes认证鉴权内容有哪些

本文讲解"kubernetes认证鉴权内容有哪些",希望能够解决相关问题。kubeconfig文件的结构kubectl 作为操作 k8s 的一个客户端工具,只要为 kubectl 提供连接 apise ...