概述
本文是一篇记述笔者在实际工作中,遇到的VPN网络的使用故障和排查过程的工作记录。笔者在复盘时发现,这个问题的场景可能对于经常使用VPN网络进行工作的系统开发和运维人员而言,还是比较典型的,也可能有很大的机会遇到同类的问题。所以进行了相关的记述和分析,希望对相关的读者有所帮助。
问题
由于工作的需求,笔者需要使用H3C的inode软件,来连接某政务云和业务系统平台提供的VPN系统,以进行业务系统的运维和管理工作。
这个VPN系统基于SSL VPN技术,它不能够直接在操作系统中直接配置和使用,需要先安装一个客户端软件(iNode智能客户端),然后启动这个软件,并执行相关的网络(SSL VPN Gateway)和安全配置,来建立VPN连接。在连接建立之后,就可以像使用正常网络一样,连接远程网络来进行工作了(上图)。
下面是此VPN系统软件的使用和操作界面:
这个软件的安装和配置过程,并不是本文主要讨论的重点。坦率的讲,这个软件不是很好用,兼容性不是很好(好像不支持虚拟机环境),安装和配置过程也是经常出现各种问题。但不管怎么样,笔者在自己的笔记本电脑和Windows 11系统上,还是成功的进行了安装和配置,也可以顺利的进行VPN的连接。
但是,在笔者的应用环境中,遇到了一些问题。VPN可以连接和登录,但是在连接建立之后,笔者也可以使用SSH软件,连接远程的服务器系统,也可以进行简单的命令行操作。但当需要使用如cat、vi等需要操作文件内容的命令的时候,命令行界面就卡住了,不能够顺利输出或者显示编辑界面,当前这个界面,也不能够再继续操作比如退出命令了。
这个问题困扰了笔者很久。因为在此之前,笔者是使用一个已经离职的同事的电脑,都是可以正常工作的。但当笔者想要迁移到自己的开发环境中,就出现了这个问题。原来以为是网络、系统配置或者是VPN软件、SSH软件的问题,但经过各种排列组合的设置,始终没有解决,都是命令行卡死的故障。
更令人无语的是,笔者咨询iNode的客服和相关技术人员,他们都只让你重新配置、安装新版的客户端软件。从事后看来,这应该是一个比较普遍的问题,但他们好像并不了解和理解这个问题的原因和可能的解决方案。对于一个大型网络科技公司,政务云的主要供应商和服务商,这是有点说不过去的。
后来,在互联网上搜索相关问题和解决方案的时候,无意中看到有人提到不适当的MTU设置,可能会导致网络无法正常工作,表象就是操作如cat、vi这种需要输出大量文本的时候会卡住。解决方案就是适当调整网络MTU的设置。遵循这个思路,经过一些测试和配置,笔者顺利的解决了这个问题。
MTU (Maximum Transmission Unit,最大网络传输单元)
在了解和实施解决方案之前,我们先来了解这个问题涉及的的一个核心概念,就是MTU。以下部分内容来自KEMI,由笔者补充整理,鸣谢一下。
MTU是网络通信中的一个重要概念,全称为"最大传输单元",指的是网络链路层能够传输的最大数据帧大小,以字节为单位。通常信息在网络上进行传输的时候,是以数据包的形式进行传输的。当数据包大小超过MTU时,网络设备会对数据包进行分片处理,这需要增加额外的资源消耗。通过合理设置MTU,可以减少分片操作,提高传输效率。但如果MTU值过大,虽然传输效率较高,但数据包延迟和错误率也会增加;而如果MTU值过小,则需要传输更多的数据包,增加设备处理负担。
MTU的设置的主要作用就是通过选择适当的数值,来在不同类型或者特性的网络中,优化传输效率。这个设置本质上是一个选择和平衡,没有绝对的好坏,主要是适配当前的网络传输环境和应用特性。
所以,一般认为,在不同的网络环境中,应当选择和设置不同的MTU。如通常以太网建议的值为1500(这也是操作系统和网络设备的默认值);而对于VPN环境,可能需要稍小一点,为1400;蓝牙设备的更小,为600。
笔者记得,在比较早的ADSL连接的时代,这个MTU还是一个比较重要的网络参数,需要在配置的时候进行检查和设置。但随着网络技术的成熟,系统和设备性能和适应性更强了,更强调易用性,这个检查工作就不是特别需要关注了。通常系统的默认设置都可以保证正常进行工作,只不过可能稍微影响最佳性能而已。所以慢慢的,这个设置就没有人特别关注了。
所以,当发现这个设置不当,甚至会影响网络正常使用的时候,笔者也是比较诧异的。归根结底,还是这个网络VPN系统的易用性和可靠性不够好,需要更多的设置和维护工作。
在理解了问题的基本缘由和逻辑之后,我们就可以更好的理解下述的检查和设置的实际操作过程了。
系统检查和配置
先简单的说明一下操作环境。
笔者使用的是Windows系统,已经安装好了iNode客户端软件,并且已经配置好网关地址、用户名和密码等连接信息,并且可以正常的建立VPN连接。
成功建立连接之后,VPN软件会在系统中,创建一个虚拟的网卡,并且通过这个网卡,和远程网络进行通信。我们前面提到的MTU网络配置,就需要针对这个虚拟网卡进行设置。这些检查和设置工作,都需要通过命令行方式,在在具有管理员权限的Power Shell环境中执行。
具体的检查和配置的基本过程如下:
-
- 检查当前活动的网络界面
这一步的主要目的是获取VPN所使用的虚拟网卡的名称。使用的命令是ipconfig,如下:
shell
ipconfig /all
...
以太网适配器 以太网 7:
连接特定的 DNS 后缀 . . . . . . . :
描述. . . . . . . . . . . . . . . : iNode VPN Virtual NIC
物理地址. . . . . . . . . . . . . : 02-50-F2-00-00-02
DHCP 已启用 . . . . . . . . . . . : 否
自动配置已启用. . . . . . . . . . : 是
本地链接 IPv6 地址. . . . . . . . : fe80::afd9:ccf9:ba76:77b4%16(首选)
IPv4 地址 . . . . . . . . . . . . : 172.x.x.x(首选)
子网掩码 . . . . . . . . . . . . : 255.255.255.0
默认网关. . . . . . . . . . . . . :
DHCPv6 IAID . . . . . . . . . . . : 268587250
DHCPv6 客户端 DUID . . . . . . . : 00-01-00-01-29-14-1A-5C-60-F2-62-BB-34-E7
TCPIP 上的 NetBIOS . . . . . . . : 已启用
...
通过相关的描述信息(iNode VPN Virtual NIC),这里可以得到当前笔者的VPN使用的虚拟网卡在系统中的名称为: "以太网 7"。这里还可以看到相关的网络配置信息,如VPN连接后的网络地址,就是远程网络的一部分。
-
- 检查VPN网络的MTU配置
使用netsh命令,可以查看网卡的工作状态,包括MTU配置。这个命令的使用方式如下:
js
// 2. 检查网卡的配置参数
netsh interface ipv4 show subinterfaces
MTU MediaSenseState 输入字节 输出字节 接口
---------- --------------- ------------ ------------ -------------
4294967295 1 0 281946 Loopback Pseudo-Interface 1
1500 5 0 0 VPN88 - VPN Client
1500 5 0 0 本地连接* 1
1500 5 0 0 本地连接
1500 5 0 0 本地连接* 2
1500 1 0 254153 以太网 6
1500 1 34038190 318245926 以太网 3
1500 5 0 0 蓝牙网络连接
1500 1 94704 232636 以太网 7
可以看到,VPN网卡(以太网 7)当前的MTU的配置数值为1500,这也是操作系统默认的MTU配置。 我们通过前面的讨论已经知道,这个配置对于VPN网络可能是不合适的。需要进行修改。
-
- 估算合适的MTU数值
经过简单的资料查证,笔者发现一般的建议是应当根据不同的网络类型,选择合适的MTU数值。比如以太网一般的建议是1500(也是很多操作系统的默认数值);VPN建议为1400等等。
另外,还可以使用ping命令,来检查当前的网络环境中,更合适的参数设置。这个检查过程基本是,从默认或者建议值开始,先检查这个默认值,看是否能够正常响应。如果不能正常响应(DF设置提示),则使用当前值减去28的倍数,依次进行检查,直到得到正常响应,然后加上28就可以得到合适的设置。这里的28是数据包包头的大小,应当在计算时考量进去。
以笔者的环境为例,我们从VPN网络推荐的1400开始:
js
ping -f -l 1400 172.x.x.x
正在 Ping 172.xxx 具有 1400 字节的数据:
需要拆分数据包但是设置 DF。
需要拆分数据包但是设置 DF。
.... 忽略中间检查过程
ping -f -l 1190 172.xxx
正在 Ping 172.64.118.26 具有 1190 字节的数据:
需要拆分数据包但是设置 DF。
需要拆分数据包但是设置 DF。
需要拆分数据包但是设置 DF。
ping -f -l 1162 172.xxx
正在 Ping 172.64.118.26 具有 1162 字节的数据:
来自 172.xxx 的回复: 字节=1162 时间=21ms TTL=127
来自 172.xxx 的回复: 字节=1162 时间=9ms TTL=127
可以看到,最大的一个正常响应的数值是1162,所以笔者网络环境中比较合适的MTU数值应当1190(1163+28)。
-
- 修改VPN网卡的MTU参数
在知晓了需要设置的MTU参数值后(本例中为1190),就可以使用netsh命令的设置命令,来对这个参数进行设置了,命令如下:
shell
netsh interface ipv4 set subinterface "以太网 7" mtu=1190 store=persistent
确定。
在这个命令中,需要指定网卡的名称,和设置MTU的数值。还可以选择告知操作系统保存这一设置。这样就不需要在系统重启之后,再次进行设置了。
设置完成之后,应当能够看到"确定"的消息。当然,还应当使用步骤2中的命令,再次检查一下网卡的设置状态。
完成这一系列操作之后,笔者使用VPN客户端连接网络之后,就可以正常的使用如SSH或者WinSCP等软件,正常的进行日常的系统运维工作了,也没有出现或命令或者系统卡住的现象。说明这些问题,确实是MTU设置不当引起的。
小结
至此,文章开始的问题已经得到了很好解决,这里简单小结一下。
本文探讨的主要问题是,iNode VPN连接之后,SSH虽然能够正常连接,但无法正常工作,表象为使用cat、vi等命令时,界面卡死并且无法响应或者退出。这个问题可能是由于VPN网络的MTU设置不当引起的。本文还叙述了在Windows环境中如何进行相关的检查和配置。作为背景知识,本文还讨论了MTU的基本概念和主要作用。