Równoważenie obciążenia i translacja NAT wielu połączeń ISP w systemie Linux


15

Mam dwa połączenia internetowe od dwóch różnych dostawców usług internetowych i muszę zrównoważyć ruch przychodzący do i z mojej sieci między tymi dwoma dostawcami usług internetowych. Używam Debian GNU / Linux.

Moja konfiguracja jest taka -

eth0 (192.168.0.0/24) - Sieć lokalna

eth1 (192.168.1.0/24) - ISP nr 1

eth2 (192.168.2.0/24) - ISP nr 2

Moja sieć lokalna jest podłączona do tego serwera przez eth0, a skrzynka to serwer DHCP cum Gateway dla wszystkich komputerów w sieci LAN.

Serwer musi wykonać równoważenie obciążenia między dwoma dostawcami usług internetowych, a także musi wykonać NAT.

Postępowałem zgodnie z instrukcjami routingu na lartc.org, ale nadal potrzebuję instrukcji, aby poprawnie wykonać NAT.

Każda pomoc będzie mile widziana.

PS - Wiem o pFsense, ale muszę używać Linuksa.


2
jakiego rodzaju instrukcji potrzebujesz? wszystko wyjaśniono na lartc.org. Czy masz w szczególności jakiś problem?
lorenzog,

Odpowiedzi:


19

Przeprowadziłem równoważenie obciążenia przy użyciu metod lartc.org i iptables , i stwierdziłem, że metoda iptables jest łatwiejsza do zrozumienia i implementacji. Jedynym minusem jest to, że potrzebujesz dość nowej wersji iptables, aby móc korzystać z modułu statystycznego

Załóżmy kilka rzeczy:

LAN: eth0: 192.168.0.1/24

ISP1: eth1: 192.168.1.1/24, brama: 192.168.1.2/24

ISP2: eth2: 192.168.2.1/24, brama: 192.168.2.2/24

Oto, jak bym to zrobił za pomocą metody iptables:

Tabele tras

Najpierw edytuj / etc / iproute2 / rt_tables, aby dodać mapę między numerami tabel tras i nazwami dostawców usług internetowych

...
10 ISP1
20 ISP2
...

Tak więc tabela 10 i 20 dotyczą odpowiednio ISP1 i ISP2. Muszę wypełnić te tabele trasami z tabeli głównej tym fragmentem kodu (który wziąłem z hxxp: //linux-ip.net/html/adv-multi-internet.html)

ip route show table main | grep -Ev '^default' \
   | while read ROUTE ; do
     ip route add table ISP1 $ROUTE
done

I dodaj domyślną bramę do ISP1 poprzez bramę tego ISP1:

ip route add default via 192.168.1.2 table ISP1

Zrób to samo dla ISP2

Więc teraz mam 2 tabele tras, po 1 dla każdego dostawcy usług internetowych.

Iptables

OK, teraz używam iptables do równomiernej dystrybucji pakietów do każdej tabeli tras. Więcej informacji o tym, jak tę pracę można znaleźć tutaj ( http://www.diegolima.org/wordpress/?p=36 ) i tutaj ( http://home.regit.org/?page_id=7 )

# iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark
# iptables -t mangle -A PREROUTING -m mark ! --mark 0 -j ACCEPT
# iptables -t mangle -A PREROUTING -j MARK --set-mark 10
# iptables -t mangle -A PREROUTING -m statistic --mode random --probability 0.5 -j MARK --set-mark 20
# iptables -t mangle -A PREROUTING -j CONNMARK --save-mark

NAT

Cóż, NAT jest łatwy:

# iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
# iptables -t nat -A POSTROUTING -o eth2 -j MASQUERADE

3
Dobra odpowiedź z linkami. Niekoniecznie potrzebujesz nowych iptables, aby to zrobić, ponieważ przed meczem statystycznym istniały losowe i n-te mecze, na których serwer pełniła tę samą rolę.
SiegeX,

1
Mam pytanie dotyczące znaków na iptables. W opublikowanym linku zaznaczają tylko te pakiety, które pasują do nowego stanu. Dlaczego robisz to inaczej?
Matías

Czy mogę użyć jeszcze jednej sieci, takiej jak ISP3, ISP4 itp.?
Vitor Mazuco,

3

Odpowiedź mefata bardzo mi pomogła, ale zamiast jednorazowej kopii wszystkich reguł tabeli głównej do dwóch tabel ISP lepszym rozwiązaniem może być użycie reguły prio do dodania domyślnych reguł po tabeli głównej.

Skonfiguruj / etc / iproute2 / rt_tables w normalny sposób:

...
10 ISP1
20 ISP2
...

Zauważ, że

ip rule show

Pokazuje reguły 0-> lokalne, 32766-> główne i 32767-> domyślne. Zobacz man ippo więcej szczegółów.

Zasadniczo proces routingu będzie działał od reguł niskich do wysokich prio ... ale 32767 nie jest najwyższą regułą #. Więc jeśli główna tabela routingu nie ma domyślnej trasy (ale może zawierać wszystkie rodzaje dynamicznie zmieniających się tras dla VPN itp.), To jeśli dopasowanie nie zostanie wykonane, przechodzi do domyślnej (zwykle pustej), a następnie szuka wyższych reguł prio.

Zobacz sekcję „rzut” tutaj: http://linux-ip.net/html/routing-tables.html

Więc teraz skonfiguruj

ip route add default dev $ISP1_IFACE table ISP1
ip route add default dev $ISP2_IFACE table ISP2

i aby upewnić się, że są oglądane po głównym stole:

ip rule add fwmark 20 table ISP1 prio 33000
ip rule add fwmark 10 table ISP2 prio 33000

Posługiwać się

ip rule show

jeszcze raz, aby sprawdzić, czy te zasady są wyższe niż prio

Następnie użyj mangowania CONNMARK, jak mefat powiedział:

# iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark
# iptables -t mangle -A PREROUTING -m mark ! --mark 0 -j ACCEPT
# iptables -t mangle -A PREROUTING -j MARK --set-mark 10
# iptables -t mangle -A PREROUTING -m statistic --mode random --probability 0.5 -j MARK --set-mark 20
# iptables -t mangle -A PREROUTING -j CONNMARK --save-mark

Warto zwrócić uwagę: pppd potrzebuje nodefaultrouteinaczej konfiguruje się w main; kiedy urządzenie uruchomi się ponownie, tabele ISP1 / ISP2 są czyszczone, więc należy je przywrócić za pomocą skryptu.

Używam skryptu w /etc/ppp/ip-{up,down}.d/dual-routing

# One of my connections is ~2x faster than the other
BALANCED=0.3
ALL_ISP1=0
ALL_ISP2=1

RULENUM=4
set_balance() {
    iptables -t mangle -R PREROUTING $RULENUM -m statistic --mode random --probability $0 -j MARK --set-mark 2
}

# if both up
set_balance $BALANCED
# if ppp1 down:
set_balance $ALL_ISP1
# if ppp0 down:
set_balance $ALL_ISP2

Jest to równoważenie obciążenia oparte na połączeniu, więc zamierzam rozważyć użycie obciążenia do monitorowania i zastąpienia reguły statystyk: iptables -t mangle -R PREROUTING <n>z przestrzeni użytkownika. Więc jeśli na jednym połączeniu istnieje długotrwałe pobieranie, a drugie połączenie jest lekko obciążone, powinniśmy preferować lekko obciążone połączenie.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.