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