Linux jako router z wieloma dostawcami Internetu


16

Linux jako router: Mam 3 dostawców Internetu, każdy z własnym modemem.

Dostawca1 , czyli adres bramy 192.168.1.1
Połączony z routerem linux eth1 /192.168.1.2

Dostawca2 , adres bramy 192.168.2.1
Połączony z routerem linux eth2 /192.168.2.2

Dostawca3 , adres bramy 192.168.3.1
Połączony z routerem linux eth3 /192.168.3.2

                                                                           ________
                                                   +------------+         /
                                                   |            |        |
                            +----------------------+ Provider 1 +--------|
        __                  |192.168.1.2           |192.168.1.1 |       /
    ___/  \_         +------+-------+              +------------+      |
  _/        \__      |    eth1      |              +------------+      /
 /             \ eth0|              |192.168.2.2   |            |      |
|Client network -----+  ROUTER  eth2|--------------+ Provider 2 +------|     Internet
 \10.0.0.0/24 __/    |              |              |192.168.2.1 |      |
   \__     __/       |    eth3      |              +------------+      \
      \___/          +------+-------+              +------------+       |
                            |192.168.3.2           |            |       \
                            +----------------------+ Provider 3 +-------|
                                                   |192.168.3.1 |       |
                                                   +------------+       \________

Chciałbym skierować klientów w sieci 10.0.0.0/24 według źródłowego adresu IP do różnych bram.
Interfejs do sieci klienta to eth0 /10.0.0.1, która jest bramą domyślną dla wszystkich klientów.

Na przykład:
10.0.0.11 powinien zostać przekierowany do Provider1 @ eth1
10.0.0.12 powinien zostać przekierowany do Provider2 @ eth2
... i tak dalej ...

Myślę, że muszę użyć ip routei iptablesdo SNAT, ale nie wiem dokładnie, jak to zrobić.
Oto skrypt, który mam do tej pory.
Przekazywanie IPv4 jest włączone.

#!/bin/bash
# flush tables
ip route flush table connection1
ip route flush table connection2
ip route flush table connection3

# add the default gateways for each table
ip route add table connection1 default via 192.168.1.1
ip route add table connection2 default via 192.168.2.1
ip route add table connection3 default via 192.168.3.1

# add some IP addresses for marking
iptables -t mangle -A PREROUTING -s 10.0.0.11 -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -s 10.0.0.12 -j MARK --set-mark 2
iptables -t mangle -A PREROUTING -s 10.0.0.13 -j MARK --set-mark 3

# add the source nat rules for each outgoing interface
iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to-source 192.168.1.2
iptables -t nat -A POSTROUTING -o eth2 -j SNAT --to-source 192.168.2.2
iptables -t nat -A POSTROUTING -o eth3 -j SNAT --to-source 192.168.3.2

# link routing tables to connections (?)
ip rule add fwmark 1 table connection1
ip rule add fwmark 2 table connection2
ip rule add fwmark 3 table connection3

#default route for anything not configured above should be eth2

Myślę, że musisz dodać w CONNMARK, aby zapisać / przywrócić znak, aby można go było zastosować do pakietów 2..n (które będą translowane NAT przez śledzenie połączenia)
derobert

Dodałem odpowiedź z fragmentami konfiguracji, której używamy tutaj. Postaram się zameldować w weekend, aby coś wyjaśnić ...
derobert

Odpowiedzi:


13

Oto podobna konfiguracja z jednego z naszych routerów (z pominięciem niektórych nieistotnych rzeczy). Pamiętaj, że obsługuje to również połączenia przychodzące .

Zwróć uwagę na użycie zmiennych zamiast zakodowanych liczb znaczników. O wiele łatwiejsze w utrzymaniu! Są one przechowywane w osobnym skrypcie i pochodzą z. Nazwy tabel są skonfigurowane w /etc/iproute2/rt_tables. Nazwy interfejsów są ustawione w /etc/udev/rules.d/70-persistent-net.rules.

##### fwmark ######
iptables -t mangle -F
iptables -t mangle -X

iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark
iptables -t mangle -A PREROUTING -m mark ! --mark 0 -j RETURN # if already set, we're done
iptables -t mangle -A PREROUTING -i wan      -j MARK --set-mark $MARK_CAVTEL
iptables -t mangle -A PREROUTING -i comcast  -j MARK --set-mark $MARK_COMCAST
iptables -t mangle -A PREROUTING -i vz-dsl   -j MARK --set-mark $MARK_VZDSL

iptables -t mangle -A POSTROUTING -o wan     -j MARK --set-mark $MARK_CAVTEL
iptables -t mangle -A POSTROUTING -o comcast -j MARK --set-mark $MARK_COMCAST
iptables -t mangle -A POSTROUTING -o vz-dsl  -j MARK --set-mark $MARK_VZDSL
iptables -t mangle -A POSTROUTING -j CONNMARK --save-mark

##### NAT ######
iptables -t nat -F
iptables -t nat -X
for local in «list of internal IP/netmask combos»; do
    iptables -t nat -A POSTROUTING -s $local -o wan     -j SNAT --to-source «IP»
    iptables -t nat -A POSTROUTING -s $local -o comcast -j SNAT --to-source «IP»
    iptables -t nat -A POSTROUTING -s $local -o vz-dsl  -j SNAT --to-source «IP»
done

# this is an example of what the incoming traffic rules look like
for extip in «list of external IPs»; do
    iptables -t nat -A PREROUTING   -p tcp -d $extip --dport «port» -j DNAT --to-destination «internal-IP»:443
done

I zasady:

ip rule flush
ip rule add from all               pref 1000  lookup main 
ip rule add from A.B.C.D/29        pref 1500  lookup comcast # these IPs are the external ranges (we have multiple IPs on each connection)
ip rule add from E.F.G.H/29        pref 1501  lookup cavtel
ip rule add from I.J.K.L/31        pref 1502  lookup vzdsl
ip rule add from M.N.O.P/31        pref 1502  lookup vzdsl # yes, you can have multiple ranges
ip rule add fwmark $MARK_COMCAST   pref 2000  lookup comcast
ip rule add fwmark $MARK_CAVTEL    pref 2001  lookup cavtel
ip rule add fwmark $MARK_VZDSL     pref 2002  lookup vzdsl
ip rule add                        pref 2500  lookup comcast # the pref order here determines the default—we default to Comcast.
ip rule add                        pref 2501  lookup cavtel
ip rule add                        pref 2502  lookup vzdsl
ip rule add                        pref 32767 lookup default

Tabele routingu są konfigurowane w /etc/network/interfacestaki sposób, że usunięcie interfejsu powoduje zmianę na inną:

iface comcast inet static
        address A.B.C.Q
        netmask 255.255.255.248
        up ip route add table comcast default via A.B.C.R dev comcast
        down ip route flush table comcast

Uwaga: Jeśli robisz filtrowania oraz (czego zapewne są) będzie trzeba także dodać odpowiednie reguły FORWARDdo ACCEPTruchu. Specjalnie dla każdego ruchu przychodzącego.


Dziękuję Ci bardzo! Mam zamiar zmodyfikować to do moich potrzeb, załadować go do pudełka i zaktualizować ten post.
Flav

Działa jak urok, dzięki jeszcze raz. Z wyjątkiem zamówienia wstępnego / domyślnej trasy do „comcast”. (Dla mnie powinno to być eth2) Ale myślę, że obejrzałem to, dodając ogólną regułę ip rule add from 10.0.0.0/24 pref 1400 lookup eth2i tworząc wyjątki później.
Flav

1
@Flav możesz również ustawić swoje wyjątki za pomocą znaków zapory (w PREROUTING). BTW: Jedno z powiązanych pytań ( unix.stackexchange.com/questions/70440/... ) zawiera więcej wyjaśnień dotyczących części tej konfiguracji. Te reguły ip / mask są w rzeczywistości dla ruchu bez NAT w mojej konfiguracji (SNAT dzieje się w POSTROUTING, stąd po regułach ip)
derobert
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.