OpenVPN: Bagaimana cara mengurangi masalah jalur MTU berdasarkan per-klien?

14

Kami memiliki lusinan perangkat tertanam yang dipasang di pelanggan, semuanya menelepon ke rumah ke layanan OpenVPN kami. Itu bekerja dengan baik secara umum, tetapi beberapa pelanggan kami memiliki masalah jalur MTU yang parah. Pengaruh kami pada pelanggan untuk memperbaiki jaringan mereka terbatas, jadi kami membutuhkan OpenVPN untuk menghadapinya. Singkatnya, pertanyaan saya adalah:

Bagaimana saya bisa mengurangi MTU jalur rendah dari beberapa klien pada basis per-klien, yang tanpa menggunakan pengaturan global mengakomodasi kasus terburuk untuk semua klien

Perhatikan bahwa kasus terburuk kami sangat buruk: jalur MTU 576, menjatuhkan semua fragmen, tidak memecah fragmen itu sendiri, tidak menghormati DF-bit. Anda mengerti mengapa saya memilih untuk tidak memecahkan masalah ini secara global.

The OpenVPN manualnya menawarkan sejumlah MTU terkait pilihan, terutama --link-mtu, --tun-mtu, --fragment and --mssfix. Tetapi dikatakan juga

--link-mtu [...] Lebih baik tidak mengatur parameter ini kecuali Anda tahu apa yang Anda lakukan.

--tun-mtu [...] Yang terbaik adalah menggunakan opsi --fragment dan / atau --mssfix untuk menangani masalah ukuran MTU.

Jadi saya mulai bereksperimen dengan --fragmentdan --mssfixtetapi segera harus menyadari bahwa setidaknya yang pertama harus ditetapkan tidak hanya sisi klien, tetapi juga sisi server . Saya kemudian melihat ke konfigurasi server-side per-client melalui --client-config-dirtetapi katanya

Opsi berikut ini legal dalam konteks spesifik klien: --push, --push-reset, --iroute, --ifconfig-push, dan --config.

Tidak disebutkan opsi MTU!

Jadi, inilah pertanyaan saya yang lebih spesifik:

  • Mengapa sebenarnya link-mtudan tun-mtukecil hati? Apa potensi masalah dengan opsi ini? Perhatikan bahwa saya cukup nyaman dengan munging header IP tingkat rendah.
  • Manakah dari opsi yang link-mtu tun-mtu fragment mssfixharus dicerminkan di sisi server agar dapat berfungsi?
  • Opsi mana yang link-mtu tun-mtu fragment mssfixbisa digunakan client-config-dir?
  • Jika keempat opsi harus dicerminkan sisi server, dan tidak dapat digunakan di dalam client-config-dir: Apakah ada alternatif untuk memerangi MTU jalur rendah per klien?

Catatan:

  • Sebagian dari pertanyaan saya sudah ditanyakan 5 tahun yang lalu di sini , tetapi belum benar-benar dijawab saat itu, maka saya berani menggandakannya.
  • Server OpenVPN saat ini 2.2.1 di Ubuntu 12.04. Kami sedang mempersiapkan peningkatan ke 2.3.2 pada Ubuntu 14.04
  • Klien OpenVPN 2.2.1 pada Debian 7.6
  • Saya senang menentukan jalur pelanggan-MTU sendiri secara manual
  • Saat ini kami tidak dapat menguji banyak sisi server. Tapi kami sedang membangun test bed terpisah yang lengkap, harus siap segera.

Saya berterima kasih atas saran yang membantu.

Nils Toedtmann
sumber
1
576? Ya Tuhan. Saya belum pernah melihat MTU yang rendah sejak hari dialup. Apakah itu melewati tautan serial kuno?
Michael Hampton
Bisakah Anda menjalankan dua server OpenVPN? Mungkin Anda dapat menjalankan kedua server pada alamat IP publik yang sama dan menggunakan penerusan port (atau kebijakan perutean) untuk mengarahkan klien ke server OpenVPN yang berbeda tergantung pada apakah mereka berada di jaringan bermasalah yang diketahui atau tidak (sebagaimana ditentukan oleh daftar klien Alamat IP).
kasperd
1
@MichaelHampton aku bertanya-tanya juga. Ini> 600kbit / s dan RTT ~ 30ms, tidak terlihat seperti serial kuno bagi saya. Mengingat bahwa mereka memiliki pengaturan bodoh lainnya (mis. Tidak menanggapi DF dengan 'fragmentasi diperlukan'), saya kira ini hanyalah salah satu. Kami memberi tahu mereka, tetapi belum mendengar kabar.
Nils Toedtmann
@kasperd ide menarik. Saya bisa menjalankan beberapa contoh server OpenVPN. Harus memiliki mungkin 3 atau 4, untuk rentang MTU yang berbeda. Server-side per-client NAT tidak akan berfungsi (saya tidak dapat memprediksi alamat IP klien publik yang dinamis), tetapi saya harus mengubah konfigurasi klien tetap untuk pengaturan MTU (benar?), Jadi saya hanya akan mengkonfigurasi port langsung yang berbeda ke dalam klien. - Tapi itu akan menjadi mimpi buruk pemeliharaan yang saya ingin hindari!
Nils Toedtmann
@NilsToedtmann Kriteria apa yang akan Anda gunakan untuk mendeteksi klien mana yang terpengaruh? Satu pendekatan lain bisa menjalankan skrip di server setelah klien terhubung. Script dapat mencoba untuk melakukan ping alamat IP klien dengan berbagai ukuran paket untuk mengetahui mana yang berhasil dan yang tidak. Kemudian ia bisa memasukkan iptablesaturan untuk mengurangi MSS pada semua paket SYN ke atau dari alamat IP klien itu.
kasperd

Jawaban:

3

Saya memecahkan masalah di sisi klien dengan menambahkan opsi mssfix 1300ke file konfigurasi.

Dari halaman manual 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. 

Ide orisinal untuk solusi saya berasal dari personalvpn.org

Oz123
sumber
1
Jadi mssfixdapatkah mengatur sisi klien saja? Yah, setidaknya itu sesuatu. Itu tidak membantu dengan paket-paket UDP (itulah sebabnya saya tertarik pada opsi-opsi lain, tetapi setidaknya yang direkomendasikan fragmentharus diatur juga pada sisi-server)
Nils Toedtmann
2
mssfix dapat ditambahkan di server maupun klien. Namun nilai yang lebih kecil akan digunakan dalam negosiasi
Ahmed
2

Mengingat kurangnya jawaban, saya memposting sekarang solusi yang tidak terlalu elegan, tetapi sederhana: Jalankan contoh OpenVPN lain pada TCP untuk "klien buruk"

proto tcp

dan turunkan TCP MSS pada klien, mis

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

Keuntungan dari solusi ini adalah bahwa setiap klien dapat mengatur masing-masing MSS.

Ini memang diakui TCP-over-TCP, tetapi itu harus berkinerja cukup baik di banyak skenario .

Perhatikan bahwa saya masih merupakan solusi yang sangat menarik yang tidak memerlukan proto tcp, dan saya akan menandainya sebagai jawaban yang valid jika kurang lebih memenuhi persyaratan yang saya uraikan.

Nils Toedtmann
sumber