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


    https://www.cnblogs.com/yeungchie/

    云主机上运行 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
    

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

    添加客户端

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

    image

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

    image

    设置好后点击 新增 即可。

    image

    留意一下这里的 idvkey

    本地机上运行 npc

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

    拉取镜像

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

    image

    创建容器

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

    image

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

    image

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

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

    image

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

    这时候在 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

    docker ps -q --no-trunc
    

    会得到一长串 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,改成上一步获取到的。
    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,别把以前配置的任务给覆盖了。

  • 相关阅读:
    欧拉计划第265题:二进制圈
    SQL之数据库连接
    Chrome自动播放限制策略
    泛微E-Cology CheckServer.jspSQL注入漏洞(QVD-2023-9849) 复现
    角点检测与SIFT
    【unity实战】unity3D中的PRG库存系统和换装系统(附项目源码)
    进程的概念、组成、特征、组织
    常见分词算法综述
    全排列与组合
    【Python数据结构与算法】--- 递归算法应用-五行代码速解汉诺塔问题.
  • 原文地址:https://www.cnblogs.com/yeungchie/p/17347921.html