天天看點

[ 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,别把以前配置的任務給覆寫了。