[ Docker ] 部署 nps 和 npc 实现内网穿透
https://www.cnblogs.com/yeungchie/
nps 原作者已停止维护,现在用 yisier1/nps
云主机上运行 nps
创建目录
mkdir -p /root/docker/nps
mkdir /root/repo
下载必要文件
Docker 镜像
docker pull yisier1/nps
Git 仓库
git clone https://github.com/yisier/nps.git /root/repo
cp -r /root/repo/nps/conf /root/docker/nps/config
修改配置
vim /root/docker/nps/config/nps.conf
打开后重点关注下面这几项:
bridge_port=8024 # 客户端连接端口
web_username=admin # 后台管理用户名
web_password=123 # 后台管理密码
web_port=8080 # 后台管理端口
以上是默认的配置,建议改掉。
运行容器
docker run -d --restart=always --name nps --net=host -v /root/docker/nps/config:/conf -v /etc/localtime:/etc/localtime:ro yisier1/nps
现在 nps 已经开始运行了。
现在可以在网页端访问 <ip_addr>:<web_port>
,并通过用户名 <web_username>
和密码 <web_password>
登录后台管理界面了。
能够成功访问后,继续下面的步骤。
添加客户端
点击左侧菜单栏的 客户端
选项,再点击新增。
设置一个 客户端验证密钥
,这里可以随便填。压缩、加密愿意的话也可以选 yes。
设置好后点击 新增
即可。
留意一下这里的 id
和 vkey
。
本地机上运行 npc
本地机建议选择一台 7*24 小时运行的设备,一般是路由器或者 NAS。
下载必要文件
Docker 镜像
docker pull yisier1/npc
创建容器
docker run -d --restart=always --name npc --net=host yisier1/npc -server=$ip:$ridge_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 -a --no-trunc | perl -alne 'print $F[0] if /\bnps$/'
会得到一长串 ID,记下来 <nps_id>
。
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,别把以前配置的任务给覆盖了。