web-dev-qa-db-ja.com

OpenVPN:パスMTUの問題をクライアントごとに軽減する方法は?

私たちは何十もの組み込みデバイスを顧客にインストールしており、そのすべてがOpenVPNサービスへのコールホームです。一般的には問題なく動作しますが、一部のお客様には、パスMTUの問題が深刻です。ネットワークを修正するためのお客様への影響は限られているため、OpenVPNで対処する必要があります。簡単に言えば、私の質問は:

すべてのクライアントの最悪のケースに対応するグローバル設定を使用せずに、クライアントごとのベースで一部のクライアントの低パスMTUを緩和するにはどうすればよいですか

最悪の場合はかなり悪いことに注意してください。パスMTU 576はすべてのフラグメントをドロップし、それ自体はフラグメント化せず、DFビットを受け入れません。この問題をグローバルに解決したくない理由がわかります。

OpenVPNのマンページ は、MTUに関連する多数のオプション、特に--link-mtu, --tun-mtu, --fragment and --mssfixを提供しています。しかしそれはまた言います

--link-mtu [...]何をしているかわからない場合は、このパラメーターを設定しないことをお勧めします。

--tun-mtu [...] MTUサイジングの問題に対処するには、-fragmentまたは--mssfixオプションを使用するのが最適です。

だから私は--fragment--mssfixの実験を始めましたが、少なくとも前者はクライアント側だけでなく サーバー側も に設定する必要があることをすぐに認識しなければなりませんでした。次に、--client-config-dirを介してサーバー側のクライアントごとの構成を調べましたが、

次のオプションは、クライアント固有のコンテキストで有効です:--Push、-Push-reset、-iroute、-ifconfig-Push、および--config。

MTUオプションについての言及なし!

だからここに私のより具体的な質問があります:

  • なぜlink-mtuおよびtun-mtuが推奨されないのですか?これらのオプションの潜在的な問題は何ですか?低レベルのIPヘッダーの変更にかなり慣れていることに注意してください。
  • どのオプションlink-mtu tun-mtu fragment mssfixが機能するためにサーバー側でミラーリングする必要がありますか?
  • link-mtu tun-mtu fragment mssfixで使用できるオプションclient-config-dir
  • 4つのオプションすべてをサーバー側でミラーリングする必要があり、client-config-dir内で使用できない場合:クライアントごとの低パスMTUに対処するための代替手段はありますか?

ノート:

  • 私の質問の一部は5年前に既に尋ねられました here 、しかし、それらは当時は本当に答えられていなかったので、私はあえてそれらを複製します。
  • OpenVPNサーバーは現在Ubuntu 12.04上の2.2.1です。 Ubuntu 14.04で2.3.2へのアップグレードを準備しています
  • OpenVPNクライアントはDebian 7.6の2.2.1です
  • お客様のパスMTUを自分で手動で決定したい
  • 現在、多くのサーバー側をテストすることはできません。ただし、完全に独立したテストベッドを構築しています。まもなく準備が整います。

有益な助言に感謝します。

18
Nils Toedtmann

オプションmssfix 1300を構成ファイルに追加することで、クライアント側の問題を解決しました。

Openvpnのmanページから:

--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 から来ました

6
Oz123

答えがないので、私は今、非常にエレガントではないが単純なソリューションを投稿しています:別のOpenVPNインスタンスをTCP for "bad clients"で実行します

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を必要としない非常に興味のあるソリューションであることに注意してください。概説された要件をある程度満たす場合は、それらを有効な回答としてマークします。

2
Nils Toedtmann