OpenVPN:如何缓解每个客户端的pathMTU问题?

我们在客户端安装了数十个embedded式设备,所有这些都为我们的OpenVPN服务提供了回报。 总的来说,这样做的效果很好,但是我们的一些客户有严重的pathMTU问题。 我们对客户修复networking的影响是有限的,所以我们需要OpenVPN来处理它。 简而言之,我的问题是:

我该如何缓解一些客户端的每个客户端的低pathMTU,即不使用全局设置来适应所有客户端的最坏情况

请注意,我们最坏的情况下,它很糟糕:pathMTU 576,丢弃所有的片段,不片段本身,不尊重DF位。 你明白为什么我不想在全球范围内解决这个问题。

OpenVPN的联机手册提供了许多MTU相关的选项,最值得注意的是--link-mtu, --tun-mtu, --fragment and --mssfix 。 但它也说

–link-mtu […]最好不要设置这个参数,除非你知道你在做什么。

–tun-mtu […]最好使用–fragment和/或–mssfix选项来处理MTU大小问题。

所以我开始尝试使用--fragment--mssfix但很快就必须认识到,至less前者必须不仅设置在客户端,而且还要设置在服务器端 。 然后,我通过--client-config-dir查看了服务器端的每个客户端configuration,但它说

以下选项在客户端特定的上下文中是合法的: – push, – push-reset,–iroute,–ifconfig-push和–config。

没有提到MTU选项!

所以这里是我更具体的问题:

  • 为什么link-mtutun-mtu不鼓励? 这些选项有什么潜在的问题? 请注意,我对低级IP标头消除非常舒服。
  • 哪个选项link-mtu tun-mtu fragment mssfix必须在服务器端进行镜像才能工作?
  • 哪个选项可以在client-config-dir使用link-mtu tun-mtu fragment mssfix
  • 如果所有四个选项都必须镜像服务器端,并且不能在client-config-dir :是否有任何替代scheme可以对付每个客户端的低pathMTU?

笔记:

  • 我的部分问题已经在5年前问过了 ,但是当时还没有回答,所以我敢重复。
  • OpenVPN服务器目前在Ubuntu 12.04上是2.2.1。 我们正准备在Ubuntu 14.04上升级到2.3.2
  • 在Debian 7.6上,OpenVPN客户端是2.2.1
  • 我很高兴自己手动确定客户的path-MTU
  • 目前我们无法testing多less服务器端。 但是我们正在build造一个完整的独立testing平台,应该尽快准备好。

我很感激任何有用的build议。

我通过将mssfix 1300选项添加到configuration文件中解决了客户端的问题。

从openvpn手册页:

 --mssfix max Announce to TCP sessions running over the tunnel that they should limit their send packet sizes such that after OpenVPN has encapsulated them, the resulting UDP packet size that OpenVPN sends to its peer will not exceed max bytes. 

我的解决scheme的最初想法来自personalvpn.org

鉴于缺乏答案,我现在张贴一个不是很优雅,但很简单的解决scheme:在TCP上运行另一个OpenVPN实例“坏客户端”

 proto tcp 

并降低客户端上的TCP MSS,例如

 iptables -t mangle -A POSTROUTING -p tcp --tcp-flags SYN,RST SYN -o ${OUT_DEV} -j TCPMSS --set-mss ${PATH-MTU-MINUS-40} 

这个解决scheme的一个优点是每个客户端可以设置它的单独的MSS。

毫无疑问,这是TCP-over-TCP,但是在许多情况下 ,这应该performance得足够好 。

请注意,我仍然非常感兴趣的解决scheme,不需要proto tcp ,我会标记为有效的答案,如果他们或多或less履行我概述的要求。