/etc/services文件是静态映射表,用于将服务名与端口号及协议关联,供工具显示、程序调用和配置引用;它不控制端口启用与否,仅提供命名约定,读取权限开放,修改需root权限。

/etc/services 文件本身不控制端口是否启用或禁用,它只是一个静态映射表,用于将服务名与端口号+协议关联起来。它的核心作用是“命名”和“约定”,而非“授权”或“生效”。真正决定端口是否被监听、是否能通信的,是运行中的服务进程(如 nginx、sshd)及其配置,而不是这个文件的内容。
/etc/services 的读写权限
该文件默认权限为 rw-r--r--(644),属主 root,属组 root:
- 所有用户均可 读取(普通用户执行
cat /etc/services或grep http /etc/services都没问题) - 只有 root 用户或具有 sudo 权限者才能 修改或覆盖(编辑需
sudo vi /etc/services) - 无执行权限,也不应有——它不是脚本或二进制程序
为什么修改 /etc/services 不影响服务实际运行
这个文件不参与网络栈初始化,也不被内核读取。它的用途集中在“人类可读性”和“上层工具支持”:
-
netstat、ss 等命令显示服务名:比如
ss -tlnp显示:http而非:80,依赖的就是 /etc/services 中http 80/tcp这一行 -
部分服务配置支持服务名引用:例如某些防火墙规则、iptables 的
--service扩展,或旧版 xinetd 配置中可用service = ftp,系统会查此文件获知端口 -
应用编程接口调用:C 语言中
getservbyname("ssh", "tcp")会返回端口号 22,底层正是解析 /etc/services - 注释掉某行(如 #ftp 21/tcp)仅导致工具不再识别该服务名,不会阻止 sshd 监听 22,也不会让 vsftpd 拒绝绑定 21
它对权限管理的实际意义
虽然文件自身不设访问控制,但它间接支撑两类权限相关实践:
-
特权端口约束:端口号 ≤ 1023 属于“特权端口”,Linux 要求绑定它们的进程必须由 root 启动。/etc/services 中列出的
ssh 22/tcp、http 80/tcp等,提醒管理员这些服务默认需要 root 权限运行 -
端口分配协调依据:当部署自定义服务(如内部 API 服务
myapi 55555/tcp),将其加入 /etc/services 可避免团队成员重复使用同一端口;运维在审查配置时也能快速确认该端口是否已被约定用途占用 -
安全审计辅助:配合
lsof -i :端口或ss -tuln,比对实际监听端口与 /etc/services 登记的服务名,有助于发现异常监听(例如未知进程监听了 23/tcp,而 /etc/services 中该端口对应 telnet,但系统并未启用 telnetd)
什么操作真会影响端口权限与行为
要真正开启、关闭或限制端口访问,需操作以下层面:
- 启动/停止服务进程(
systemctl start nginx) - 修改服务自身配置(如 nginx.conf 的
listen 8080) - 调整防火墙规则(
ufw allow 8080或iptables -A INPUT -p tcp --dport 8080 -j ACCEPT) - 设置 capabilities(如给非 root 进程授予
cap_net_bind_service以绑定 80 端口)











