最近在家里经常遇到 ssh 超时的问题,一开始也没太当回事,感觉是网络不稳定导致的,但是后来慢慢的发现这种超时问题只会出现在跟 ssh 相关的程序中,例如 git、ssh。这成功的引起了我的注意,于是我开始尝试着去排查。

首先我测试了一下 ping 远程服务器,发现结果还是比较正常的,所以在 icmp 协议上,连接应该是没有问题的。然后安装 tcping 软件包,测试 tcp 连接,结果显示也是正常的,那么看起来就是 ssh 协议的问题了。于是接着尝试让 ssh 输出调试信息:

  1. $ ssh -v -o ConnectTimeout=10 test-server

输出结果如下:

  1. # .....
  2. debug1: SSH2_MSG_KEXINIT sent
  3. debug1: SSH2_MSG_KEXINIT received
  4. debug1: kex: algorithm: curve25519-sha256
  5. debug1: kex: host key algorithm: ecdsa-sha2-nistp256
  6. debug1: kex: server->client cipher: chacha20-poly1305@openssh.com MAC: <implicit> compression: none
  7. debug1: kex: client->server cipher: chacha20-poly1305@openssh.com MAC: <implicit> compression: none
  8. debug1: expecting SSH2_MSG_KEX_ECDH_REPLY
  9. # 一直等待,直到超时

可以看到,ssh 连接的建立一直阻塞在了 expecting 这个阶段,用这行命令的输出在网络上查找,发现了是 MTU 过大引起的问题: mtu missmatch

这片文章给出的解决方案是将系统的 MTU 的设置成一个较小的值(例如,576)。使用 ip 命令简单的执行了一下,发现确实可以解决 ssh 超时的问题:

查看当前的 MTU 设置

  1. $ ip link list
  1. 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
  2. link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
  3. 2: wlp4s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DORMANT group default qlen 1000
  4. link/ether ac:bc:32:d4:cd:af brd ff:ff:ff:ff:ff:ff

接着修改无线网卡的 MTU 设置:

  1. $ sudo ip link set dev wlp4s0 mtu 576

但是我的潜意识告诉我这么干并不优雅,于是我在 Arch Wiki 上面找到了这个内容。这里面提到一个内核参数 —— tcp_mtu_probing,启用这项内核功能可以让操作系统根据网络状况自动的调节 MTU 大小,从而在性能与稳定性之间找到一个微妙的平衡,具体的介绍可以看 Cloudflare 这篇介绍

只要先在 /etc/sysctl.d/99-sysctl.conf 加上下面的内容:

  1. net.ipv4.tcp_mtu_probing = 1

然后使用 sysctl 加载配置就好了:

  1. $ sudo sysctl --system

Arch Linux 启用 MTU 探测的更多相关文章

  1. 在VMWare上安装Arch Linux

    1.为什么选择Arch Linux Arch Linux 是通用 x86-64 GNU/Linux 发行版.Arch采用滚动升级模式,尽全力提供最新的稳定版软件.初始安装的Arch只是一个基本系统,随 ...

  2. arch linux 安装指南

    (如果不想折腾arch linux,推荐直接使用 manjaro:  https://manjaro.org/ ) 1.安装准备 Arch Linux 能在任何内存空间不小于 512MB 的 x86_ ...

  3. Arch Linux 安装、配置、美化和优化

    国庆假期玩了下Arch Linux,发现这货跟Ubuntu之流相差甚远,甚难调教,而且安裝过程全命令行,会有各种问题,各种知识... --- 安装引导器--- -------------------- ...

  4. 如何在 Arch Linux 的终端里设定 WiFi 网络

    如果你使用的是其他 Linux 发行版 而不是 Arch CLI,那么可能会不习惯在终端里设置 WiFi.尽管整个过程有点简单,不过我还是要讲一下.在这篇文章里,我将带领新手们通过一步步的设置向导,把 ...

  5. Arch Linux 安装记录

    Arch Linux 安装记录 基本上参考wiki上的新手指南,使用arch 2014.6.1 iso安装 设置网络 有线网络 Arch Linux 默认开启DHCP. 静态ip 首先关闭DHCP:s ...

  6. Arch linux安装

    安装archlinux可参考: http://blog.sina.com.cn/s/blog_69e5d8400101bqlj.html http://www.cnblogs.com/mad/p/32 ...

  7. Arch Linux 硬盘引导-联网安装

    Arch Linux 硬盘引导-联网安装 ============https://www.archlinux.org/https://wiki.archlinux.org/https://wiki.a ...

  8. arch Linux(一)

    制作启动盘 将U盘插入待装主机,设置U盘启动,重启进入系统安装界面 设置root密码 root@archiso~ # passwd 启动允许远程连接 root@archiso~ # systemctl ...

  9. Arch Linux 独特的包管理器相关名词解释及用法对照

    https://wiki.archlinux.org/index.php/PacmanPacman包管理器是Arch Linux的主要特色之一.它结合了简单的二进制包格式和易于使用的构建系统.pacm ...

随机推荐

  1. Beta冲刺(4/7)——2019.5.25

    所属课程 软件工程1916|W(福州大学) 作业要求 Beta冲刺(4/7)--2019.5.25 团队名称 待就业六人组 1.团队信息 团队名称:待就业六人组 团队描述:同舟共济扬帆起,乘风破浪万里 ...

  2. 2018南京区域赛K题 Kangaroo Puzzle——随机&&乱搞

    题意 在 n * m 的平面上有若干个袋鼠和墙(1为袋鼠,0为墙),每次可以把所有袋鼠整体往一个方向移动一步(不能走出边界和不能走到墙),为在不超过50000步的情况下能否把全部袋鼠聚集在同一个位置. ...

  3. SC CSP-J2019初赛成绩已出!

    链接: https://pan.baidu.com/s/1UK2pL7UW0n0vYpnzMbJm9A 提取码: uwav 复制这段内容后打开百度网盘手机App,操作更方便哦 Me?87! I am  ...

  4. linux学习11 Linux基础命令及命令历史

    一.Linux系统上的文件类型 1.- :常规文件:在其它程序中用f表示.比如我们用ls -l命令查看的第一个内容 [root@localhost ~]# ls -l total -rw------- ...

  5. moco搭建json api网站用于接口测试

    java -jar moco-runner-1.0.0-standalone.jar http -p 12306 -c config/conf.json 配置文件 [ { "request& ...

  6. [Java] Spring boot2 整合 Thymeleaf 后 去除模板缓存

    Spring boot2 整合 Thymeleaf 后 去除模板缓存 网上好多文章只是简单粗暴的说,在 application.properties  做如下配置即可: #Thymeleaf cach ...

  7. 洛谷 P2872 【[USACO07DEC]道路建设Building Roads】

    P2872 传送门 首先 题目概括:题目让着求使所有牧场都联通.需要修建多长的路. 显然这是一道最小生成树板子题(推荐初学者做). 那我就说一下kruskal吧. Kruskal算法是一种用来查找最小 ...

  8. bat 添加环境变量

    修改环境变量 :输入 “set 变量名=变量内容”即可,比如将path设置为“d:\hacker.exe”,只要输入set path="d:\nmake.exe".注意,此修改环境 ...

  9. 【BigData】Java基础_数组

    什么是数组?数据是可以装一组数据的变量 1.定义数组 float[] arr1 = new float[10]; // 可以装10个float数据 int[] arr2 = new int[10]; ...

  10. webpack4.0中文文档踩坑记录

    一直没有正儿八经去看过webpack4.0的文档,前段时间工作比较轻松,于是就有了此文...面都这样一个问题:请问在您的开发生涯中,令你最痛苦最无奈的是什么?小生的回答只有一个:“阅读那些令人发指的文 ...