首页 > 技术文章 > 虚拟网卡mtu导致ssh登陆不上

double12gzh 2016-02-17 22:06 原文

虚拟网卡mtu导致ssh登陆不上 

问题描述

当前使用系统为 Ubuntu, 
登陆openvpn后ssh连接内网机器时,一直卡住无法登陆, 
该内网机器可以ping通,并且探测ssh端口也没问题:

# nc -zv 192.168.1.10 22
Connection to 192.168.1.10 22 port [tcp/sshd] succeeded!

而切换到windows系统,同样使用openvpn在ssh登陆到同个服务器无问题。

问题解决

重新回到ubuntu,使用ssh加上-vvv参数,检查登陆信息,发现是到这里卡住:

debug2: kex_parse_kexinit: none,
debug2: kex_parse_kexinit: none,
debug2: kex_parse_kexinit:
debug2: kex_parse_kexinit:
debug2: kex_parse_kexinit: first_kex_follows 0
debug2: kex_parse_kexinit: reserved 0
debug2: mac_setup: found hmac-md5
debug1: kex: server->client aes128-ctr hmac-md5 none
debug2: mac_setup: found hmac-md5
debug1: kex: client->server aes128-ctr hmac-md5 none
debug1: sending SSH2_MSG_KEX_ECDH_INIT
debug1: expecting SSH2_MSG_KEX_ECDH_REPLY

就是这一行debug1: expecting SSH2_MSG_KEX_ECDH_REPLY.

google搜了下,发现有两个可能的原因:

  • 一个是因为IPv6导致,这个可以排除;
  • 另外一个就是mtu问题,也即虚拟网卡mtu大于vpn服务器那边的网络mtu。

尝试修改openvpn的虚拟网卡mtu,发现真的可以成功登陆上:

利用ifconfig找到虚拟网卡的设备号:tun0

然后修改mtu为1200:

ifconfig tun0 mtu 1200

然后重新用ssh登陆服务器,能够成功登陆上。

问题解释

这里简单说下原因(可能不是很准确):

  1. 因为使用openvpn,本地主机与服务器的连接是通过tun0这个虚拟网卡设备;
  2. vpn服务器到目标服务器之间的网络设备(简称为目标网络)规定的MTU比tun0的MTU小;
  3. ssh 密钥交换阶段一次发送的数据一般大于 1500 字节,因此至少填满了一个 MTU;
  4. 通过tun0发出密钥交换信息,因为大于目标网络的MTU,而被丢弃;
  5. tun0设备的MTU设置为1200后,不会超过目标网络设定的MTU,因此可以正常交换密钥

推荐阅读