systemctl list-unit-files --type=service 列出所有已安装服务单元的启用状态,而非运行状态;应重点禁用或屏蔽明确不用的服务(如avahi-daemon、bluetooth),避免误关基础服务,并结合端口检查与防火墙加固。

systemctl list-unit-files --type=service 会列出哪些服务该关
运行 systemctl list-unit-files --type=service 看到的不是“所有正在运行的服务”,而是“所有已安装服务单元的启用状态”。重点关注 enabled(开机自启)但实际业务完全用不到的服务,比如 avahi-daemon(局域网设备发现)、bluetooth(服务器根本没蓝牙硬件)、cups(打印服务)、rpcbind(NFSv3 依赖,若不用 NFS 可关)。
别盲目关 sshd、network、systemd-journald 这类基础服务——关了可能连不上机器或日志全丢。
- 先查服务用途:
systemctl cat <service_name></service_name>或man <service_name></service_name> - 确认没被其他服务依赖:
systemctl list-dependencies --reverse <service_name></service_name> - 测试关闭后是否影响现有功能,尤其注意 cron、logrotate、监控 agent 是否异常
systemctl disable 和 mask 的区别必须分清
systemctl disable 只是取消开机自启,手动执行 systemctl start 仍能拉起;而 systemctl mask 是创建指向 /dev/null 的符号链接,彻底阻止启动(包括依赖触发),更彻底也更安全。
对明确不需要、且担心未来被其他服务间接激活的服务(如 telnet.socket、vsftpd),优先用 mask:
systemctl mask avahi-daemon.service systemctl mask rpcbind.service
但注意:mask 后若真需要启用,得先 unmask 再 enable,比 disable 多一步操作。
关服务前必须检查监听端口和网络暴露面
很多服务看似没配,但默认监听 0.0.0.0,直接把内网端口暴露出去。先用 ss -tlnp 或 netstat -tulpn 看当前监听的端口和对应进程。
重点排查:
- 非必要监听在
0.0.0.0:xxx而非127.0.0.1:xxx的服务 - 使用 root 权限监听高危端口(如 21、23、139、445)的服务
- 未配置防火墙规则却开放了外网访问的服务(比如开了
dockerd却没限制2376端口)
关服务只是第一层,配合 ufw 或 iptables 显式拒绝非信任源访问,才能真正缩小攻击面。
云服务器和容器环境要特别注意 systemd 依赖链
云厂商镜像(如 AWS AL2、Ubuntu Cloud)常预装 cloud-init、snapd、lxd 等服务,它们之间有隐式依赖。例如 snapd 被 cloud-init 用于初始化配置,直接 mask 可能导致下次实例重启时初始化失败。
容器宿主机上还要小心:docker.socket 关了不影响已运行容器,但新容器无法通过 socket 创建;containerd 若被误关,所有容器会逐步退出。
建议做法:
- 生产环境先在测试机完整重启验证
- 用
systemctl show --property=WantedBy,RequiredBy <service></service>查依赖关系 - 对不确定的服务,先
stop+disable,观察 24 小时再mask
真正难的不是“怎么关”,而是判断“它到底有没有被悄悄用着”——尤其跨团队维护的系统,一个没人记得的 cron 脚本里可能藏着 systemctl start rsyslog 这种硬编码调用。










