SS、netstat 和 tcpdump 等程序在识别时都会将端口号转换为名称。因此,作为示例,端口 22 上的连接将显示为“ssh”。
我想知道这个映射是如何完成的?我假设这些程序不是每个都硬编码映射列表?是否有一个中央程序或服务负责帮助网络将端口号映射到名称?
相关问题,当我在同一版本的linux(6.9,所以有点旧)上运行SS时,我得到了不同的行为。在虚拟机上,我正在测试命令“ss -a”,列出了端口 11001 上的程序;在具有相同操作系统和命令的裸机上,端口被列为 metasys。修复我的脚本来解决这个问题很容易,但我很好奇为什么一个服务可以识别端口 11001,而另一个则不能。
答案1
通常使用getservbyport()
API,它是名称服务框架。
它与将 IP 地址解析为主机名、将用户名解析为用户 ID 等的函数系列相同。
getservbyport()
通常会查看/etc/nsswitch.conf
(其中列出了每个类别要使用的数据库),以获取 的条目services
。
如果 的条目services
显示files
,则将使用该/etc/services
文件作为平面文本文件,就像提到的(用户数据库)/etc/passwd
一样。files
passwd
您可以拥有其他形式的数据库。在 GNU 系统上,如果有xyz
列出的数据库,将使用libnss_xyz.so
按需加载的共享库对其进行查询。
除此之外,files
常见的还有db
、、、...nis
nisplus
ldap
在简单的部署中,通常只有files
, 所以/etc/services
。