Bu sorunun sonuna yeni ayrıntılar eklendi; nedeni sıfırlamam olasıdır.
tap
Modda bir UDP OpenVPN tabanlı VPN var (ihtiyacım tap
çünkü VPN ile tun
ağ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 cat
uzun 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. fragment
Direktifin 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 tracepath
yardı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.90
hedefinden 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 tracepath
bağ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 cat
bağ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.
tun
ağ ü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