答案1
我假设这是在 Linux 上完成的,因为没有另行说明,并且因为容器上下文。
描述lsof
告诉:
描述
Lsof 修订版 4.91 在其标准输出文件中列出有关进程打开的文件的信息针对以下 UNIX 方言:
- Apple Darwin 9和Mac OS X 10。[567]
- 适用于基于 AMD64 系统的 FreeBSD 8.[234]、9.0 和 1[012].0
- Linux 2.1.72 及以上版本(适用于 x86 系统)
- Solaris 9、10 和 11
在 Linux 上,WireGuard 不是标准进程,而是由内核处理的网络驱动程序。即使最终这可能会创建一个出现在进程列表中的内核线程,但这个“进程”将是特殊的,不会提供有关其打开的文件描述符的任何信息(如果这种概念对内核线程有任何意义的话)。
因此lsof
无法找到这样的信息并且总是返回空结果。
netstat -nul | grep -w 7456
然而,像或这样的命令ss -nul sport = :7456
仍然会显示它,它的创建地点(见下文),因为它只查询内核网络 API(/proc/net/udp{,6}
或网络链接/sock_diag)了解监听端口,而不是交叉引用内核的信息过程API 与来自网络 API 的 API。
话虽如此,这只有在命令wg-quick up wg0
在之后使用接口的特定容器中运行时才有效。如果它在主机上运行,之后容器的创建“窃取”了它,那么一切都将不复存在。这是因为 WireGuard 旨在与网络命名空间(即容器)一起工作。这是完全可能的,而且记录,在网络命名空间(例如初始主机命名空间)中创建 WireGuard 接口,并将其移动到其他网络命名空间:
为容器做好准备
WireGuard使用最初创建 WireGuard 接口的网络命名空间发送和接收加密数据包。这意味着您可以在可以访问 Internet 的主网络命名空间中创建 WireGuard 接口,然后将其移动到属于 Docker 容器的网络命名空间中作为该容器的唯一接口。这确保了容器能够访问网络的唯一可能方式是通过安全加密的 WireGuard 隧道。
这意味着如果移动了接口,监听端口将保留在之前的(可能是初始主机的)网络命名空间中,并且在接口到达的网络命名空间中不可见。在这种情况下,监听端口 7456/UDP 在容器中不可见,但会在主机上(或最初创建它的地方)可见。还要注意,WireGuard 仅在接口管理上处于开启状态(ip link set wg0 up
)时才会监听(仍然只在原始网络命名空间中)。关闭它会暂时删除监听端口。