ubuntu上用systemd管理shadowsocks客户端
1 | 环境: |
0x00 shadowsocks
由于众所周知的原因,我们无法正常访问互联网,对一些职业比如程序员的工作造成了极大的障碍,所以学会科学上网是必须的。具体的方法比较多, 个人一直使用shadowsocks(以下简称ss). ss
上网原理如下图所示:
可见, ss
分为服务器和客户端两部分,为了能科学上网,需要先在远端部署代理服务器,然后在本地启动代理客户端,由客户端代理访问外网的流量。
0x01 服务器
个人在vultr上搭建了ss服务器
.
0x02 客户端
window和MacOS版本都比较好用,ubuntu下一直没找到比较好用的客户端。之前一直用shadowsocks-qt5,下载之后双击即可启动。但是无法(没找到方法)开机启动,每次系统重启都要手动开客户端,比较麻烦。今天在这个网站上看到ubuntu
下可以直接用apt
安装shadowsocks-libev
,决定试一下。
安装shadowsocks-libev
1 | $ sudo apt install shadowsocks-libev |
Note:
目前不太清楚shadowsocks与shadowsocks-libev的区别,有空再看吧。
systemd
systemd
的设计目标是,为系统的启动和管理提供一套完整的解决方案。主要用来管理守护进程.
关于systemd
,可以看一下耗子叔写的这篇LINUX PID 1 和 SYSTEMD以及阮一峰老师写的Systemd 入门教程.如有兴趣,可以继续深入探索。
使用apt
安装之后,shadowsock-libev
被systemd
自动接管.
参数配置
systemd
管理下的shadowsocks-libev
,配置文件路径为
1 | /etc/shadowsocks-libev/config.json |
编辑config.json
文件,写入自己的配置,比如:
1 | { |
启动客户端
apt安装shadowsocks-libev
之后,自动配置了如下的service
:
1 | shadowsocks-libev-local@.service |
看名字,觉得shadowsocks-libev-local@.service
应该是客户端服务,执行命令:
1 | systemctl start shadowsocks-libev-local@.service |
没想到报了以下错误:
1 | Failed to get properties: Unit name shadowsocks-libev-local@.service is neither a valid invocation ID nor unit name. |
2019-12-03 update
打开/lib/systemd/system/shadowsocks-libev-local@.service
, 加入user
, group
,修改ExecStart
为:
1 | ExecStart=/usr/bin/ss-local -c /etc/shadowsocks-libev/config.json |
修改后的/lib/systemd/system/shadowsocks-libev-local@.service
内容如下:
1 | # This file is part of shadowsocks-libev. |
重载service配置:
1 | systemctl daemon-reload |
启动ss-local
:
1 | systemctl start shadowsocks-libev-local@service |
查看shadowsocks-libev-local
状态:
1 | systemctl status shadowsocks-libev-local@service |
结果如下:
1 | ● shadowsocks-libev-local@service.service - Shadowsocks-Libev Custom Client Service for service |
颜色为绿,Active
为active(running)
,说明应该没问题了。
登录谷歌验证。
开机启动
执行下面命令,开机自动激活单元(服务).
1 | systemctl enable shadowsocks-libev-local@service |
0x03 小结
本文记录了用systemd
管理shadowsocks-libev
客户端时遇到的一些问题和解决办法。
其实很简答,修改/lib/systemd/system/shadowsocks-libev-local@.service
中部分内容即可。
通过本次折腾:
了解了
systemd
下systemdctl
和journalctl
部分命令的用法;验证了
/etc/init.d/
下的文件与systemd
系统无关。
0x04 参考文章
- ArchLinux - systemd (简体中文)
- LINUX PID 1 和 SYSTEMD
- Systemd 入门教程:命令篇
- start-stop-daemon 将程序作为守护进程启动
- 用start-stop-daemon将程序变为守护进程
全文完。
=====以下内容无效==========
不太知道怎么回事,试一下shadowsocks-libev.service
, 执行命令:
1 | systemctl start shadowsocks-libev.service |
发现可以启动成功,不过被启动的却是服务端程序. 执行获取状态命令:
1 | systemctl status shadowsocks-libev.service |
1 | ● shadowsocks-libev.service - Shadowsocks-libev Default Server Service |
根据status
返回结果,我们可以知道,systemd
在shadowsocks-libev.service
中,启动的是/user/bin/ss-server
. 那么我们将其修改成/user/bin/ss-local
不就行了。
service
的配置路径在哪里呢?再看一下status
返回结果中的loaded
一行,可以发现路径为:
1 | /lib/systemd/system/shadowsocks-libev.service |
打开service
文件:
1 | # This file is part of shadowsocks-libev. |
在[service]
下,我们看到启动命令是:
1 | ExecStart=/usr/bin/ss-server -c $CONFFILE $DAEMON_ARGS |
修改为
1 | ExecStart=/usr/bin/ss-local -c $CONFFILE $DAEMON_ARGS |
这样应该就可以了吧?not really!
是的。
=========作废分割线================
### start-stop-daemon
经过进一步调查研究,
systemd
管理守护进程与/etc/init.d/shadowsocks-libev
没有直接关系,本节作废。
[service]
下有一行是EnvironmentFile=/etc/default/shadowsocks-libev
,打开这个文件,我们看到:
1 | # Defaults for shadowsocks initscript |
注意,这里注释中有一句:
1 | # sourced by /etc/init.d/shadowsocks-libev |
打开/etc/init.d/shadowsocks-libev
, 其中有一行是:
1 | DAEMON=/usr/bin/ss-server # Introduce the server's location here |
可见这个脚本中可执行程序还是配置为了/usr/bin/ss-server
, 将其改为ss-local
:
1 | DAEMON=/usr/bin/ss-local # Introduce the server's location here |
仔细阅读/etc/init.d/shadowsocks-libev
,发现实际上启动shadowsocks-libev
守护进程的是case
中的start)
中的do_start
函数:
1 | case "$1" in |
do_start
函数如下:
1 | do_start() |
可得出来,do_start
中实际干活的是start-stop-daemon
命令。
start-stop-daemon 为系统自带函数,可以将普通程序以守护进程 方式运行.
看了下自己的
/etc/init.d
目录,发现redis, docker, mysql
等知名软件都是用start-stop-daemon
命令启动管理的。
========作废分割线=============
启动shadowsocks-libev.service
到这里,将shadowsocks-libev
中可执行目标程序的/usr/bin/ss-server
换成/usr/bin/ss-local
的目标就完成了。执行start
:
1 | systemctl start shadowsocks-libev |
查看服务状态
1 | systemctl status shadowsocks-libev |
1 | ● shadowsocks-libev.service - Shadowsocks-libev Default local Service |
Active
为绿色,值为active (running)
访问谷歌测试,一切ok.
0x03 小结
本文记录了用systemd
管理shadowsocks-libev
客户端时遇到的一些问题和解决办法。
总的来说,修改/lib/systemd/system/shadowsocks-libev.service
文件中下处内容即可直接用shadowsocks-libev.service
启动ss-local
:
1 | ExecStart=/usr/bin/ss-server -c $CONFFILE $DAEMON_ARGS |
可能在ubuntu下运行客户端存在更简单直接的方法,如果您知道,请不吝告知,谢谢~~
完结。