OpenVPN:如何缓解每个客户端的路径MTU问题?


14

我们在客户处安装了数十种嵌入式设备,所有这些设备都是我们的OpenVPN服务的所在地。总体而言,这可以正常工作,但是我们的一些客户在路径MTU方面存在严重问题。我们对客户修复网络的影响是有限的,因此我们需要OpenVPN对其进行处理。简而言之,我的问题是:

我如何减轻每个客户端基于某些客户端的低路径MTU,即不使用全局设置来适应所有客户端的最坏情况

请注意,我们的最坏情况非常糟糕:路径MTU 576会丢弃所有片段,不会自身进行片段化,也不会使用DF位。您会明白为什么我不想在全球范围内解决此问题。

OpenVPN的联机帮助提供了许多MTU的相关选项,最显着的--link-mtu, --tun-mtu, --fragment and --mssfix。但这也说

--link-mtu [...]除非您知道自己在做什么,否则最好不要设置此参数。

--tun-mtu [...]最好使用--fragment和/或--mssfix选项来处理MTU尺寸调整问题。

于是我开始尝试用--fragment--mssfix,但很快就意识到,至少前者必须设置不仅客户端,但也服务器端。然后,我通过看到服务器端的每个客户端的配置--client-config-dir,但它说

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

没有提及MTU选项!

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

  • 到底为什么是link-mtutun-mtu沮丧?这些选项潜在的问题是什么?请注意,我对低级IP标头处理非常满意。
  • link-mtu tun-mtu fragment mssfix为了工作,必须在服务器端镜像哪个选项?
  • link-mtu tun-mtu fragment mssfix可以在哪个选项中使用client-config-dir
  • 如果所有四个选项都必须在服务器端进行镜像,并且不能在内部使用client-config-dir:是否有其他方法可以解决每个客户端的低路径MTU?

笔记:

  • 我的部分问题已经在5年前在这里提出,但是那时还没有真正得到回答,因此我敢于重复它们。
  • OpenVPN服务器当前在Ubuntu 12.04上为2.2.1。我们正在准备在Ubuntu 14.04上升级到2.3.2
  • OpenVPN客户端在Debian 7.6上为2.2.1
  • 我很高兴自己亲自确定客户的路径MTU
  • 目前,我们无法测试太多服务器端。但是我们正在建立一个完整的独立测试台,应该尽快准备就绪。

感谢您提供任何有用的建议。


1
576?亲爱的老兄 自拨号以来,我还没有看到MTU这么低。那是在古老的串行链接上进行吗?
迈克尔·汉普顿

您可以运行两个OpenVPN服务器吗?也许您可以将两个服务器都运行在相同的公共IP地址上,并使用端口转发(或路由策略)将客户端定向到其他OpenVPN服务器,具体取决于它们是否位于已知有问题的网络中(由客户端列表确定) IP地址)。
kasperd 2014年

1
@MichaelHampton我也想知道。它的速度> 600kbit / s,RTT约为30ms,对我而言,它看起来不像是古老的串行设备。考虑到他们还有其他愚蠢的设置(例如,没有用“需要碎片处理”来响应DF),我想这只是另一种设置。我们告诉了他们,但还没有回音。
Nils Toedtmann 2014年

@kasperd有趣的主意。我可以运行多个OpenVPN服务器实例。对于不同的MTU范围,可能必须为3或4。服务器端每客户端NAT无法正常工作(我无法预测动态的公共客户端IP地址),但是无论如何我都必须更改MTU设置的客户端配置(正确吗?),因此我只需直接配置其他端口即可进入客户。-但这是维护噩梦,我想避免!
Nils Toedtmann 2014年

@NilsToedtmann您将使用哪些标准来检测哪些客户端受到影响?另一种方法是在客户端连接后在服务器上运行脚本。该脚本可以尝试对具有不同数据包大小的客户端IP地址执行ping操作,以确定哪些工作有效,哪些工作无效。然后,它可以插入iptables规则以减少往返于该客户端IP地址的所有SYN数据包中的MSS。
kasperd 2014年

Answers:


3

通过mssfix 1300在配置文件中添加选项,我解决了客户端的问题。

在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. 

我的解决方案的原始想法来自personalvpn.org


1
那么mssfix只能设置客户端吗?好吧,至少是这样。尽管它对UDP数据包没有帮助(这就是为什么我对其他选项感兴趣的原因,但至少建议的fragment设置也需要在服务器端进行设置)
Nils Toedtmann 2014年

2
可以在服务器以及客户端上添加mssfix。但是,较小的值将用于协商中
艾哈迈德(Ahmed)

2

由于缺乏答案,我现在发布的解决方案不是很好,但很简单:在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}

该解决方案的优点是每个客户端都可以设置其单独的MSS。

公认这是TCP-over-TCP,但在许多情况下应该表现良好

请注意,我仍然对不需要的解决方案非常感兴趣,proto tcp如果它们或多或少地满足了我概述的要求,我会将其标记为有效答案。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.