Obecnie mieszkam w kraju, który blokuje wiele stron internetowych i ma niewiarygodne połączenia sieciowe ze światem zewnętrznym. Mam dwa punkty końcowe OpenVPN (powiedzmy: vpn1 i vpn2) na serwerach Linux, których używam do obchodzenia zapory. Mam pełny dostęp do tych serwerów. Działa to całkiem dobrze, z wyjątkiem dużej utraty pakietów na moich połączeniach VPN. Ta utrata pakietów waha się między 1% a 30% w zależności od czasu i wydaje się mieć niską korelację, przez większość czasu wydaje się losowa.
Zastanawiam się nad skonfigurowaniem routera domowego (także w systemie Linux), który utrzymuje połączenia OpenVPN z obydwoma punktami końcowymi i wysyła wszystkie pakiety dwa razy, do obu punktów końcowych. vpn2 wyśle wszystkie pakiety z domu do vpn1. Zwrot ruchu zostanie wysłany zarówno bezpośrednio z vpn1 do domu, jak i przez vpn2.
+------------+
| home |
+------------+
| |
| OpenVPN |
| links |
| |
~~~~~~~~~~~~~~~~~~ unreliable connection
| |
+----------+ +----------+
| vpn1 |---| vpn2 |
+----------+ +----------+
|
+------------+
| HTTP proxy |
+------------+
|
(internet)
Dla jasności: wszystkie pakiety między serwerem macierzystym a serwerem proxy HTTP zostaną zduplikowane i wysłane różnymi ścieżkami, aby zwiększyć szanse, że jeden z nich dotrze. Jeśli oba pojawią się, pierwszą drugą można po cichu odrzucić.
Wykorzystanie przepustowości nie stanowi problemu, zarówno po stronie głównej, jak i po stronie punktu końcowego. VPN 1 i VPN 2 są blisko siebie (ping 3 ms) i mają niezawodne połączenie.
Wszelkie wskazówki na temat tego, jak można to osiągnąć za pomocą zaawansowanych zasad routingu dostępnych w systemie Linux?
źródło
Użyłem odpowiedzi podanej przez @ user48116 i działa to jak urok. Konfiguracja jest właściwie dość prosta!
UWAGA : Zaimplementowałem to z dwoma połączeniami tylko z jednym serwerem, ponieważ już to rozwiązało problem. Jeśli chcesz wypróbować konfigurację z dwoma serwerami, najprościej jest prawdopodobnie użyć przekierowania portów, aby przekierować port UDP z drugiego serwera na pierwszy i użyć tej samej receptury, jak opisano tutaj. Jednak sam tego nie testowałem.
Po pierwsze, upewnij się, że masz jądro 2.6 z obsługą łączenia (domyślnie we wszystkich współczesnych dystrybucjach) i zainstalowano ifenslave.
Następnie umieść to w swoim /etc/rc.local lub w innym preferowanym miejscu, ale upewnij się, że jest uruchomione przed uruchomieniem openvpn (ponieważ będzie próbował połączyć się z bond0):
Klient:
W razie potrzeby możesz dodać trochę routingu, upewnij się jednak, że wykonujesz wszystkie prawidłowe routing również z drugiej strony.
Serwer:
Utwórz skrypt /etc/openvpn/tap-up.sh (i nie zapomnij zaznaczyć go jako wykonywalnego za pomocą chmod a + x tap-up.sh):
Następnie dodaj bridge0a.conf i bridge0b.conf do / etc / openvpn / wraz ze wspólnym kluczem. Pliki są takie same dla aib, z wyjątkiem innego portu (na przykład użyj 3002 dla b). Zastąp 11.22.33.44 publicznym adresem IP twojego serwera.
Klient:
Serwer:
Nie zapomnij edytować pliku / etc / defaults / openvpn, aby upewnić się, że uruchomiono nowe konfiguracje VPN. Uruchom ponownie maszyny lub załaduj plik rc.local i ręcznie uruchom ponownie openvpn.
Teraz możesz przetestować konfigurację:
Jeśli wszystko pójdzie dobrze, a linia jest dobra, zobaczysz cztery odpowiedzi dla każdego pakietu ICMP: twoje pakiety są duplikowane po stronie lokalnej, a odpowiedzi na te dwa pakiety są duplikowane ponownie po stronie zdalnej. Nie będzie to stanowić problemu dla połączeń TCP, ponieważ TCP po prostu zignoruje wszystkie duplikaty.
Jest to problem w przypadku pakietów UDP, ponieważ to oprogramowanie zajmuje się obsługą duplikatów. Na przykład zapytanie DNS da cztery odpowiedzi zamiast oczekiwanych dwóch (i użyje czterokrotnie normalnej przepustowości dla odpowiedzi zamiast dwa razy):
Powodzenia!
źródło