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

(图源 :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.
哇哇哇,又学到新技能啦,好开心。

(图源 :pixabay)
经过上述组合拳,我的内网专用socks代理机愈发完美啦,以后再也不用特意去登陆,去执行SSH转发指令,每天又省了好几秒钟,好开心呀。
相关链接
- 每天进步一点点:使用SSH转发将树莓派改造成内网专用socks代理机
- 每天进步一点点:使用密钥登录远程SSH账户(Linux版)
- Autossh for keeping ssh tunnels alive.
- Automating Secure Connections with SSH Tunnels
- https://manpages.ubuntu.com/manpages/noble/man1/loginctl.1.html
- Lingering Services -- How to prevent systemd from killing my processes after I log off?
牛(òωó)👍不明觉厉!
表妹过奖了
怎么什么都会啊
不是什么都会哦
是遇到问题下苦功学习😀
作为一名文科生,我根本看不懂。但我的努力跟上哥的脚步👣
加油💪
O哥每天都是头脑风暴
O哥好厉害,一直在发现问题解决问题的路上
👍👍👍