OpenVPN ağı üzerinden TCP bağlantısının donmasını nasıl önleyebilirim?


19

Bu sorunun sonuna yeni ayrıntılar eklendi; nedeni sıfırlamam olasıdır.

tapModda bir UDP OpenVPN tabanlı VPN var (ihtiyacım tapçünkü VPN ile tunağlarla mümkün görünmeyen çok noktaya yayın paketlerini geçirmem gerekiyor ), İnternet'teki birkaç istemciyle. VPN üzerinden sık sık TCP bağlantısı donuyor. Yani, bir TCP bağlantısı kuracağım (örneğin bir SSH bağlantısı, ancak diğer protokollerin benzer sorunları var) ve oturum sırasında bir noktada, trafiğin bu TCP oturumu üzerinden iletilmesini durduracağı anlaşılıyor.

Bu ls, bir SSH oturumunda bir komut yürütürsem veya catuzun bir günlük dosyası oluşturursam gibi büyük veri aktarımlarının gerçekleştiği noktalarla ilgili gibi görünmektedir . Bazı Google aramaları Sunucu Hatası'nda bunun gibi bir dizi cevabı ortaya çıkarır, bu da olası suçlunun bir MTU sorunu olduğunu gösterir: yoğun trafik dönemlerinde VPN, VPN uç noktaları. Yukarıda bağlantılı yanıt, sorunu azaltmak için aşağıdaki OpenVPN yapılandırma ayarlarının kullanılmasını önerir:

fragment 1400
mssfix

Bu, VPN'de kullanılan MTU'yu 1400 bayt ile sınırlamalı ve bundan daha büyük paketlerin oluşturulmasını önlemek için TCP maksimum segment boyutunu düzeltmelidir. Bu, sorunu biraz hafifletiyor gibi görünüyor, ancak hala sık sık donmaları görüyorum. fragmentDirektifin argümanları olarak bir dizi boyutu denedim : 1200, 1000, 576, hepsi benzer sonuçlarla. Böyle bir sorunu tetikleyebilecek iki uç arasında garip bir ağ topolojisi düşünemiyorum: VPN sunucusu doğrudan İnternet'e bağlı bir pfSense makinesinde çalışıyor ve istemcim de doğrudan başka bir konumda İnternet'e bağlı.

Bulmacanın bir başka garip parçası: Eğer tracepathyardımcı programı çalıştırırsam , o zaman bu soruna bant yardımı yapıyor gibi görünüyor. Örnek bir çalışma şöyle görünür:

[~]$ tracepath -n 192.168.100.91
 1:  192.168.100.90                                        0.039ms pmtu 1500
 1:  192.168.100.91                                       40.823ms reached
 1:  192.168.100.91                                       19.846ms reached
     Resume: pmtu 1500 hops 1 back 64 

Yukarıdaki çalıştırma VPN'deki iki istemci arasında: İzlemeyi 192.168.100.90hedefinden başlatarak başlattım 192.168.100.91. Her iki istemci de fragment 1200; mssfix;bağlantıda kullanılan MTU'yu sınırlamak amacıyla yapılandırıldı . Yukarıdaki sonuçlar tracepath, iki istemci arasında 1500 baytlık bir MTU yolu tespit edebildiğini düşündürmektedir . OpenVPN konfigürasyonunda belirtilen parçalanma ayarları nedeniyle biraz daha küçük olacağını varsayıyorum. Bu sonucu biraz garip buldum.

Ancak daha da garip: Eğer durmuş durumda bir TCP bağlantım varsa (örneğin ortasında dondurulan bir dizin listesiyle bir SSH oturumu), o zaman yukarıda gösterilen komutu yürütmek tracepathbağlantının yeniden başlamasına neden olur ! Bunun neden böyle olacağına dair makul bir açıklama bulamıyorum, ancak bunun nihayetinde sorunu ortadan kaldırmak için bir çözüme işaret ediyor olabileceğini hissediyorum.

Başka şeylerin denemesi için önerisi olan var mı?

Düzenleme: Ben geri gelip biraz daha bu baktım ve sadece daha karıştırıcı bilgi bulduk:

  • OpenVPN bağlantısını yukarıda gösterildiği gibi 1400 baytta parçaya ayarladım. Ardından, İnternet üzerinden VPN'ye bağlandım ve duraklama sırasında VPN sunucusuna gönderilen UDP paketlerine bakmak için Wireshark kullandım. Hiçbiri belirtilen 1400 bayt sayısından fazla değildi, bu yüzden parçalanma düzgün çalışıyor gibi görünüyor.

  • 1400 baytlık bir MTU'nun bile yeterli olduğunu doğrulamak için, aşağıdaki (Linux) komutunu kullanarak VPN sunucusuna ping attım:

    ping <host> -s 1450 -M do
    

    Bu (inanıyorum) parçalanma devre dışı 1450 baytlık bir paket gönderir (En azından 1600 bayt gibi açık bir şekilde çok büyük bir değere ayarlarsam işe yaramadığını doğruladım). Bunlar gayet iyi çalışıyor; Ben hiçbir sorun ile ana bilgisayardan cevap alırsınız.

Yani, belki de bu bir MTU sorunu değildir. Başka ne olabileceği konusunda kafam karıştı!

Edit 2: Tavşan deliği daha da derinleşiyor: Şimdi sorunu biraz daha izole ettim. VPN istemcisinin kullandığı işletim sistemi ile ilgili gibi görünüyor. Sorunu en az üç Ubuntu makinesinde (sürüm 12.04 - 13.04) başarıyla çoğalttım. Bir SSH bağlantısı donmasını bir dakika içinde güvenilir bir şekilde çoğaltabilirim cat.

Ancak , aynı testi istemci olarak bir CentOS 6 makinesi kullanarak yaparsam, sorunu görmüyorum! Ubuntu makinelerinde kullandığımla aynı OpenVPN istemci sürümünü kullanarak test ettim. Ben yapabilirsiniz catbağlantısı dondurma görmeden saatlerce log dosyaları. Bu, nihai neden hakkında bir fikir veriyor gibi görünüyor, ancak bu içgörünün ne olduğundan emin değilim.

Wireshark kullanarak VPN üzerindeki trafiği inceledim. Ben bir TCP uzmanı değilim, bu yüzden kanlı ayrıntıların ne yapılacağından emin değilim, ama özünde, bir noktada, UDP paketinin İnternet bağlantısının sınırlı bant genişliği nedeniyle düşmesi, içinde TCP yeniden iletimlerine neden olması VPN tüneli. CentOS istemcisinde, bu yeniden iletimler düzgün şekilde gerçekleşir ve işler mutlu bir şekilde devam eder. Bununla birlikte, Ubuntu istemcileriyle bir noktada, uzak uç aynı TCP segmentini tekrar tekrar iletmeye başlar (her yeniden iletim arasında iletim gecikmesi artar). İstemci, her yeniden iletime geçerli bir TCP ACK'ya benzeyen bir şey gönderir, ancak uzak uç yine de aynı TCP segmentini periyodik olarak iletmeye devam eder. Bu reklam sonsuzluğunu ve bağlantı duraklarını genişletir. Buradaki sorum şu olurdu:

  • TCP sorununun temel nedeninin nasıl giderileceği ve / veya belirleneceği konusunda herhangi bir tavsiyesi var mı? Uzak uç, VPN istemcisi tarafından gönderilen ACK mesajlarını kabul etmiyor gibi.

CentOS düğümü ve çeşitli Ubuntu sürümleri arasındaki ortak bir fark, Ubuntu'nun çok daha yeni bir Linux çekirdeği sürümüne sahip olmasıdır (Ubuntu 12.04'te 3.2'den 13.04'te 3.8'e). Yeni çekirdek hatalarına bir işaretçi olabilir mi? Eğer öyle olsaydı, sorunu yaşayan tek kişi ben olamayacağımı varsayıyorum; Bunun özellikle egzotik bir düzen gibi göründüğünü sanmıyorum.


Çok noktaya yayın paketlerini tunağ üzerinden yönlendirmek, çok noktaya yayın yönlendirme cinlerini ( pimd gibi ) çalıştırmak ve OpenVPN sunucusunun --topology"alt ağ" olarak ayarlanmış seçenekleri kullanmasını sağlamakla mümkün olmalıdır - kılavuzuna
kostix

VPN istemcisi veya sunucusu bu sorunlar sırasında günlüklerde herhangi bir şey gösteriyor mu?
Mart'ta mgorven

@mgorven: Kesinlikle istemcide değil. Sunucu günlüklerine ulaşmak için biraz çalışmam gerekecek.
Jason R

@mgorven: Sonunda buna geri dönme şansım oldu. Bu olduğunda istemci veya sunucu günlüklerinde hiçbir şey yok. Gerçekten şaşırtıcı.
Jason R

1
Donduran istemcilerin ICMP parçalanması gereken paketleri bırakan yerel güvenlik duvarlarına sahip olmaları, burada olmayanlar, bulamadıkları ve bu nedenle doğru şekilde parçalanma olasılıkları var mı?
MadHatter Monica

Yanıtlar:


10

Bu komut benim için çözer:

$ sudo ip link set dev tun0 mtu 1350 && echo ":)"

Tun0 ayarlarını aşağıdakileri kullanarak doğrulayabilirsiniz:

$ ip a s

Şerefe!


İstemci veya sunucu tarafında mı ??
Matt

Çok teşekkürler! @Matt, sorunun bulunduğu yere bağlıdır. Bizim için sunucudaydı, ancak istemci tarafında olabilir. Ayrıca değer değişebilir, ping <host> -s 1350 -M dodoğru değeri bulmak için test edebilirsiniz
Eino Gourdin

2

TCP'de Pencere Ölçeklendirmeyi şu şekilde devre dışı bırakın:

sysctl -w net.ipv4.tcp_window_scaling=0

Bunu yaptıktan sonra, VPN üzerinden Debian / Ubuntu Systems için SSH benim için iyi çalışıyor.


0

Putty kullanan Windows'da, vpn bağlantısı için yerel bağlantıya giderek MTU'yu değiştirmeniz gerekir -> ağ arabirimindeki ayrıntılar (TAP windows Bağdaştırıcısı veya bunun gibi bir şey) -> Gelişmiş -> Özellikler -> MTU (bir şeye değiştir) 1500'den düşük). Yeniden bağlanmak zorunda kalabilirsiniz. Windows ve Putty'de benim için çalıştı


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.