[ Docker ] 部署 nps 和 npc 實現內網穿透

YEUNGCHIE發表於2023-04-23

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

現在可以在網頁端訪問 <ip_addr>:<web_port>,並透過使用者名稱 <web_username> 和密碼 <web_password> 登入後臺管理介面了。
能夠成功訪問後,繼續下面的步驟。

新增客戶端

點選左側選單欄的 客戶端 選項,再點選新增。

image

設定一個 客戶端驗證金鑰,這裡可以隨便填。壓縮、加密願意的話也可以選 yes。

image

設定好後點選 新增 即可。

image

留意一下這裡的 idvkey

本地機上執行 npc

本地機建議選擇一臺 7*24 小時執行的裝置,一般是路由器或者 NAS ,我這裡就選擇群暉了,DSM 有很好用的 docker 圖形化管理套件,所以下面用圖形化介面演示如何部署 npc 。

拉取映象

點選選單欄中的登錄檔,搜尋 npc-client,下載第一個就行。

image

建立容器

點選選單欄中的映像,找到下載好的npc,啟動。

image

高階設定->網路中注意勾選使用與 Docker Host 相同的網路。

image

再到高階設定->環境中修改兩個環境變數:

  • SERVERIP
    對應雲主機的 <ip>:<bridge_port>
  • 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,記下來 <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,別把以前配置的任務給覆蓋了。

相關文章