![英特尔 AMT(主动管理技术)如何不干扰 TCP/IP 主机堆栈?](https://linux22.com/image/634917/%E8%8B%B1%E7%89%B9%E5%B0%94%20AMT%EF%BC%88%E4%B8%BB%E5%8A%A8%E7%AE%A1%E7%90%86%E6%8A%80%E6%9C%AF%EF%BC%89%E5%A6%82%E4%BD%95%E4%B8%8D%E5%B9%B2%E6%89%B0%20TCP%2FIP%20%E4%B8%BB%E6%9C%BA%E5%A0%86%E6%A0%88%EF%BC%9F.png)
我一直在使用的英特尔开发套件包括一个远程管理功能 (另见Ubuntu 手册页在这里) 允许在操作系统挂起时进行远程重启。
它能够在与操作系统共享的 IP 地址上监听少量端口(具体来说是 16992 和 16993)。(通过监听 DHCP 请求或发出自己的请求;我不确定,但无论哪种方式,它在这种模式下都使用共享的 MAC 地址)
我让它在单独的 IP 地址上运行,因为我担心一个潜在的用例:AMT 如何防止主机网络堆栈与其发生冲突?
换句话说,英特尔管理软件现在正在监听 [至少] 两个 TCP 端口,这些端口是带外的,并且操作系统对此一无所知。假设我启动与远程主机的 TCP 连接,主机堆栈选择 16992 或 16993 作为本地端口来监听 [返回到主机的数据包]。
从远程主机返回的数据包是否会被“黑洞”并永远无法到达操作系统?或者是否存在一些预防措施,例如 Linux 内核中的英特尔驱动程序知道 TCP 应该避开端口 16992?(似乎不太可能,因为这是一个与操作系统无关的功能。)或者管理接口可以将发送到端口 16992 且不属于已知管理会话的流量转发回主机堆栈?
无论如何,在我理解它的工作原理之前,我不愿意将它用于网络密集型负载。我搜索了英特尔文档但在那里也找不到任何东西。
我认为可以通过启动大约 30,000 个 TCP 连接来测试这一点,并检查即使端口重叠,连接是否正常。但我还没有机会这样做。
(脚注:我意识到这个问题类似于基于 Intel vPro 的计算机如何维持 IP 连接?但是这些问题解决的是一般的连接问题,而不是与主机堆栈重叠的特定 TCP 端口的连接问题。)
答案1
在配置 AMT 监听共享 IP 地址后,我运行了卡斯帕德在上面的评论中。(example.com
当然,针对我自己的带有 SSH 服务器的远程主机,实际上并非如此)结果如下:
正面测试用例(使用端口不是AMT 使用)
$ nc -p 16991 example.com 22
SSH-2.0-OpenSSH_5.9p1 Debian-5ubuntu1.4
^C
$
负面测试用例(使用 AMT 使用的端口):
$ nc -p 16992 example.com 22
$
(几分钟后,负面测试用例超时并返回到 shell 提示符。)
正如您所看到的,返回端口 16992 的数据包在到达主机的 TCP/IP 堆栈之前被丢弃。
建议:如果可靠的网络对您很重要,请不要在与主机 TCP/IP 堆栈相同的 IP 地址上启用 AMT!
答案2
英特尔论坛上有一个争议帖子主机 IP 与 Intel AMT 设备 IP 之间的映射 建议
使用静态 IP 操作时,必须为 AMT 和主机配置不同的 IP 地址。
并解释道:
当您使用静态 IP 配置 vPro 计算机时,AMT 将使用称为可管理性 mac 的 mac 地址,该地址仅在静态 IP 模式下起作用。可管理性 mac 地址与主机提供的 mac 地址不同。
我确认在 AMT 和主机上使用 DHCP 会导致路由问题。例如 ping 误导:
64 bytes from 192.168.1.11: icmp_seq=18 ttl=64 time=0.559 ms
64 bytes from 192.168.1.11: icmp_seq=18 ttl=255 time=0.614 ms (DUP!)
64 bytes from 192.168.1.11: icmp_seq=19 ttl=64 time=0.579 ms
64 bytes from 192.168.1.11: icmp_seq=19 ttl=255 time=0.630 ms (DUP!)
64 bytes from 192.168.1.11: icmp_seq=20 ttl=64 time=0.553 ms
64 bytes from 192.168.1.11: icmp_seq=20 ttl=255 time=0.602 ms (DUP!)
答案3
从远程主机返回的数据包是否会被“黑洞”并永远无法到达操作系统?
来自远程主机的所有带有“AMT 端口”的数据包都不会到达任何操作系统。它们会被 Intel ME/AMT 拦截。默认情况下,它们是端口 16992-16995、5900(AMT 版本 6+)、623、664。
答案4
一种解决方案可能是使用 来设置 Windows TCP 堆栈的端口netsh
。
默认情况下,Windows 使用端口 49152 >> 65636(或任何上限)因此您可以非常安全地使用 AMT。您可以使用设置端口范围netsh
。例如,我总是为外围机器使用大约 1000 个端口。
此外,英特尔会剥离 AMT 命令并将这些端口(实际上是 16991-16995!)上的所有其他流量传递给操作系统(如果存在操作系统)。因此,如果您有一个打开 AMT 范围内端口的应用程序,流量仍将通过操作系统传递给应用程序,因为就像我说的那样,英特尔只剥离了 AMT 管理命令。您的应用程序不太可能发送 AMT 命令。