Dwóch ISP z NAT na routerze i przełączanie w przypadku awarii
by admin · Październik 4, 2017
Załóżmy że mamy następującą sytuację. Mamy jeden router brzegowy, do którego podłączone są dwa łącza od ISP_1 i ISP_2. Łącze od ISP_1 jest naszym głównym łączem, a łącze od ISP_2 jest łączem zapasowym. W przypadku awarii łącza głównego łącze zapasowe ma przejąć funkcję łącza głównego. Wyżej opisana sieć wygląda następująco:
Stwórzmy powyższą topologię w GNS3:
Nasz router, który będziemy konfigurować to R1. Pokaże jednak konfiguracje każdego urządzenia ISP_1, ISP_2, R3 i AlpineLinux-1.
Routery ISP_1 i ISP_2 są podłączone do routera R3, który podłączony jest do internetu, dzięki czemu na komputerze (Alpine-Linux-1) będziemy mogli przetestować działanie naszej konfiguracji w realnym środowisku. Jak podłączyć GNS3 do internetu można przeczytać pod tym wpisem.
Przygotowanie środowiska
Konfiguracja ISP_1
hostname ISP_1
!
interface FastEthernet0/0
ip address 11.11.11.2 255.255.255.0
!
interface FastEthernet1/0
ip address 13.13.13.2 255.255.255.0
!
router ospf 1
network 11.11.11.0 0.0.0.255 area 0
network 13.13.13.0 0.0.0.255 area 0
!
Konfiguracja ISP_2
hostname ISP_2
!
interface FastEthernet0/0
ip address 12.12.12.2 255.255.255.0
!
interface FastEthernet1/0
ip address 23.23.23.2 255.255.255.0
!
router ospf 1
network 12.12.12.0 0.0.0.255 area 0
network 23.23.23.0 0.0.0.255 area 0
Konfiguracja R3
hostname R3
!
interface FastEthernet0/0
ip address dhcp
ip nat outside
!
interface FastEthernet1/0
ip address 13.13.13.1 255.255.255.0
ip nat inside
!
interface FastEthernet1/1
ip address 23.23.23.1 255.255.255.0
ip nat inside
!
router ospf 1
network 13.13.13.0 0.0.0.255 area 0
network 23.23.23.0 0.0.0.255 area 0
default-information originate
!
ip nat inside source list 100 interface FastEthernet0/0 overload
!
access-list 100 permit ip 13.13.13.0 0.0.0.255 any
access-list 100 permit ip 23.23.23.0 0.0.0.255 any
access-list 100 permit ip 11.11.11.0 0.0.0.255 any
access-list 100 permit ip 12.12.12.0 0.0.0.255 any
Konfiguracja AlpineLinux-1
/ # ifconfig eth0 192.168.100.100 netmask 255.255.255.0
/ # route add default gw 192.168.100.1 eth0
Konfiguracja R1
hostname R1
!
interface FastEthernet0/0
ip address 192.168.100.1 255.255.255.0
ip nat inside
!
interface FastEthernet1/0
ip address 11.11.11.1 255.255.255.0
ip nat outside
!
interface FastEthernet1/1
ip address 12.12.12.1 255.255.255.0
ip nat outside
!
ip nat inside source route-map ISP_1 interface FastEthernet1/0 overload
ip nat inside source route-map ISP_2 interface FastEthernet1/1 overload
!
ip route 0.0.0.0 0.0.0.0 11.11.11.2
ip route 0.0.0.0 0.0.0.0 12.12.12.2 10
!
access-list 100 permit ip 192.168.100.0 0.0.0.255 any
!
route-map ISP_1 permit 10
match ip address 100
match interface FastEthernet1/0
!
route-map ISP_2 permit 10
match ip address 100
match interface FastEthernet1/1
!
WYJAŚNIENIE KONFIGURACJI R1
Na R1 skonfigurowane są dwa NATy, jeden przez intefejs FastEthernet1/0, drugi przez intefejs FastEthernet1/1. Ponieważ nie możemy skonfigurować klasycznego NATa poleceniem: ip nat inside source list ACL_NR interface INT_NAME overload wskazującego na dwa różne interfejsy musimy skorzystać z route-map: route-map ISP_1 i route-map ISP_2. Dodatkowo skonfigurowane są na R1 dwie trasy domyślne, jedna wskazująca na router ISP_1: ip route 0.0.0.0 0.0.0.0 11.11.11.2 i druga wskazująca na router ISP_2: ip route 0.0.0.0 0.0.0.0 12.12.12.2 10. Ta trasa to tzw pływająca trasa statyczna, która posiada dystans administracyjny (10) wyższy niż domyślnie posiada trasa statyczna (1), czyli nie będzie tego wpisu w tablicy routingu routera R1, dopóki wpis pierwszy wpis statyczny wskazujący na trasę domyślną przez ISP_1 będzie istniał. Sprawdźmy to wydając komendę show ip route:
R1#show ip route
Codes: L - local, C - connected, S - static, R - RIP, M - mobile, B - BGP
D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
E1 - OSPF external type 1, E2 - OSPF external type 2
i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
ia - IS-IS inter area, * - candidate default, U - per-user static route
o - ODR, P - periodic downloaded static route, H - NHRP, l - LISP
+ - replicated route, % - next hop override
Gateway of last resort is 11.11.11.2 to network 0.0.0.0
S* 0.0.0.0/0 [1/0] via 11.11.11.2
11.0.0.0/8 is variably subnetted, 2 subnets, 2 masks
C 11.11.11.0/24 is directly connected, FastEthernet1/0
L 11.11.11.1/32 is directly connected, FastEthernet1/0
12.0.0.0/8 is variably subnetted, 2 subnets, 2 masks
C 12.12.12.0/24 is directly connected, FastEthernet1/1
L 12.12.12.1/32 is directly connected, FastEthernet1/1
192.168.100.0/24 is variably subnetted, 2 subnets, 2 masks
C 192.168.100.0/24 is directly connected, FastEthernet0/0
L 192.168.100.1/32 is directly connected, FastEthernet0/0
Przetestujmy teraz działanie internetu na hoście AlpineLinux-1 wydając komendę ping 8.8.8.8:
/ # ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8): 56 data bytes
64 bytes from 8.8.8.8: seq=0 ttl=56 time=50.648 ms
64 bytes from 8.8.8.8: seq=1 ttl=56 time=56.079 ms
64 bytes from 8.8.8.8: seq=2 ttl=56 time=47.610 ms
64 bytes from 8.8.8.8: seq=3 ttl=56 time=52.085 ms
64 bytes from 8.8.8.8: seq=4 ttl=56 time=54.151 ms
Teraz sprawdźmy co się stanie jak padnie nam łącze do ISP_1, zasymulujmy to wyłączając internet fastethernet1/0:
R1(config)#int fastEthernet 1/0
R1(config-if)#sh
Sprawdźmy teraz jeszcze raz łączność do adresu 8.8.8.8.
/ # ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8): 56 data bytes
Nie widzimy żadnej odpowiedzi, sprawdźmy dlaczego wydając komendę show ip nat translations:
R1#show ip nat translations
Pro Inside global Inside local Outside local Outside global
icmp 11.11.11.1:1025 192.168.100.100:11520 8.8.8.8:11520 8.8.8.8:1025
Jak widać z wyniku powyższej komendy ruch do adresu 8.8.8.8 jest translatowany przez interfejs prowadzący do ISP_1 (Inside global 11.11.11.1), spowodowane jest to tym, że wpisy w tablicy translacji na routerze Cisco domyślnie są przechowywane przez 24 godziny. Sprawdźmy co się stanie jak wyczyścimy wpisy w tablicy translacji, możemy to zrobić poleceniem clear ip nat translations *
R1#clear ip nat translation *
Wydajmy teraz jeszcze raz na hoście AlpineLinux-1 komendę ping 8.8.8.8.
/ # ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8): 56 data bytes
64 bytes from 8.8.8.8: seq=93 ttl=56 time=63.069 ms
64 bytes from 8.8.8.8: seq=94 ttl=56 time=57.092 ms
64 bytes from 8.8.8.8: seq=95 ttl=56 time=70.336 ms
64 bytes from 8.8.8.8: seq=96 ttl=56 time=54.099 ms
64 bytes from 8.8.8.8: seq=97 ttl=56 time=48.091 ms
Udało się ping działa !!!
Zobaczmy teraz tablicę translacji nat:
R1# show ip nat translation
Pro Inside global Inside local Outside local Outside global
icmp 12.12.12.1:1024 192.168.100.100:12288 8.8.8.8:12288 8.8.8.8:1024
Teraz możemy zaobserwować. że ruch do adresu 8.8.8.8 jest translatowany przez interfejs prowadzący do ISP_2 (Inside global 12.12.12.1).
Czy możemy jakoś rozwiązać powyższy problem, tak żeby nie było potrzeby wykonywania tej komendy za każdym razem gdy padnie nam łącze?
Możemy, używając EEM (Cisco IOS Embedded Event Manager).
Dodajmy do konfiguracji R1 następujące wpisy:
event manager applet CLEAR_NAT_1
event syslog pattern "LINEPROTO-5-UPDOWN: Line protocol on Interface FastEthernet1/0, changed state"
action 1.0 cli command "enable"
action 2.0 cli command "clear ip nat translation *"
event manager applet CLEAR_NAT_2
event syslog pattern "LINEPROTO-5-UPDOWN: Line protocol on Interface FastEthernet1/1, changed state"
action 1.0 cli command "enable"
action 2.0 cli command "clear ip nat translation *"
Powyższa konfiguracja działa następująco: w momencie pojawienia się na konsoli routera logu typu LINEPROTO-5-U-DOWN na interfejsie FastEthernet1/0 lub FastEthernet1/1 wykona komendy clear ip nat translation *. Czyli to co wpisywaliśmy wcześniej ręcznie wykona się automatycznie. Przetestujmy teraz jak wygląda łączność do 8.8.8.8 z hosta AlpineLinux-1 w przypadku awarii łacza do ISP_1. Najpierw wykonajmy komendę ping i obserwujmy jej działanie cały czas. A potem przejdźmy do routera R1 i zasymulujmy awarie łącza.
R1(config)#int fa1/0
R1(config-if)#sh
R1(config-if)#
*Nov 26 13:25:20.803: %LINK-5-CHANGED: Interface FastEthernet1/0, changed state to administratively down
*Nov 26 13:25:21.803: %LINEPROTO-5-UPDOWN: Line protocol on Interface FastEthernet1/0, changed state to down
Sprawdźmy co dzieje się na hoście AlpineLinux-1:
64 bytes from 8.8.8.8: seq=93 ttl=56 time=63.069 ms
64 bytes from 8.8.8.8: seq=94 ttl=56 time=57.092 ms
64 bytes from 8.8.8.8: seq=95 ttl=56 time=70.336 ms
64 bytes from 8.8.8.8: seq=96 ttl=56 time=54.099 ms
Cały czas mamy łączność, czyli nasz skrypt EEM zadziałał prawidłowo i wyczyścił wpisy NAT, sprawdźmy to komendą show ip nat translation:
R1#show ip nat translation
Pro Inside global Inside local Outside local Outside global
icmp 12.12.12.1:1024 192.168.100.100:12288 8.8.8.8:12288 8.8.8.8:1024
Widzimy, że translacje NAT wskazują na łącze do ISP_2, więc poprzednie wpisy wskazujące na ISP_1 wyczyściły się zgodnie z przewidywaniami.