目录
CentOS/RHEL/Fedora (firewalld):
设置IP地址
命令设置
查看现有连接
作用:获取到连接名 这里是[enp1s5] 方便后面使用
#查看现有连接
nmcli connetion show / nmcli device status

步骤1: 设置静态ip
sudo nmcli connection modify "enp1s5" \
ipv4.addresses 192.168.1.100/24 \
ipv4.gateway "192.168.1.1" \
ipv4.dns "8.8.8.8,8.8.4.4" \
ipv4.method manual
步骤二:
#重载设置 推荐
sudo nmcli connection reload
或者使用
#禁用连接 不推荐,因为在远程时使用此命令会断开无法启用网络连接
sudo nmcli connection down "enp1s5"
步骤三:启用连接
sudo nmcli connection up "enp1s5"
步骤一命令解析
#修改连接名称为enp1s5的
sudo nmcli connection modify "enp1s5"
#IP地址 这里的/24 表示 子网掩码的前缀长度 255.255.255.0
ipv4.addresses 192.168.1.100/24#网关
ipv4.gateway "192.168.1.1" \#DNS
ipv4.dns "8.8.8.8,8.8.4.4" \#IP获取方式为手动
ipv4.method manual
#IP获取方式可选
manual # 手动配置(静态IP)
auto # 自动获取(DHCP)自动获取时不需要设置 addresses/gateway
disabled # 禁用IPv4
link-local # 链路本地地址(169.254.x.x)
shared # 共享连接(用于热点)
#nmcli 其他相关命令
connection add # 添加新连接
connection delete # 删除连接
文件配置修改
#【enp1s5】为网卡设备名称
nano /etc/sysconfig/network-scripts/ifcfg-enp1s5
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
NAME=enp1s5
UUID=51345d88-5339-4c7e-bce7-ed02fa29f5c1
DEVICE=enp1s5
ONBOOT=yes
IPADDR=192.168.1.151 #IP地址
PREFIX=32
GATEWAY=192.168.1.1
DNS1=8.8.8.8
DNS2=8.8.4.4
启用禁用网络接口
#若需要查看网卡型号
llspci | grep ethernet
sudo ip link enp1s5 up #down 为禁用
#重新建立网卡连接
sudo nmcli device connect enp1s5
#若失败 执行重新应用配置
nmcli devie reapply enp1s5
Linux 服务器之间实现ssh互信认证
1.生成密钥
ssh-keygen
[gensang@localhost ~]$ ssh-keygen
#以下各步骤可直接 按【回车】
Generating public/private rsa key pair.
Enter file in which to save the key (/home/gensang/.ssh/id_rsa):
Created directory '/home/gensang/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/gensang/.ssh/id_rsa
Your public key has been saved in /home/gensang/.ssh/id_rsa.pub
生成私钥(/home/gensang/.ssh/id_rsa)
公钥(/home/gensang/.ssh/id_rsa.pub)
2.将公钥文件拷贝到目标服务器
#执行后会在目标服务器 /home/gensang/.ssh 目录下生成一个名为[authorized_keys]的文件
ssh-copy-id 服务器名称@IP地址
反之亦然 互相能通信
用户相关操作
启用禁用root用户
sudo
创建用户
# 创建用户john,设置家目录,使用bash shell
sudo useradd -m -s /bin/bash john
# 设置密码
sudo passwd john
修改用户名
sudo usermod new-name oldname
修改用户密码
sudo passwd [用户名]
#创建用户
sudo adduser
防火墙操作相关命令
firewall-cmd(命令行管理工具)
firewalld(服务后台/守护进程)
firewall-cmd(命令行管理工具)
防火墙服务
查看服务是否安装
which firewalld
#存在输出路径
[gs2@GsServer2 nginx]$ which firewalld
/usr/sbin/firewalld
查看命令行工具是否存在
which firewalld
#存在输出命令路径
[gs2@GsServer2 nginx]$ which firewall-cmd
/usr/bin/firewall-cmd
# 检查是否安装(rpm系)
rpm -q firewalld
# 检查是否安装(deb系)
dpkg -l | grep firewalld
# 查看服务状态
sudo systemctl status firewalld
启动/停止 firewalld 服务
sudo systemctl start firewalld # 启动守护进程
sudo systemctl stop firewalld # 停止守护进程
sudo systemctl status firewalld # 查看状态
使用 firewall-cmd 管理规则
sudo firewall-cmd --list-all # 查看所有规则
sudo firewall-cmd --add-service=http # 添加服务
sudo firewall-cmd --reload # 重新加载配置
端口配置
添加端口
# 临时生效(运行时)
sudo firewall-cmd --add-port=80/tcp
# 永久生效(写入配置)
sudo firewall-cmd --permanent --add-port=9667/tcp
删除端口
sudo firewall-cmd --remove-port=80/tcp
查看开发端口
sudo firewall-cmd --list-all
iptables相关用法
工作机制
规则链名包括(也被称为五个钩子函数(hook functions)):
- INPUT链 :处理输入数据包。
- OUTPUT链 :处理输出数据包。
- FORWARD链 :处理转发数据包。
- PREROUTING链 :用于目标地址转换(DNAT)。
- POSTOUTING链 :用于源地址转换(SNAT)。
检查端口转发规则
[gs1@localhost ~]$ sudo iptables -t nat -L -n
| 参数 | 作用 | 示例输出 |
|---|---|---|
-t nat | 指定查看 NAT表 | 只看NAT相关规则 |
-L | 列出规则 | 默认查看filter表 |
-n | 数字显示 | IP和端口显示为数字 |
这是关于iptables(一个用于配置Linux内核防火墙的工具)的五种不同类型的表的解释。每种表都有其特定的用途和包含的链(chain),以下是对每种表的详细解释:
filter表:
这是默认的表,通常用于执行基本的防火墙过滤操作。
命令行示例:iptables -t filter -L 或简写为 iptables -L。
包含的链:INPUT、OUTPUT、FORWARD。
nat表:
用于网络地址转换(NAT),例如在进行源NAT(SNAT)或目的NAT(DNAT)时。
命令行示例:iptables -t nat -L。
包含的链:PREROUTING、POSTROUTING、OUTPUT。
mangle表:
用于修改数据包的某些部分,比如服务类型(TOS)、生存时间(TTL)或设置MARK(用于高级路由)。
命令行示例:iptables -t mangle -L。
用途:修改TOS、TTL、MARK等。
raw表:
用于决定是否对数据包进行连接跟踪,通常用于性能优化或特定的数据包处理。
命令行示例:iptables -t raw -L。
用途:设置NOTRACK规则。
security表:
与SELinux(安全增强的Linux)相关,用于实施强制访问控制(MAC)。
命令行示例:iptables -t security -L。
每种表在iptables中都有其特定的功能和用途,通过这些表,管理员可以精细地控制网络流量和实现各种网络功能。
# 查看所有表的概要
sudo iptables -L -n --line-numbers
# 或查看特定表
sudo iptables -t filter -L -n -v
sudo iptables -t nat -L -n -v
sudo iptables -t mangle -L -n -v
# 显示数据包和字节计数
sudo iptables -t nat -L -n -v
SSH 远程访问相关设置
修改ssh远程端口
步骤 1:备份当前配置
bash
# 备份 SSH 配置文件
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.backup.$(date +%Y%m%d)
步骤 2:编辑 SSH 配置文件
bash
# 使用你喜欢的编辑器
sudo vi /etc/ssh/sshd_config
# 或
sudo nano /etc/ssh/sshd_config
步骤 3:修改端口号
找到以下行(通常在文件顶部):
bash
#Port 22
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::
修改为:
bash
Port 2222 # 改为你想要的端口,如 2222
#Port 22 # 注释掉或保留原22端口(建议先保留作为备份)
端口选择建议:
- 建议使用 1024-65535 之间的端口
- 避免使用常见端口:21(FTP)、23(Telnet)、25(SMTP)、80(HTTP)、443(HTTPS)
- 常用替代端口:2222、22222、2229、2022、7822
步骤 4:配置多个端口(可选)
如果你想让新旧端口同时工作一段时间:
bash
Port 22
Port 2222
这样可以从两个端口连接,测试新端口无误后再关闭旧端口。
步骤 5:保存并测试配置
bash
# 测试配置文件语法
sudo sshd -t
# 如果没有任何输出,表示配置正确
步骤 6:配置防火墙(关键步骤!)
CentOS/RHEL/Fedora (firewalld):
bash
# 查看当前防火墙状态
sudo firewall-cmd --state
# 如果防火墙开启,添加新端口
sudo firewall-cmd --permanent --add-port=2222/tcp
sudo firewall-cmd --reload
# 验证端口已添加
sudo firewall-cmd --list-ports
sudo firewall-cmd --list-all
Ubuntu/Debian (ufw):
bash
# 查看 ufw 状态
sudo ufw status
# 允许新端口
sudo ufw allow 2222/tcp
sudo ufw reload
# 查看规则
sudo ufw status numbered
直接使用 iptables:
bash
# 临时添加规则
sudo iptables -A INPUT -p tcp --dport 2222 -j ACCEPT
# 保存规则(不同系统保存方式不同)
# CentOS/RHEL 7+:
sudo firewall-cmd --runtime-to-permanent
# 或
sudo iptables-save > /etc/sysconfig/iptables
# Ubuntu/Debian:
sudo iptables-save | sudo tee /etc/iptables/rules.v4
步骤 7:重启 SSH 服务
bash
# 重启 SSH 服务
sudo systemctl restart sshd # CentOS/RHEL/Fedora
# 或
sudo systemctl restart ssh # Ubuntu/Debian
# 查看服务状态
sudo systemctl status sshd
步骤 8:测试新端口连接(保持现有连接不关闭!)
在新的终端窗口测试:
bash
# 测试新端口连接
ssh -p 2222 username@server_ip
# 或者使用详细模式测试
ssh -v -p 2222 username@server_ip
步骤 9:确认新端口工作正常后,关闭旧端口
方法 A:禁用旧端口(推荐)
编辑配置文件,注释掉旧端口:
bash
sudo vi /etc/ssh/sshd_config
修改为:
bash
#Port 22 # 注释掉旧端口
Port 2222 # 只保留新端口
方法 B:从防火墙移除旧端口
bash
# CentOS/RHEL
sudo firewall-cmd --permanent --remove-service=ssh
sudo firewall-cmd --permanent --remove-port=22/tcp
sudo firewall-cmd –reload
# Ubuntu/Debian
sudo ufw delete allow 22/tcp
sudo ufw reload
重新加载配置
bash
sudo systemctl reload sshd
# 或
sudo systemctl restart sshd
3. 完整自动化脚本
创建一个安全更改脚本 change_ssh_port.sh:
bash
#!/bin/bash
# SSH 端口更改脚本
# 使用方法:sudo bash change_ssh_port.sh 2222
set -e # 遇到错误立即退出
NEW_PORT=$1
OLD_PORT=22
if [ -z "$NEW_PORT" ]; then
echo "错误:请指定新端口号"
echo "用法: sudo $0 新端口号"
exit 1
fi
if [ "$NEW_PORT" -eq "$OLD_PORT" ]; then
echo "错误:新端口不能与旧端口相同"
exit 1
fi
if [ "$NEW_PORT" -lt 1024 ] || [ "$NEW_PORT" -gt 65535 ]; then
echo "错误:端口号必须在 1024-65535 之间"
exit 1
fi
echo "=== 开始更改 SSH 端口 ==="
echo "当前端口: $OLD_PORT"
echo "新端口: $NEW_PORT"
echo ""
# 1. 备份配置
echo "1. 备份配置文件..."
BACKUP_FILE="/etc/ssh/sshd_config.backup.$(date +%Y%m%d_%H%M%S)"
sudo cp /etc/ssh/sshd_config "$BACKUP_FILE"
echo "备份已创建: $BACKUP_FILE"
# 2. 修改配置
echo "2. 修改 SSH 配置..."
sudo sed -i "s/^#Port $OLD_PORT/Port $OLD_PORT/" /etc/ssh/sshd_config
sudo sed -i "/^Port $OLD_PORT/a Port $NEW_PORT" /etc/ssh/sshd_config
echo "已添加新端口 $NEW_PORT"
# 3. 测试配置
echo "3. 测试配置语法..."
if ! sudo sshd -t; then
echo "错误:SSH 配置测试失败,恢复备份..."
sudo cp "$BACKUP_FILE" /etc/ssh/sshd_config
exit 1
fi
# 4. 配置防火墙
echo "4. 配置防火墙..."
if command -v firewall-cmd &> /dev/null; then
# firewalld
sudo firewall-cmd --permanent --add-port=$NEW_PORT/tcp
sudo firewall-cmd --reload
echo "firewalld 已配置"
elif command -v ufw &> /dev/null; then
# ufw
sudo ufw allow $NEW_PORT/tcp
sudo ufw reload
echo "ufw 已配置"
else
# iptables
sudo iptables -A INPUT -p tcp --dport $NEW_PORT -j ACCEPT
echo "iptables 规则已添加(需手动保存)"
fi
# 5. 重启服务
echo "5. 重启 SSH 服务..."
if systemctl is-active --quiet sshd; then
sudo systemctl restart sshd
elif systemctl is-active --quiet ssh; then
sudo systemctl restart ssh
fi
echo ""
echo "=== 更改完成 ==="
echo "请在新终端中测试连接:"
echo " ssh -p $NEW_PORT $(whoami)@$(hostname -I | awk '{print $1}')"
echo ""
echo "如果测试成功,可以:"
echo "1. 编辑 /etc/ssh/sshd_config"
echo "2. 注释掉 'Port $OLD_PORT' 行"
echo "3. 运行: sudo systemctl reload sshd"
echo "4. 从防火墙移除旧端口"
给执行权限并运行:
bash
chmod +x change_ssh_port.sh
sudo ./change_ssh_port.sh 2222
4. 测试和验证
测试连接:
bash
# 使用新端口连接
ssh -p 2222 username@server_ip
# 使用详细输出调试
ssh -vvv -p 2222 username@server_ip
# 使用 nc 测试端口是否开放
nc -zv server_ip 2222
验证配置:
bash
# 查看 SSH 监听的端口
sudo ss -tlnp | grep ssh
# 或
sudo netstat -tlnp | grep ssh
# 查看防火墙规则
sudo firewall-cmd --list-all 2>/dev/null || sudo ufw status 2>/dev/null
# 查看 SSH 配置
sudo grep -E "^Port|^#Port" /etc/ssh/sshd_config
5. 故障排除
问题1:连接被拒绝
bash
# 检查 SSH 服务状态
sudo systemctl status sshd
# 检查端口监听
sudo ss -tlnp | grep :2222
# 检查防火墙
sudo firewall-cmd --list-ports 2>/dev/null || sudo ufw status 2>/dev/null
问题2:SELinux 阻止
管理SELinux的端口策略
bash
# 查看 SELinux 状态
getenforce
# 如果是 Enforcing,需要添加端口
sudo semanage port -a -t ssh_port_t -p tcp 2222
#删除端口
sudo semanage port -d -t ssh_port_t -p tcp 2222
# 查看已允许的 SSH 端口
sudo semanage port -l | grep ssh
# 临时解决方案
sudo setenforce 0
问题3:配置文件错误
bash
# 恢复备份
sudo cp /etc/ssh/sshd_config.backup.* /etc/ssh/sshd_config
sudo systemctl restart sshd
6. 安全增强建议
1. 禁用密码登录(使用密钥)
bash
# 在 /etc/ssh/sshd_config 中添加:
PasswordAuthentication no
PubkeyAuthentication yes
2. 禁用 root 登录
bash
PermitRootLogin no
3. 限制用户访问
bash
AllowUsers username1 username2
# 或
AllowGroups sshusers
4. 使用 fail2ban 防止暴力破解
bash
# 安装 fail2ban
sudo yum install fail2ban # CentOS/RHEL
sudo apt install fail2ban # Ubuntu/Debian
# 配置 SSH 防护
sudo tee /etc/fail2ban/jail.local << EOF
[sshd]
enabled = true
port = 2222
filter = sshd
logpath = /var/log/secure
maxretry = 3
bantime = 3600
EOF
sudo systemctl restart fail2ban
7. 恢复默认端口
如果更改后出现问题,恢复步骤:
bash
# 1. 恢复配置文件
sudo cp /etc/ssh/sshd_config.backup /etc/ssh/sshd_config
# 2. 恢复防火墙
sudo firewall-cmd --permanent --remove-port=2222/tcp
sudo firewall-cmd --permanent --add-service=ssh
sudo firewall-cmd --reload
# 3. 重启 SSH
sudo systemctl restart sshd
# 4. 如果是 SELinux 问题
sudo semanage port -d -t ssh_port_t -p tcp 2222
使用 OpenSSL创建证书(推荐)
引言
在开发过程中,经常需要模拟HTTPS环境以测试网站或应用的安全性。由于正式签发的SSL证书成本较高,且需要等待审核,自签名证书成为了开发测试阶段的理想选择。OpenSSL作为一款开源的SSL/TLS协议工具包,提供了强大的加密功能,包括证书的创建、签名和管理。本文将引导你如何使用OpenSSL创建一个自签名SSL证书。
准备工作
在开始之前,请确保你的系统中已经安装了OpenSSL。大多数Linux发行版和MacOS都预装了OpenSSL,Windows用户可能需要手动下载并安装。
步骤一:生成私钥
首先,我们需要生成一个私钥(private key)。私钥是证书的核心,用于解密信息或进行数字签名。
openssl genpkey -algorithm RSA -out server.key -pkeyopt rsa_keygen_bits:2048
这条命令会生成一个2048位的RSA私钥,并将其保存到server.key文件中。2048位是一个常用的密钥长度,既安全又具有较好的性能。
步骤二:生成证书签名请求(CSR)
接下来,我们需要基于私钥创建一个证书签名请求(Certificate Signing Request, CSR)。这个CSR将被发送到证书颁发机构(CA)进行签名,但在自签名证书的场景下,我们实际上会用它作为生成证书的输入。
openssl req -new -key server.key -out server.csr
执行这条命令时,系统会提示你输入一系列信息,如国家、省份、城市、组织名称等。对于某些字段,如果你只是测试用,可以随意填写。
步骤三:生成自签名证书
现在,我们有了私钥和CSR,就可以使用OpenSSL的x509命令来生成自签名证书了。
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
这条命令会生成一个有效期为365天的自签名证书,并将其保存到server.crt文件中。-days参数用于指定证书的有效期,你可以根据需要调整。
步骤四:验证证书
生成证书后,你可能想验证它是否有效。可以使用OpenSSL的verify命令来完成这个任务。
openssl verify server.crt
# 验证自签名证书
openssl verify -CAfile server.crt server.crt
# 或者查看证书信息确认
openssl x509 -in server.crt -text -noout | head -20
如果证书没有问题,你会看到server.crt: OK的输出。
# 查看证书信息
openssl x509 -in server.crt -text -noout
# 验证证书链
openssl verify -CAfile rootCA.crt server.crt
# 检查私钥
openssl rsa -in server.key -check
应用自签名证书
生成并验证证书后,你就可以在需要的地方应用它了。例如,在Nginx或Apache服务器上配置HTTPS时,可以将server.crt和server.key文件指定为SSL证书和私钥。
注意事项
- 自签名证书虽然方便,但在生产环境中应避免使用,因为它们不会被客户端浏览器自动信任。
- 定期检查并更新你的证书,以防止证书过期导致的安全问题。
结论
通过本文,你应该已经掌握了使用OpenSSL创建自签名SSL证书的基本步骤。这个过程对于开发和测试HTTPS服务至关重要。希望这篇文章能帮助你更好地理解和应用SSL/TLS技术。
Docker应用实践
docker-ce 在线安装
1、使用yum在线安装Docker CE,执行以下命令安装依赖包:
[root@localhost ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
执行下面的命令添加yum软件源:
[root@localhost ~]# yum-config-manager --add-repo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
最后,可以安装Docker CE了。
[root@localhost ~]# yum makecache fast
[root@localhost ~]# yum install docker-ce
最后,启动 Docker CE:
[root@localhost ~]# systemctl enable docker
[root@localhost ~]# systemctl start docker
yum下载并安装
sudo yum install docker
[gensang@localhost home]$ sudo yum install docker
[sudo] gensang 的密码:
Last metadata expiration check: 0:20:52 ago on 2025年12月24日 星期三 22时36分59秒.
Dependencies resolved.
==========================================================================================
Package Architecture Version Repository Size
==========================================================================================
Installing:
docker-engine x86_64 2:18.09.0-345.oe2203sp3 update 39 MTransaction Summary
==========================================================================================
Install 1 PackageTotal download size: 39 M
Installed size: 163 M
Is this ok [y/N]: y
Downloading Packages:
^C [ === ] --- B/s | 0 B --:-- ET [ === ] --- B/s | 0 B --:-- ETA
The downloaded packages were saved in cache until the next successful transaction.
You can remove cached packages by executing 'yum clean packages'.
Error: Error downloading packages:
Interrupted by a SIGINT signal
[gensang@localhost home]$ sudo yum install docker
Last metadata expiration check: 0:21:14 ago on 2025年12月24日 星期三 22时36分59秒.
Dependencies resolved.
==========================================================================================
Package Architecture Version Repository Size
==========================================================================================
Installing:
docker-engine x86_64 2:18.09.0-345.oe2203sp3 update 39 MTransaction Summary
==========================================================================================
Install 1 PackageTotal download size: 39 M
Installed size: 163 M
Is this ok [y/N]: y
Downloading Packages:
docker-engine-18.09.0-345.oe2203sp3.x86_64.rpm 3.8 MB/s | 39 MB 00:10
------------------------------------------------------------------------------------------
Total 2.5 MB/s | 39 MB 00:15
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
Preparing : 1/1
Installing : docker-engine-2:18.09.0-345.oe2203sp3.x86_64 1/1
Running scriptlet: docker-engine-2:18.09.0-345.oe2203sp3.x86_64 1/1
Created symlink /etc/systemd/system/multi-user.target.wants/docker.service → /usr/lib/systemd/system/docker.service.Verifying : docker-engine-2:18.09.0-345.oe2203sp3.x86_64 1/1
Installed:
docker-engine-2:18.09.0-345.oe2203sp3.x86_64Complete!
验证安装是否成功
sudo dockre -v
[gensang@localhost home]$ docker -v
Docker version 18.09.0, build d51e3ad
检查Docker是否运行
# 检查Docker是否运行
sudo systemctl status docker
将当前用户加入 docker 组:
默认情况下,docker命令会使用Unix socket与Docker引擎通讯。而只有root用户和docker组的用户才可以访问Docker引擎的Unix socket。出于安全考虑,一般Linux系统上不会直接使用root用户。因此,更好地做法是将需要使用docker的用户加入docker用户组。因此,首先建立docker组 groupadd docker
#查看用户组是否存在
[gensang@localhost ~]$ cat /etc/group | grep docker
#用户组不存在 创建
groupadd docker
#将当前用户加入 docker 组:
usermod -aG docker $USER
镜像加速配置
镜像加速器配置
国内从 Docker Hub 拉取镜像有时会遇到困难,此时可以配置镜像加速器,首先,创建daemon.json文件 :
[gensang@localhost docker]$ sudo nano daemon.json
[gensang@localhost docker]$ cat daemon.json
{
"registry-mirrors": [
"https://docker.1ms.run",
"https://proxy.1panel.live",
"https://docker.xuanyuan.me",
"https://docker.m.daocloud.io",
"https://docker.rainbond.cc",
"https://docker.1panel.live"
]
}
# 重启Docker使配置生效
sudo systemctl daemon-reload
sudo systemctl restart docker
# 验证镜像源是否生效
docker info | grep "Registry Mirrors"
运维工具docker箱部署案例
# 先拉取镜像(单独拉取更易排查)
sudo docker pull wcjiang/reference:latest
# 拉取成功后运行容器
sudo docker run --name reference -d -p9667:3000 wcjiang/reference:latest
# 检查容器状态
sudo docker ps
Nginx 应用实践
编写nginx启动脚本
nginx 不强制要求必须有 Systemd 服务脚本,但强烈建议使用
997






