Podłączanie komputera z systemem Linux do routera dodatkowego / dostawcy usług internetowych: jak poprawnie skonfigurować routing?

8

Abstrakcyjny:

Mam problemy (zakładam, że routing) podczas dodawania dodatkowego usługodawcy internetowego do mojej istniejącej konfiguracji sieci: ruch przychodzący Router1nie jest odbierany, ale ruch lokalny i ruch przychodzący Router0działa dobrze.

Jak mogę utrzymać działające części, które obecnie działają dobrze, jednocześnie generując ruch przychodzący przez Router1pracę?

Opracowanie:

Naszkicowałem poniższy schemat z podstawowymi elementami sytuacji (w praktyce w każdej sieci LAN jest więcej urządzeń, ale nie mają one znaczenia).

Oto sytuacja:

  • Mam dwie sieci wewnętrzne: LAN0jest 192.168.x.0/24i LAN1jest 192.168.y.0/24. Oba działają dobrze dla ruchu wewnętrznego (na przykład http za pomocą cURL ).
  • LAN0zawsze był podłączony przez Router0i ISP0do Internet.
  • LAN1zawsze miałem Router1, ale teraz jest podłączony ISP1do Internet.
  • Komputery działają tylko LAN0z domyślną trasą i Router0działają prawidłowo dla ruchu wychodzącego i przychodzącego.
  • Komputery działają tylko LAN1z domyślną trasą i Router1działają prawidłowo dla ruchu wychodzącego i przychodzącego.
  • Wewnętrzny ruch włączony LAN0i LAN1zawsze działał dobrze.
  • Ruch przychodzący Router1dla WindowsBprzychodzi poprawnie: mogę połączyć się z nim przez RDP z WindowsC.
  • Przychodzący ruch przychodzący Router1dla LinuxBprzybywa (zgodnie z tcpdump ), ale nie odpowiedział, gdy curl http://e.f.g.hfron LinuxCpokazuje z tcpdump na LinuxB pokazach:

Pokazuje tylko pakiety, które - zgodnie z formatem wyjściowym tcpdump - mają ustawioną flagę SYN :

LinuxB:/tmp/LinuxB.eth1.80 # tcpdump -i eth1 'port 80'
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 65535 bytes
13:35:19.489779 IP i.j.k.l.57512 > 192.168.y.2.http: Flags [S], seq 816356596, win 65535, options [mss 1460,nop,wscale 4,nop,nop,TS val 1287047182 ecr 0,sackOK,eol], length 0
13:35:19.788841 IP i.j.k.l.57512 > 192.168.y.2.http: Flags [S], seq 816356596, win 65535, options [mss 1460,nop,wscale 4,nop,nop,TS val 1287047478 ecr 0,sackOK,eol], length 0
13:35:19.888835 IP i.j.k.l.57512 > 192.168.y.2.http: Flags [S], seq 816356596, win 65535, options [mss 1460,nop,wscale 4,nop,nop,TS val 1287047578 ecr 0,sackOK,eol], length 0
13:35:19.989412 IP i.j.k.l.57512 > 192.168.y.2.http: Flags [S], seq 816356596, win 65535, options [mss 1460,nop,wscale 4,nop,nop,TS val 1287047678 ecr 0,sackOK,eol], length 0
13:35:20.089685 IP i.j.k.l.57512 > 192.168.y.2.http: Flags [S], seq 816356596, win 65535, options [mss 1460,nop,wscale 4,nop,nop,TS val 1287047778 ecr 0,sackOK,eol], length 0
13:35:20.190836 IP i.j.k.l.57512 > 192.168.y.2.http: Flags [S], seq 816356596, win 65535, options [mss 1460,nop,wscale 4,nop,nop,TS val 1287047877 ecr 0,sackOK,eol], length 0
13:35:20.392123 IP i.j.k.l.57512 > 192.168.y.2.http: Flags [S], seq 816356596, win 65535, options [mss 1460,nop,wscale 4,nop,nop,TS val 1287048072 ecr 0,sackOK,eol], length 0
13:35:20.693692 IP i.j.k.l.57512 > 192.168.y.2.http: Flags [S], seq 816356596, win 65535, options [mss 1460,sackOK,eol], length 0
13:35:21.197162 IP i.j.k.l.57512 > 192.168.y.2.http: Flags [S], seq 816356596, win 65535, options [mss 1460,sackOK,eol], length 0
13:35:22.204134 IP i.j.k.l.57512 > 192.168.y.2.http: Flags [S], seq 816356596, win 65535, options [mss 1460,sackOK,eol], length 0
13:35:24.115961 IP i.j.k.l.57512 > 192.168.y.2.http: Flags [S], seq 816356596, win 65535, options [mss 1460,sackOK,eol], length 0
13:35:27.852374 IP i.j.k.l.57512 > 192.168.y.2.http: Flags [S], seq 816356596, win 65535, options [mss 1460,sackOK,eol], length 0
13:35:31.967049 IP i.j.k.l.57512 > 192.168.y.2.http: Flags [S], seq 816356596, win 65535, options [mss 1460,sackOK,eol], length 0

Oto LinuxBtabela tras:

LinuxB:/tmp/LinuxB.eth1.80 # route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         192.168.x.1     0.0.0.0         UG    0      0        0 eth0
loopback        *               255.0.0.0       U     0      0        0 lo
link-local      *               255.255.0.0     U     0      0        0 eth0
192.168.x.0     *               255.255.255.0   U     0      0        0 eth0
192.168.x.0     *               255.255.255.0   U     0      0        0 eth1

Ponieważ łączenie się przez RDP z WindowsCdo WindowsBdziała dobrze, wznawiam, że jest to rzeczywiście problem z routingiem. Oto WindowsBtabela tras:

C:\temp>route print
===========================================================================
Interface List
0x1 ........................... MS TCP Loopback interface
0x2 ...00 0c 29 35 77 e1 ...... AMD PCNET Family PCI Ethernet Adapter - Packet Scheduler Miniport
0x3 ...00 0c 29 35 77 eb ...... VMware Accelerated AMD PCNet Adapter - Packet Scheduler Miniport
===========================================================================
===========================================================================
Active Routes:
Network Destination        Netmask          Gateway       Interface  Metric
          0.0.0.0          0.0.0.0      192.168.x.1     192.168.x.4      10
          0.0.0.0          0.0.0.0      192.168.y.1     192.168.y.4       5
        127.0.0.0        255.0.0.0        127.0.0.1       127.0.0.1       1
      192.168.x.0    255.255.255.0      192.168.x.4     192.168.x.4      10
      192.168.x.4  255.255.255.255        127.0.0.1       127.0.0.1      10
    192.168.x.255  255.255.255.255      192.168.x.4     192.168.x.4      10
      192.168.y.0    255.255.255.0      192.168.y.4     192.168.y.4      10
      192.168.y.4  255.255.255.255        127.0.0.1       127.0.0.1      10
    192.168.y.255  255.255.255.255      192.168.y.4     192.168.y.4      10
        224.0.0.0        240.0.0.0      192.168.x.4     192.168.x.4      10
        224.0.0.0        240.0.0.0      192.168.y.4     192.168.y.4      10
  255.255.255.255  255.255.255.255      192.168.x.4     192.168.x.4       1
  255.255.255.255  255.255.255.255      192.168.y.4     192.168.y.4       1
Default Gateway:       192.168.y.1
===========================================================================
Persistent Routes:
  Network Address          Netmask  Gateway Address  Metric
          0.0.0.0          0.0.0.0      192.168.y.1       5
          0.0.0.0          0.0.0.0      192.168.x.1      10

Jak mogę LinuxBustawić routing tak:

  • zachowaj domyślną trasę, LinuxBaby 192.168.x.1ruch wychodzący nadal używał Router0/ISP0
  • wciąż odpowiadaj na przychodzące żądania od LAN0dniaLAN0
  • wciąż odpowiadaj na przychodzące żądania od LAN1dniaLAN1
  • odpowiadać na przychodzące żądania za pośrednictwem Router0( a.b.c.d/ 192.168.x.1) przez192.168.x.1
  • zacznij odpowiadać na przychodzące żądania przez Router1( e.f.g.h/ 192.168.y.1) przez192.168.y.1
  • bonus: mieć Router1przełączenie awaryjne lub równoważenie obciążeniaRouter0

Postscriptum:

Poniższy obraz PNG jest generowany na tekście UML za pośrednictwem bezpłatnego silnika PlantUML online . Jeśli chcesz zobaczyć oryginalny tekst UML, wklej link obrazu PNG do tego formularza PlantUML , a następnie naciśnij Submit.

wprowadź opis zdjęcia tutaj

Jeroen Wiert Pluimers
źródło
Właśnie znalazłem ciekawą odpowiedź na unix.stackexchange.com/a/23345/69111, którą badam, aby sprawdzić, czy dotyczy mojej sprawy i jak ją zaimplementować yast.
Jeroen Wiert Pluimers
1
Yastwydaje się, że wykonuje skomplikowane routing i routewydaje się być przestarzały na korzyść ip. Zobacz opensuse.14.x6.nabble.com/yast2-advanced-routing-td3083578.html i suse.com/documentation/sles11/book_sle_admin/data/...
Jeroen Wiert Pluimers
1
Twoje połączone rozwiązanie w unix.stackexchange idzie w dobrym kierunku i rozwiązałoby problem z linuksem - węzeł linux ma dwie oddzielne tabele routingu i używa odpowiedniej tabeli w zależności od interfejsu, na którym połączenie zostało zainicjowane. Nie znam żadnego takiego rozwiązania dla systemu Windows. Jeśli nie ma prawdziwej potrzeby dwóch podsieci, pozbyłbym się jednej i używałbym jednego routera dla obu dostawców usług internetowych. Możesz kupić routery, które mogą poprawnie obsługiwać dwie sieci WAN, lub możesz użyć innego systemu Linux, aby to zrobić, co uprościłoby routing w systemach za nim.
David Mackintosh
@DavidMackintosh w przyszłości będę. Jest to tymczasowe: światłowód jest w rzeczywistości DSL i przechodzi na inny adres światłowodu. Maszyna to DNS i MX, więc chcę, aby była dostępna od dwóch dostawców usług internetowych, aby zapewnić ciągłość, ponieważ nie jestem pewien, czy DSL zostanie zamknięty przed, czy po aktywacji światłowodu.
Jeroen Wiert Pluimers

Odpowiedzi:

1

Miałem skrypt powłoki do robienia czegoś takiego dawno temu, ale przepraszam, mogłem to znaleźć. Mogę więc podać tylko wskazówki dotyczące rozwiązań, które wówczas wdrożyłem. Piszę głównie z pamięci, więc brakuje niektórych przykładów:

  1. Miałem jedną tabelę routingu na łącze wysyłające (trasa ip ... tabela 101, trasa ip ... tabela 102). To idzie do / etc / iproute2 / rt_tables.

    101 isp1 102 isp2

    Musisz również skonfigurować te tabele:

    ip route dodaj domyślnie przez $ Gateway1 dev $ Interfejs1 tabela isp1 ip route dodaj domyślnie przez $ Gateway2 dev $ Interfejs2 tabela isp2

    # Nie zapomnij o domyślnej tabeli:

    ip route dodaj domyślnie przez $ DefaultGateway dev $ DefaultInterface

  2. Włącz śledzenie połączeń iptables (modprobe nf_conntrack)

  3. Ustaw regułę iptables dla NOWYCH połączeń przychodzących na -j OZNACZ jakoś pakiety (tj .: 0x201, 0x202)
  4. Ustaw regułę ip, która zapewni, że ruch wychodzący, gdy interfejs korzysta z właściwej tabeli routingu

    dodawanie reguły ip z tabeli $ Ip1 isp1 dodawanie reguły ip z tabeli $ Ip2 isp2

  5. Ustaw regułę ip (dodaj regułę ip ...) stwierdzającą, że „pakiety oznaczone 0x201 będą sprawdzać tablicę routingu 201”, jedna reguła dla każdego łącza wysyłającego.

Mając wszystko na swoim miejscu, powinieneś być w stanie odbierać i inicjować połączenia z dowolnym połączeniem wstępującym, a nawet balansować połączenia wychodzące.

To byłyby podstawy. Iptables + „ip route” + „ip rule” i możesz zacząć.

marc.fargas
źródło