wireguard 启动后没有监听端口

wireguard 启动后没有监听端口

我正在使用以下命令启动 wireguard:

wg-quick up wg0

这是 wireguard 的状态:

在此处输入图片描述

并使用此命令查看监听端口:

lsof -i:7456

为什么 wireguard 没有监听端口?wireguard 配置成功了吗?

答案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)时才会监听(仍然只在原始网络命名空间中)。关闭它会暂时删除监听端口。

相关内容