我正在尝试查看如果机器 3 上的系统关闭导致网络断开,数据是否保留在内存中。所有机器都运行 RHEL 7。我的设置如下:
机器 1 > 机器 2 > 机器 3
我想断开机器 3 的连接,并检查从机器 1 发送的信息是否保留在机器 2 上,即使保留了几秒钟。请注意,机器 2 基本上只是进行路由,没有实际处理信息。信息通过 TCP 或 UDP 上的 netcat 发送。
查看此信息的最佳方式是什么。我假设对进程 pid 进行 strace,但我无法收集到任何有用的信息。查看另一个线程,我看到有人提到执行 /proc/[pid]/maps 并将内存转储到 gdb 中,但这似乎有点难以浏览我所看到的所有数据。
有更好的方法来做我正在寻找的事情吗?谢谢!
答案1
我预计这取决于 M2 正在做什么以及 M3 如何关闭。此外,如果您从安全角度考虑这一点,那么它的重要性取决于您如何定义威胁模型和所需的安全级别。
如果M2主动参与通信在 TCP 级别,也就是说,如果 M1 和 M2 之间有一个 TCP 连接,M2 和 M3 之间有另一个 TCP 连接,那么 M2 上的操作系统将需要存储发送的任何数据,直到 M3 确认接收(或者直到各种计时器用完,用错误)。如果是 UDP 连接,或者 M2 仅充当 IP 路由器,则不需要发生这种情况。对于 IP 和 UDP,数据包/数据报被发送,然后被遗忘,这是上层协议的责任来处理这个问题。
此外,M3 的关闭方式也有一点关系。如果它只是因为断电或网线断开而停止应答,那么 M2 无法知道它已经消失,并且(使用 TCP)将尝试重新发送。但如果主动关闭,M3 上的操作系统可能会尝试确保所有活动的网络连接都以有序的方式关闭。在这种情况下,M2 将收到一条消息,告知连接已关闭,并且可能会丢弃任何未发送的数据。
网络缓冲区将驻留在操作系统内,因此通过转储进程内存它们将不可见,但进程最终也可能会进行一些缓冲。如果进程在检测到与 M3 的连接出现错误时退出,则类似的论点可能适用于此。
上述所有内容都适用于需要保留以供进一步使用的数据。此外,很可能某些数据仍保留在 M2 的内存中、不再使用的缓冲区中,但实际上并未被覆盖。使用一些易于识别的数据实际进行该实验,然后转储整个操作系统的内存以查找其剩余副本,这可能是一个有趣的练习。
根据您的威胁模型,您可能还需要考虑 M2 上的程序或操作系统本身遭到破坏并将通信副本发送给未知方的情况。