Save you from anything

0%

centos 7创建带参数的自启动服务

如何利用centos 7自带的service创建自启服务。

动机

我的梯子是自建的,用了v2ray+KCPTUN+udp2raw。其中v2ray是梯子的核心,没有使用奇奇怪怪的混淆。KCPTUN通过将KCP报文包裹在UDP中,并进行多倍发包以降低延迟和提高稳定性(因为UDP不需要握手),在晚高峰时效果拔群,代价就是流量多倍消耗,不过自建梯子的瓶颈通常都不是流量。

但是不少地方的运营商会对UDP数据包进行QOS(尤其是手机网络),当运营商间歇性QOS时,我的梯子也会间歇性抽风。因此我又在外面套了一层udp2raw,这个项目可以将UDP包伪装成TCP包,从而避免QOS。

这也是我为什么不使用v2的混淆的原因,就算真如某些小道消息所说,GFW能识别v2流量了,我也不觉得GFW能识别出UDP化再TCP化的v2流量,尤其是这么干的人非常少。

但是有一个问题,v2和KCPTUN都有现成的一键脚本,但是udp2raw偏小众,没有一键脚本,只能用shell运行,参数需要自己用 -XX、-XX的方式附加,自启也得自己搞定。我就是个linux菜鸡,只能去查cento 7的自启怎么配自启。

网上的教程一堆搬运来搬运去的洗稿教程,给我看麻了(尤其是CSDN)。centos 7的自启动服务管理方式和centos 6不一样,很多洗的稿根本没法用。另外,因为udp2raw的需要靠命令行在启动的时候附加参数(端口、模式、密码等),所以并不是简单地实现自启就行了。

最后还是自己搞定了,写一个教程备忘。

实现

通过centos 7自带的service创建一个启动服务即可,创建服务文件:

1
vim /etc/systemd/system/udp2raw.service

然后写入如下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[Unit]
# 服务名称
Description=udp2raw启动服务
# 在网络启动之后启动
After=network.target

[Service]
# 设置启动服务的类型
Type=simple

# 非正常退出时,自动重启
Restart=on-failure

# 指定被启动的程序的位置和参数(与在终端中运行一样)
ExecStart = /home/udp2raw/udp2raw_amd64 -s -l 0.0.0.0:1919 -r 127.0.0.1:810 --raw-mode faketcp -a -k XXXX

# 该进程死亡时的行为
# 以下代码表示会向所有子进程发送SIGTERM信号,再发送SIGKILL型号
KillSignal=SIGTERM
KillMode=mixed

[Install]
# 多用户模式
WantedBy=multi-user.target

保存之后刷新服务,并将其添加为自启动:

1
2
3
4
5
6
# 重新加载service依赖
systemctl daemon-reload
# 启动服务
systemctl start udp2raw.service
# 允许自启
systemctl enable udp2raw.service

一些其他的指令:

1
2
3
4
5
6
7
8
9
10
11
12
# 停止服务
systemctl stop udp2raw.service
# 重启服务
systemctl restart udp2raw.service
# 重新加载服务(重载参数,不会重启服务)
systemctl reload udp2raw.service
# 禁止自启
systemctl disable udp2raw.service
# 禁用服务(不能被其他服务唤醒,也不能用start启动)
systemctl mask udp2raw.service
# 解除服务禁用
systemctl unmask udp2raw.service

相关资料

关于服务创建的其他参数,可以去参考官方文档(以下链接不是centos的,但足够全):

Service unit configuration

Process killing procedure configuration