服务器上的 MTU 意外设置为 0,无法通过 ssh 进入?

Bha*_*aju 7 ssh scp mtu

我的服务器的 ssh 出现了一些问题,我无法上传大于 10 KB 的文件,因为 scp 在复制过程中会挂起。我在这里找到了解决这个问题的方法,我正在更改 MTU,但我不小心这样做了sudo ip link set eth0 mtu 0

现在没有人可以 ssh 进入服务器。我该怎么办?

Mik*_*ott 22

连接到控制台并更改回 MTU。如果您没有控制台访问权限,请重新启动服务器。


kas*_*erd 7

不清楚您使用的是哪个操作系统。我已经在两个不同版本的 Linux 上测试了您的特定命令,每个版本都给了我一条错误消息:

RTNETLINK answers: Invalid argument
Run Code Online (Sandbox Code Playgroud)

如果您找到了一个实际上允许您将 MTU 设置为 0 的系统,我会认为这是一个内核错误。然而,似乎存在系统,其中将 MTU 设置为 0 具有其他一些含义,例如自动检测 MTU。

IPv4 要求所有节点的 MTU 至少为 68。Linux 知道这一点,如果 MTU 设置为较低的值(例如 67),Linux 会在接口上禁用 IPv4。这样就可以将自己锁定在系统之外。这很不方便,如果内核会拒绝 MTU 更改,只要接口具有任何需要更高 MTU 的 IP 地址,我就会认为它是一个更好的设计。

如果您不小心在网络接口上禁用了 IPv4 和 IPv6,您就不太可能找到任何方法通过该网络接口远程管理机器。如果服务器有任何其他网络接口,您可以通过这种方式访问​​它。即使尚未配置其他网络接口,它也可能具有 IPv6 链接本地地址,可以从同一网段上的不同主机通过 ssh 连接到该地址。否则,串行控制台仍然是一种选择,因为串行控制台完全独立于主机的网络配置。最终,您可以重新启动机器,如果您可以远程访问。只要您没有将错误的更改写入任何配置文件,重新启动应该可以修复它。

  • @MichaelKjörling 将 MTU 设置为 67 会关闭接口上的 IPv4。增加 MTU 不会自动再次打开 IPv4。显然这不是一个关键系统,因为如果它是一个关键系统,我什至不会考虑测试 MTU 更改。也就是说,仍然支持 Ubuntu 12.04,所以我不会考虑从 12.04 升级关键系统,除非我需要 14.04 中的一些新功能。 (3认同)
  • @ForbiddenOverseer 我有一个 Ubuntu 12.04 系统,我可以尝试在其上重现它。但是直到下次我可以物理访问机器时(出于明显的原因),我才会对其进行测试。我的 12.04 系统运行的内核比你的更新,不知道这是否有什么区别。 (2认同)
  • @kasperd `screen` 然后`sudo -i` 然后`ip link set eth0 mtu 0 ; 睡眠 30 ; ip link set eth0 mtu 1500` 也许?(或者任何你喜欢的 MTU 值。)如果它坏了,它会在半分钟后自动恢复。但是我仍然不愿意在任何*关键*系统上测试它……再说一次,现在 Ubuntu 12.04 实例似乎不太可能成为关键。 (2认同)