SS 和其他网络程序如何从端口号中查找端口名称?

dso*_*len 1 networking centos

SS、netstat 和 tcpdump,仅举几例,都会在识别时将端口号转换为名称。因此,作为示例,端口 22 上的连接将显示为“ssh”。

我想知道这个映射是如何完成的?我假设这些程序不是每个都对映射列表进行硬编码?是否有负责帮助网络将端口号映射到名称的中央程序或服务?

相关问题,当我在相同版本的 linux(6.9,所以有点旧)上运行 SS 时,我得到了不同的行为。在 VM 上,我正在测试命令 'ss -a' 列出端口 11001 上的程序;在具有相同操作系统和命令的裸机上,端口被列为 metasys。修复我的脚本来解决这个问题很容易,但我很好奇为什么一个服务识别端口 11001 而另一个不识别。

Sté*_*las 6

通常使用getservbyport()API,它是名称服务框架的接口。

它与将 IP 地址解析为主机名、将用户名解析为用户 ID 等的函数系列相同。

getservbyport()通常会查看/etc/nsswitch.conf(其中列出了用于每个类别的数据库),以获取services.

如果条目services显示为files,则将使用该/etc/services文件作为纯文本文件,就像在(用户数据库)中提到的那样/etc/passwd使用。filespasswd

您可以拥有其他形式的数据库。在 GNU 系统上,如果xyz列出了一个数据库,它将使用libnss_xyz.so按需加载的共享库进行查询。

除此之外files,常见的有db, nis, nisplus,ldap ...

在简单的部署中,通常只有files,所以/etc/services.