oflyhigh avatar

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

oflyhigh

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

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

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

image.png
(图源 :pixabay)

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

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

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

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

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

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

ssh -D *:1234 -C -N -f -p vps_port testuser1@x.x.x.x

换成autossh,就是这个样子:

autossh -M 0 -f -N -D *:1234 -C -p 5323 testuser1@x.x.x.x

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

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

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

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

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

以下是操作详情。

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

SSH转发

本地创建密钥:

ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

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

ssh-copy-id -i ~/.ssh/id_rsa.pub testuser1@x.x.x.x

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

ssh -D *:1234 -C -N -f -p vps_port testuser1@x.x.x.x

AutoSSH

安装autossh:

sudo apt install autossh

测试SSH转发:

autossh -M 0 -f -N -D *:1234 -C -p 5323 testuser1@x.x.x.x

用户模式服务

创建对应目录:

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 testuser1@x.x.x.x
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转发指令,每天又省了好几秒钟,好开心呀。

相关链接

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

Written by

Programmer, Maker, Freelancer, Witness. Make friends, Make money, Make life better!

Read more #cn posts


Best Posts From oflyhigh

We have not curated any of oflyhigh's posts yet. But you can encourage our curation team to review posts by visiting them regularly and by referring other readers. Because we give priority to frequently read content.

More Posts From oflyhigh