云主機上運行 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> 登錄后臺管理界面了。
能夠成功訪問后,繼續下面的步驟。
添加客戶端
點擊左側菜單欄的 客戶端 選項,再點擊新增。

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

設置好后點擊 新增 即可。

留意一下這里的 id 和 vkey。
本地機上運行 npc
本地機建議選擇一臺 7*24 小時運行的設備,一般是路由器或者 NAS ,我這里就選擇群暉了,DSM 有很好用的 docker 圖形化管理套件,所以下面用圖形化界面演示如何部署 npc 。
拉取鏡像
點擊菜單欄中的注冊表,搜索 npc-client,下載第一個就行。

創建容器
點擊菜單欄中的映像,找到下載好的npc,啟動。

在高級設置->網絡中注意勾選使用與 Docker Host 相同的網絡。

再到高級設置->環境中修改兩個環境變量:
SERVERIP
對應云主機的 <ip>:<bridge_port> VKEY
對應上面添加過的客戶端的 vkey

接著一路點擊 應用,啟動容器即可。
這時候在 nps 后臺可以看到客戶端已經在線。

后臺配置 nps
前面部署 nps 時候已經配置了一部分了,接下來要配置的就是具體需要穿透的端口了。
添加 tcp 隧道
這里舉例配置一下 Jellyfin 的 http 端口 8096。
進入 nps 后臺管理,點擊左側菜單欄的 客戶端 選項,再點擊新增。

類型
這里選 tcp 不用動它。 備注
隨便填,方便自己記就行。 服務器端口
指外放訪問端口,我這里跟 Jellyfin 內網一致了,這里只是為了演示用默認,等下就會改掉。 目標
指內網對應服務的地址和端口。 客戶端 id
就是上面我說了要留意一下的 id,我這里是 3。

然后點擊 新增。

這樣一條隧道就添加好了。
至此內網穿透算是部署好了。
嘗試訪問一下 Jellyfin。

容器保活
有時候運行的容器會自己掛掉,雖然不經常發生,但是偶爾來一次,遇上剛好要用的時候就很煩人。
下載演示我在服務端如何讓容器保活的,方法比較粗暴但有效。
創建目錄
創建目錄來存放腳本和日志文件。
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實現內網穿透,通過容器的隔離性和安全性,可以有效地保護應用的安全性。同時,Docker的易用性和可擴展性也為應用的管理和維護帶來了很大的便利性。






