Load balancing between two ISPs with NAT

În acest articol voi prezenta o metodă de a avea un uptime şi o lăţime de bandă pentru legătura la Internet într-un mod cât mai economic posibil. Pentru aceasta se vor folosi ca şi echipamente doar un router Cisco (orice model bazat pe IOS) şi un switch cu VLAN-uri, dacă routerul are mai puţin de 3 interfeţe capabile de rutare. Toate soluţiile oferite se pot adapta pentru a fi folosite şi într-o reţea complexă.

Oricine doreşte să evite neplăcutele perioade când „este netul căzut”, deja a luat în considerare şi poate achiziţionat o conexiune secundară printr-un alt ISP. Problemele pe care le voi adresa sunt:

  1. Cum se configurează o legătură de rezervă/redundantă
  2. Cum se pot folosi ambele legături simultan
  3. Cum se configurează NAT pentru cele două legături

Pentru a înţelege mai bine conceptele discutate în continuare şi a evidenția problemele ce pot apărea, primul pas este stabilirea topologiei.

Schema din figură prezintă topologia logică, de Layer 3. La nivel fizic lucrurile vor sta puţin mai diferit deoarece majoritatea routerelor Cisco de generaţie mai veche au doar 3 interfeţe.

Prima problema întâmpinată este aceea că routerele Cisco, seriile mai vechi, au doar două interfeţe fizice de tip Ethernet. Soluţia în acest caz constă în folosirea switch-ului pentru a „VLAN-iza” traficul spre ISP-uri:

  • cele două conexiuni spre ISP se conectează la switch în porturi din VLAN-uri distincte;
  • switch-ul este legat la router printr-un trunk;
  • pe router se folosesc subinterfeţe.

Pentru a optimiza folosirea resurselor, între switch și router voi folosi doua legături:

  • un trunk prin care circula cele doua VLAN-uri cu legăturile la ISP-uri: 101 și 102;
  • o legătură normală pentru traficul din LAN: VLAN 200.

Configurarea porturilor de acces în VLAN-uri pe switch:

Interface fa0/1                   !port spre ISP1
Switchport mode access
Switchport access vlan 101
Interface fa0/2                   !port spre ISP2
Switchport mode access
Switchport access vlan 102
Interface range  fa0/5 – 8  !porturi spre clienti
Switchport mode access
Switchport access vlan 200

 

Configurație port trunk:

Interface fa0/3        !prin acest port traficul de la ambii ISP va ajunge la router pe VLAN-uri distincte
Switchport trunk encapsulation dot1q ! linie necesara doar daca este un switch de Layer 3
Switchport mode trunk
Switchport trunk allowed vlan 101,102

 

Configurarea porturilor și IP-urilor pe router:

Interface fa0/1      !port spre LAN
No shutdown
Ip address 192.168.1.1
Interface fa0/0      !port spre Switch; trebuie doar pornit
No shutdown
Interface fa0/0.101      !crearea sub-interfetei spre ISP1
Encapsulation dot1q 101
Ip address 80.0.1.2 255.255.255.0      !IP public pe legatura cu ISP1
Interface fa0/0.102      !crearea sub-interfetei spre ISP2
Encapsulation dot1q 102
Ip address 80.0.2.2 255.255.255.0      !IP public pe legatura cu ISP2

 

Următorul pas îl reprezintă rutarea. Pentru ca banda celor 2 ISP-uri să fie partajată este nevoie de load-balancing. Acest procedeu se face, în general, prin una din următoarele două metode:  per pachet sau per conexiune. Chiar dacă prima metodă folosește mai puține resurse și este mai puțin complexă, foarte aplicații nu suportă ca traficul să ajungă în Internet pe căi diferite sau de pe IP-uri diferite.

Procedeul de load-balancing se poate efectua prin configurarea a două rute implicite de metrici egale, către cei doi ISP. Pentru ca metoda de partajare să fie per conexiune, se va folosi o unealtă forte puternică oferită de Cisco: CEF (Cisco Express Forwarding). CEF este implicit activat pe routerele Cisco.

Configurare router:

Ip cef
Ip route 0.0.0.0 0.0.0.0 80.0.1.1      ! ruta catre IP-ul public al ISP1
Ip route 0.0.0.0 0.0.0.0 80.0.2.1      ! ruta catre IP-ul public al ISP2

 

În acest moment traficul clienților poate parăsi rețeaua locală, partajând cele două conexiuni la Internet, dar folosind la sursă IP-ul intern al clientului.

Următoarea problemă o reprezintă procesul de NAT. În primul rând, pe routerele Cisco nu se pot declara două instanțe de NAT pentru aceeași sursă. În al doilea rând, va trebui ca traficul ce iese prin ISP1 să folosească la sursă IP-ul aferent acestuia (aici: 80.0.1.2), iar cel ce iese prin ISP2 să folosească celalalt IP public (aici: 80.0.2.2).

Soluția propusa constă în folosirea a două route map-uri ce identifică traficul ce iese spre fiecare ISP în parte, in funcție de următorul hop. Pentru precizarea următorului hop, datorită limitării din sintaxa IOS, se vor folosi două ACL-uri standard. Apoi, folosind aceste informații, NAT-urile se vor efectua utilizând route map-urile ca și identificatori pentru clienți /trafic de modificat.

Creare ACL-uri pentru a identifica următorul hop:

ip access-list standard IP_ISP1      !IP-ul public al ISP2
permit 80.0.1.1
ip access-list standard IP_ISP2      !IP-ul public al ISP2
permit 80.0.2.1

 

Creare route map-uri pentru identificare trafic NAT:

route-map NAT1 permit 10      !identificare trafic spre ISP1
match ip next-hop IP_ISP1
route-map NAT2 permit 10      !identificare trafic spre ISP2
match ip next-hop IP_ISP12

 

În final, ultimul pas il reprezintă crearea celor două instanțe de NAT:

ip nat inside source route-map NAT1 interface fa0/0.101 overload      !NAT spre ISP1
ip nat inside source route-map NAT2 interface fa0/0.102 overload      !NAT spre ISP2

și aplicarea acestora pe interfețe:

Interface fa0/1             !port spre LAN
Ip nat inside
Interface fa0/0.101      !port spre ISP1
Ip nat outside
Interface fa0/0.102      !port spre ISP2
Ip nat outside

 

În concluzie:

  • conectarea celor doua ISP-uri se face direct la un switch cu VLAN-uri;
  • din switch traficul celor 3 rețele (LAN, ISP1 și ISP2) ajunge pe interfața fizică, respectiv 2 logice în router;
  • folosind CEF și două rute statice traficul este partajat între cele două conexiuni la Internet, fără a influența negativ aplicațiile (împărțire per conexiune);
  • prin două route map și două ACL-uri, traficul spre fiecare ISP este identificat;
  • folosind două instanțe de NAT/PAT, pachetele părăsesc router-ul cu IP-urile sursă corespunzătoare.