每天又省好几秒:一直在线的内网专用socks代理机 & enable-linger

还记得我在好久之前写过一篇文章《每天进步一点点:使用SSH转发将树莓派改造成内网专用socks代理机》,话说这个代理机确实解决了很多问题,比如编译hived时下载代码慢等等。

image.png
(图源 :pixabay)

但是这个内网专用代理机有个问题,就是无法保证一直在线,比如主机重启、SSH掉线、网络波动等等,都会导致socks代理掉线,需要我手工执行指令去重连。

而随着年纪增长,记忆力又不太好,每次去重连,我都要去找之前用的是啥指令,烦不胜烦!

于是我就想,有没有一种一劳永逸的方法,让我的代理机的socks代理一直在线呢?无论是我重启树莓派、SSH掉线、网络中断又重连,都不会影响到它。

那样岂不是每天省了好几秒的时间,要知道一寸光阴一寸金,经年累月算下来,岂不是相当于赚到了很多黄金。

原本想自己写程序来实现SSH转发的监控、重启等机制,后来经过我一番探索,autossh就是现成又强壮的解决方案呀。

还记得我们之前的转发指令嘛?

ssh -D *:1234 -C -N -f -p vps_port [email protected]

换成autossh,就是这个样子:

autossh -M 0 -f -N -D *:1234 -C -p 5323 [email protected]

其中的一些参数的详细解释可以参考之前的文章。

如果配合screen到这里已经解决了我之前方案的诸多问题,比如SSH掉线、网络波动等等,autossh会帮我监测这些问题,遇到问题时自动重连。

但是这样还不够完美,比如我重启树莓派,那么就需要我重新登陆树莓派,重新执行screen,再执行上述指令,嗯,有那么一点点不够优雅。

于是我想到或许可以把这个操作弄成一个随系统自动启用的服务,这样就不怕重启了。

但是我又不想直接做成root权限下的服务,或者弄成用户模式下的更安全一些?嗯,反正应该弊端更小一些吧。经过我一番磕磕绊绊的尝试,最终终于实现我想要的目标,让树莓派内网socks代理机一直在线。

以下是操作详情。

方案:SSH转发+AutoSSH+用户模式下的服务+ enable-linger

SSH转发

本地创建密钥:

ssh-keygen -t rsa -b 4096 -C "[email protected]"

安装对应公钥到远程主机(或者采取复制公钥的方式):

ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]

使用如下指令测试SSH转发:

ssh -D *:1234 -C -N -f -p vps_port [email protected]

AutoSSH

安装autossh:

sudo apt install autossh

测试SSH转发:

autossh -M 0 -f -N -D *:1234 -C -p 5323 [email protected]

用户模式服务

创建对应目录:

mkdir -p ~/.config/systemd/user

编辑相应的配置文件:

vi ~/.config/systemd/user/socks-autossh.service

写入相应内容:

[Unit]
Description=User-level autossh SOCKS proxy
After=network-online.target
Wants=network-online.target

[Service]
Environment="AUTOSSH_GATETIME=0"
Environment="AUTOSSH_POLL=30"
Environment="AUTOSSH_LOGLEVEL=1"
ExecStart=/usr/bin/autossh -M 0 -N -D 0.0.0.0:1234 -C -p 5323 [email protected]
Restart=always
RestartSec=3

[Install]
WantedBy=default.target

启用服务

systemctl --user daemon-reload
systemctl --user enable --now socks-autossh

测试OK。

enable-linger

我们的目标是面对各种掉线、离线、重启问题时,转发服务都能自动重新启动,一直在线。

但是完成上述诸多操作后,发现重启后,用户服务不自动启动,需要我登陆用户后,才能正常,这就尴尬了,莫非我还是要每次登陆一下?这样我折腾半天的意义又何在呢?

于是又开始着手攻克这个难题,好在功夫不负有心人,终于让我找到解决方案,那就是执行以下指令:

sudo loginctl enable-linger socksuser

简单来讲就是一般来讲用户的 systemd 服务仅在该用户登录期间有效,用户退出登录或者尚未登录期间,用户的 systemd 服务会自动退出/不会自动启动。

而上述指令,启用用户linger,就是允许相应用户的 systemd 服务在该用户登出后(或尚未登陆)保持运行

以下内容来自loginctl指令帮助信息

Enable/disable user lingering for one or more users. If enabled for a specific user, a user manager is spawned for the user at boot and kept around after logouts. This allows users who are not logged in to run long-running services.

哇哇哇,又学到新技能啦,好开心。

children-593313_960_720.jpg
(图源 :pixabay)

经过上述组合拳,我的内网专用socks代理机愈发完美啦,以后再也不用特意去登陆,去执行SSH转发指令,每天又省了好几秒钟,好开心呀。

相关链接

Sort:  

牛(òωó)👍不明觉厉!

表妹过奖了

怎么什么都会啊

不是什么都会哦
是遇到问题下苦功学习😀

作为一名文科生,我根本看不懂。但我的努力跟上哥的脚步👣

加油💪

O哥每天都是头脑风暴

O哥好厉害,一直在发现问题解决问题的路上

👍👍👍