告别内网穿透突然失联——使用supervisor运行多个nps客户端
从2017开始折腾内网穿透到现在,根据我的使用场景,突然失联比降速更令人绝望。所以使用的内网穿透工具都是中心服务器转发类型的,比如nps。大流量场景才用p2p模式的内网穿透工具,比如zerotier和tailscale这类。
去年电信开始回收家宽的免费公网ipv4,如果要公网ipv4就需要花钱租用,100/月。非常没有性价比,100一个月只能租用一个动态公网ipv4。于是又花400租了一年30mbps带宽的4核8g轻量云,加上6mbps的腾讯轻量云,手上有两台服务器。我在这两个服务器都安装了nps服务端,就算一台服务器出问题了,我还可以通过另外一台服务器进行穿透。
内网中有一个openwrt,其中的npc插件只允许连接一个服务器。本来想使用docker的方式运行多个npc连接多个服务器的。但是这个版本openwrt年代久远,没有集成docker插件自行安装又缺少部分内核模块,本身也配置了很多为内网穿透和远程组网的转发规则迁移太复杂。
那只能手动让npc客户端自己后台运行了!
一般情况下,linux终端运行的程序会在终端关闭后也会被关闭。这个时候就可以通过supervisor这个工具来实现,开机自动启动,后台运行等功能。
supervisor这个工具是使用python3写的,所以需要给openwrt安装python3和python3-pip。
先用下面的命令安装python3和python3-pip。
opkg update
opkg install curl
opkg install python3
然后用下面的命令安装supervisor
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
python3 get-pip.py
pip install supervisor
用下面的命令配置supervisor配置文件
mkdir -p /etc/supervisor/conf.d
cd /etc/supervisor/
/usr/bin/echo_supervisord_conf > ./supervisord.conf
找到下面的选项并修改,如果配置语句前面面有“;”需要删除已解除忽略。
#如果为true,则从前台启动
nodaemon=true
#配置外部文件加载路径
[include]
files = /etc/supervisor/conf.d/*.conf
新建一个服务,使得supervisor可以跟随openwrt系统启动。
vi /etc/init.d/supervisord
复制下面的内容
#!/bin/sh /etc/rc.common
# Start/stop/restart supervisor in OpenWrt.
START=91
STOP=15
USE_PROCD=1
BINLOADER_BIN="/usr/bin/supervisord"
start_service() {
procd_open_instance
procd_set_param respawn
procd_set_param command "$BINLOADER_BIN" -c /etc/supervisor/supervisord.conf
procd_set_param stdout 1
procd_set_param stderr 1
procd_close_instance
}
stop_service() {
procd_kill "$BINLOADER_BIN"
}
restart() {
stop
start
}
使用下面的命令配置自启动并启动supervisord。
chmod +x /etc/init.d/supervisord
/etc/init.d/supervisord enable
/etc/init.d/supervisord start
编辑 supervisor 配置文件让npc后台运行,下面是supervisor 配置文件的简单模版,可以配置多个
program在同一个配置文件中。
[program:npcsz-01]
##配置工作目录为/root/npc,这是我存储npc程序的地方
directory=/root/npc
##npc启动命令和参数
command=/root/npc/npc -server=1.1.1.1:8024 -vkey=1234456780
##自动启动
autostart=true
autorestart=true
##日志
stderr_logfile=/var/log/npcsz-01.log
stdout_logfile=/var/log/npcsz-01.log
使用下面的命令让supervisor更新配置
supervisorctl update
使用下面的命令查看supervisor工作状态
supervisorctl status
可以看到npc客户端已经启动
登录nps后台可以看到新客户端已经上线
下面是supervisor的常用操作命令
输入命令 supervisorctl 进入 supervisorctl 的 shell 交互界面
help # 查看帮助
status # 查看程序状态
stop program_name # 关闭 指定的程序
start program_name # 启动 指定的程序
restart program_name # 重启 指定的程序
tail -f program_name # 查看 该程序的日志
update # 重启配置文件修改过的程序(修改了配置,通过这个命令加载新的配置)
也可以直接通过 shell 命令操作:
supervisorctl status
supervisorctl update