Opcje zarządzania przepustowością we wspólnym połączeniu internetowym

13

Przesłanka:

Lokalizacja na wsi, niewiele opcji dla połączeń internetowych o dużej przepustowości. Zdecydowanie najszybszy jest Internet satelitarny, ale jest drogi (zarówno koszt sprzętu, jak i miesięczny i ma wady opóźnień), więc wiele gospodarstw domowych chciałoby się nim podzielić.

Jest to samo w sobie proste - skonfiguruj router z podsiecią dla każdego gospodarstwa domowego (sieci VLAN lub portów fizycznych), zablokuj ruch między nimi i skonfiguruj modem tak, aby kierował się do tych podsieci lub skonfiguruj podwójną translację NAT.

Problem:

Sposób normalnego działania protokołu TCP oznacza, że ​​każde połączenie TCP uzyska mniej więcej 1 / n dostępnej przepustowości, gdzie n jest liczbą połączeń. Więc jeśli jedno gospodarstwo domowe / użytkownik utworzy wiele połączeń, uzyska większy udział w ogólnym połączeniu. To nie jest szczególnie uczciwe - przy nasyconym łączu każde gospodarstwo domowe powinno otrzymać równy udział. Z drugiej strony, gdy nikt inny nie korzysta z połączenia, powinno być możliwe wykorzystanie pełnej przepustowości.

Załóżmy na przykład, że 4 gospodarstwa domowe mają połączenie typu down down o przepustowości 12 Mb / s. Jeśli jeden z nich pobiera / przesyła strumieniowo / cokolwiek innego, powinien mieć możliwość korzystania z pełnego 12 Mb / s (lub wystarczająco blisko). Jeśli 2 gospodarstwa domowe korzystają z połączenia, powinny uzyskać 6 Mb / s, niezależnie od tego, czy jedno gospodarstwo pobiera 1 plik, a drugie 11. (bez zarządzania przepustowością każdy plik pobierałby w przybliżeniu 1 Mb / s) 3 gospodarstwa domowe uzyskać 4 Mb / s każdy i tak dalej.

Co do tej pory wypracowałem:

Najlepszą lokalizacją do wdrożenia takiej polityki (dla dalszego rynku) byłby drugi koniec wąskiej rury, tj. U dostawcy usług internetowych. Oczywiście nie jest to możliwe w tym przypadku, więc dobrze byłoby móc to jakoś przybliżyć. Ale jak? Czy istnieją gotowe routery, które obsługują coś takiego? Czy mogę skonfigurować do tego system Linux lub BSD? Nie musi być kuloodporny - źle zachowujący się serwer TCP lub agresywna usługa UDP może prawdopodobnie obejść wszystko, co mogę zrobić na moim końcu - ale powinien działać w typowym przypadku większości ruchu składającego się z dużej liczby zgodnych z RFC Połączenia TCP.

Żeby było jasne, nie mówię o ustalaniu priorytetów określonych aplikacji, ale raczej o agregowaniu ruchu do / z określonych urządzeń Ethernet lub zakresów adresów IP. Nadawanie niektórym ruchom wyższego priorytetu niż innym ruchom wydaje się być dobrze obsługiwane, ale sytuacja jest mniej jasna, gdy próbuje się równomiernie przydzielić przepustowość klasom ruchu.

W sieci znajduje się wiele źle napisanych / bezmyślnie zwróconych / w inny sposób niedoinformowanych informacji na temat kształtowania ruchu. Dokumentacja sprzętu routera jest strasznie nieokreślona, ​​więc wydaje mi się, że biegam w kółko.

Jak rozumiem, sposobem na zachowanie TCP w ten sposób jest w efekcie symulacja nieco węższej potoku niż jest w rzeczywistości dostępna i sztuczne upuszczanie pakietów, aby się wycofała. Myślę więc, że byłoby dość proste dać każdemu dokładnie 3 Mb / s w powyższym przykładzie poprzez sztuczne upuszczenie jakichkolwiek dodatkowych pakietów. To tak naprawdę nie wykorzystuje efektywnie połączenia, ponieważ przez większość czasu jest wolna pojemność.

Czy istnieje sposób na zrobienie tego, o co proszę? Czy robię to źle? Jestem (a raczej pytane gospodarstwa domowe) chętnie wydaje na to pieniądze - niezależnie od tego, czy jest to router / urządzenie w przystępnej cenie, czy zwykłe urządzenie do dystrybucji dystrybucji Linux lub BSD.

pmdj
źródło

Odpowiedzi:

4

Gdybym miał zbudować coś, aby rozwiązać ten problem, skonfigurowałbym to:

Podamy tutaj przykład 4 komputerów udostępniających jedno łącze. Sieć miałaby następujący kształt:

{ ISP }=========[ SOHO router] ===LAN1=== [eth0 |Linux Box| eth1] ===LAN2=== Home Desktops/Laptops

Załóżmy, że używasz statycznego adresowania IP w sieci LAN2:

Linux Box 192.168.1.1
Home 1    192.168.1.11
Home 2    192.168.1.12
Home 3    192.168.1.13
Home 4    192.168.1.14

Najpierw napisałbym mały skrypt, aby wykryć, którzy klienci są aktywni, wysyłając polecenia ping i zapisując wyniki gdzieś. „Pozostaje to jako ćwiczenie dla czytelnika” Oblicz całkowitą liczbę podłączonych hostów (1-4)

Pamiętaj, aby zająć się przypadkiem braku hostów online.

Podziel całkowitą przepustowość, ale liczbę podłączonych hostów. (12 Mb dla 1, 6 Mb dla 2, 4 Mb dla 3, 3 Mb dla 4)

Następnie użyj tc z algorytmem HTB, aby ograniczyć przepustowość każdego adresu w urządzeniu po stronie WAN. Najpierw utwórz klasę root:

DEV="eth0"
TC="/sbin/tc"
TOT_BW=12
$TC qdisc add dev $DEV root handle 1: htb default 99

Następnie dodaj klasę dla każdego „klienta” (tutaj, na przykład, 3 klientów)

NB_CLT=3
CLT_BW=$(($TOT_BW/$NB_CLT))mbit
for i in seq $NB_CLT
do
    $TC class add def $DEV parent 1: classid 1:$i htb rate $CLT_BW ceil $CLT_BW burst 15k cburst 1500
    $TC filter add dev $DEV protocol ip parent 1:0 prio 1 flowid 1:$i u32 \
     match ip dst 192.168.1.1$i/32 \
     match ip src [Router IP in LAN1]/32
done

(powyższy skrypt jest całkowicie nieprzetestowany i NIE zawiera błędów pisarskich)

Teraz nadal musisz poprawnie uruchamiać skrypt, aby uruchamiał się co minutę i odnawiać wiadra / filtry za każdym razem, gdy nowy host się podnosi lub obniża.

Mam nadzieję, że wskaże ci właściwy kierunek, powodzenia.

Alternatywne rozwiązanie

Zainstaluj lokalne oprogramowanie QoS na wszystkich hostach, aby ograniczyć ich przepustowość. Ja osobiście korzystam z NetLimiter (non-free)

mveroone
źródło
Problem z moim podejściem polega na tym, że każdy host zmniejsza przepustowość drugiego, nawet jeśli nie wykorzystuje całego swojego udziału. Ale zaprojektowanie czegoś, co wymusza udostępnianie tylko wtedy, gdy zapotrzebowanie jest wysokie ... jest trudne.
mveroone
2

Wydaje się, że OpenWRT to obsługuje, chociaż sam nigdy z niego nie korzystałem. Możesz spojrzeć na stronę Network Traffic Control na ich stronie internetowej, a zwłaszcza na drugi przykład: zwykłe proste dzielenie pasma (inaczej kształtowanie ruchu) za pomocą HTB . Wiąże się to z prostymi wywołaniami qdisc, więc każde urządzenie Linux może to zrobić.

użytkownik2313067
źródło
Zauważam, że ten przykład dotyczy strony do przesyłania . Obecnie czytam swoją drogę przez Linux Advanced Routing & Traffic Control HOWTO, co wydaje się nieco obiecujące i mam nadzieję, że pozwolą mi zrozumieć wszystkie te tczasady. System kształtowania ruchu w Linuksie z pewnością wygląda obiecująco.
pmdj
0

Konfiguracja opisana w /superuser//a/1210164/257859 robi dokładnie to:

[...] kolejki dzielą ten ograniczony BW równomiernie między wszystkich klientów LAN (dokładniej IP IP).

ndemou
źródło
1
Nie zamieszczaj tej samej odpowiedzi na wiele pytań. Jeśli ta sama informacja naprawdę odpowiada na oba pytania, to jedno pytanie (zwykle nowsze) powinno zostać zamknięte jako duplikat drugiego. Możesz to wskazać, głosując, aby zamknąć go jako duplikat lub, jeśli nie masz wystarczającej reputacji, podnieść flagę wskazującą, że jest to duplikat. W przeciwnym razie dostosuj swoją odpowiedź do tego pytania i nie wklejaj tej samej odpowiedzi w wielu miejscach.
DavidPostill
@DavidPostill Myślałem o głosowaniu na zakończenie jako duplikat, ale zawahałem się, ponieważ jest to 3-letnie pytanie. Nawet przeszukałem meta.superuser i znalazłem odpowiednie pytanie na meta.superuser.com/questions/3524/… . Po przeczytaniu meta myślę, że sytuacja jest skomplikowana (mam odpowiedź na dwa stare pytania z wystarczającą ilością dyskusji w każdym z nich), a pozostawienie krótkiej wskazówki wydaje się przynajmniej „niezłe”. Jestem jednak otwarty na twoje myśli.
ndemou