翼度科技»论坛 云主机 LINUX 查看内容

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

10

主题

10

帖子

30

积分

新手上路

Rank: 1

积分
30
https://www.cnblogs.com/yeungchie/
云主机上运行 nps

创建映射目录
  1. mkdir -p ~/docker/nps/config
复制代码
拉取镜像
  1. docker pull oldiy/nps-server
复制代码
运行容器

创建容器
  1. docker run -d --name nps --net=host -v /root/docker/nps/config:/nps/conf oldiy/nps-server
复制代码
现在 nps 已经开始运行了。
停止运行容器
  1. docker stop nps
复制代码
为什么这里要停止运行呢?
因为这时候在 config 目录下已经生成了一些配置文件,考虑到安全性,我们需要做一些改动。
修改配置
  1. vim /root/docker/nps/config/nps.conf
复制代码
打开后重点关注下面这几项:
  1. ...
  2. bridge_port=8024    # 客户端连接端口
  3. ...
  4. web_username=admin  # 后台管理用户名
  5. web_password=123    # 后台管理密码
  6. web_port = 8080     # 后台管理端口
  7. ...
复制代码
以上是默认的配置,建议改掉。
启动容器
  1. docker start nps
复制代码
现在可以在网页端访问 :,并通过用户名  和密码  登录后台管理界面了。
能够成功访问后,继续下面的步骤。
添加客户端

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

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

设置好后点击 新增 即可。

留意一下这里的 id 和 vkey。
本地机上运行 npc

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

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

创建容器

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

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

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

  • SERVERIP
    对应云主机的 :
  • VKEY
    对应上面添加过的客户端的 vkey

接着一路点击 应用,启动容器即可。
这时候在 nps 后台可以看到客户端已经在线。

后台配置 nps

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

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


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

然后点击 新增。

这样一条隧道就添加好了。
至此内网穿透算是部署好了。
尝试访问一下 Jellyfin。

容器保活

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

创建目录来存放脚本和日志文件。
  1. mkdir -p /root/docker/nps/script
  2. mkdir -p /root/docker/nps/log
复制代码
获取容器 ID
  1. docker ps -q --no-trunc
复制代码
会得到一长串 ID,记下来 。
如果你返回了多个 ID,那你应该知道要怎么区分那个是 nps 的。
keepActive.sh

创建 bash 脚本,放到 /root/docker/nps/script/keepActive.sh
  1. #!/bin/bash
  2. cur=$(cd $(dirname $0); pwd -P)
  3. log="$cur/../log/log"
  4. a=$(docker ps -q --no-trunc | grep '<nps_id>')  # 这里其实就是去匹配看看当前运行中的容器有没有nps,<nps_id>改成上一步获取到的。
  5. if [[ "_$a" == "_" ]]; then
  6.     docker restart nps  # 第一次重启 nps
  7.     if [[ $? == 0 ]]; then
  8.         echo "Revive  $(date +'%F %T')" >> $log
  9.     else
  10.         echo "Failed  $(date +'%F %T')" >> $log
  11.         systemctl restart docker.service  # 重启失败大概率是 docker 服务挂了,这里重启服务
  12.         docker restart nps
  13.         echo "Restart $(date +'%F %T')" >> $log
  14.     fi
  15. else
  16.     echo "Active  $(date +'%F %T')" >> $log
  17. fi
复制代码
如果是服务 docker 挂了,且重启失败,那就不是保不保活的问题了,登上服务器检查吧。
crontab.set

创建一个 crontab.set,用来配置定时任务。这个文件就随便放了,一次性的。
  1. SHELL=/bin/bash
  2. PATH=/sbin:/bin:/usr/sbin:/usr/bin
  3. MAILTO=root
  4. *  *  *  *  * /root/docker/nps/script/keepActive.sh
复制代码
接着运行:
  1. crontab crontab.set
复制代码
这里是配置一分钟运行一次 keepActive.sh 脚本,所以如果 nps 挂了,一分钟内它就会重启了。
如果你还配置了其他的定时任务,那你应该知道怎么设置 crontab,别把以前配置的任务给覆盖了。

来源:https://www.cnblogs.com/yeungchie/p/17347921.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具