什么是非网络化Unix域套接字?

什么是非网络化Unix域套接字?

我在读不安全的 Docker 守护进程被揭露

它说

Docker daemon creates a non-networked Unix domain socket at /var/run/docker.sock 

非网络化的Unix域套接字表示什么?

答案1

它是一个套接字,其地址是文件系统路径而不是某种形式的网络地址。例如,127.0.0.1:4567程序不会连接到诸如 的 IP 地址:端口,而是“连接”到特殊文件/var/run/docker.sock

(但是,IP 和 Unix 套接字之间的实际 API 几乎相同 - 程序对这两种类型使用相同的 socket()、bind()、connect() 调用。它们只需要指定AF_UNIX(或 AF_LOCAL)而不是通常的AF_INET[6]套接字类型。这使它们成为内部通信的非常常见的选择。事实上,最多Linux 系统上的程序以这种方式进行通信。

它是“非网络化的”,因为套接字只能由本地运行的进程访问。(您不能通过 NFS 或 SSHFS 使用它。)与可以绑定到本地主机的“IP 域”套接字不同或者任何地址(例如在您链接的文章中讨论端口 2375 上可从外部访问的 IP 套接字),“Unix 域”套接字都保证是仅限本地的。

(此外,Unix 套接字可以使用文件权限来限制对套接字的访问 - 例如仅限于“docker”组的成员 - 并且守护进程知道每个连接客户端的 UID。最后,当然,套接字有一个适当的姓名这样就不会有两个不同的程序争夺同一个端口……)

“域”这个术语与互联网的“域名系统”无关,只是在“领域”或“区域”的一般意义上使用——据我所知,“Unix 域”只是简单地表示“本地运行的操作系统”(而不是“所有连接到互联网的机器”),因为有这种机制作为套接字 API 的一部分确实最初是 Unix 的一个特性。更好的名字应该是“本地套接字”,即 AF_LOCAL,但这个名字没有被采纳。

Windows 有一个非常相似的功能,称为“命名管道”,例如\\.\pipe\docker_engine。Windows 命名管道确实比 Unix 管道更像 Unix 套接字 - 但是,与使用套接字相比,程序仍然需要使用完全不同的 API 来在 Windows 上使用命名管道(尽管 Win10 也有 AF_UNIX 套接字),并且仍然可以通过 SMB 访问不安全的管道。

答案2

根据上下文,这意味着docker无法从主机外部(即本地和外部网络)访问,但是“只有 [同一台机器上] 具有 root 权限或 Docker 组成员资格的进程才能访问”

相关内容