вторник, 18 ноября 2014 г.

Dual ISP enterprise (branch) cisco router, firewall (ASA)

Классическая задача для предприятий и малого бизнеса - настройка маршрутизатора с двумя каналами в интернет без использования динамических протоколов маршрутизации. Очень много информации на эту тему есть в сети. Решил и я сделать заметку.

Нужно дать пользователям интернет и опубликовать какой-либо сервис (например, RDP) наружу.

Основные затыки происходят тут:
- динамическая смена маршрута 0.0.0.0 0.0.0.0;
- настройка NAT для двух внешних интерфейсов;
- доступность опубликованного сервиса сразу через оба ISP.

Есть хороший пост на хабре - По просьбам трудящихся: Dual ISP на маршрутизаторах cisco без BGP и на сайте этого же автора более полная дока, с рассмотренным вариантом использования сразу двух ISP - Сергей Фёдоров "Подключение к 2 ISP с настройкой трекинговой маршрутизации и NAT.

Вот дока 2008 года с сайта cisco - http://www.cisco.com/c/en/us/support/docs/ip/network-address-translation-nat/100658-ios-nat-load-balancing-2isp.html.

Итак, нам нужно использовать IP SLA для решения первого пункта, ROUTE-MAP для решения второго и третьего.

Использую эти документы, я собрал схему в GNS3. В моем случае опубликован был сервис telnet. На внешних адресах (172.16.X.X) он светился в порту 10023, внутри шел на 192.168.1.2:23.




Важное уточнение по route-map из ссылок выше:

Задание правил трансляции адресов с учетом исходящего интерфейса.

Тут на самом деле тоже 2 задачи: динамическая трансляция и статическая трансляция адресов. Первая нам нужна для выхода наружу, а вторая – для анонса сервисов. И в том и в другом случае нам понадобится конструкция, называющаяся route-map (создать надо будет по route-map на каждого провайдера)
! Создаем route-map
route-map ISPX permit {#}
  ! Указываем критерий попадания в этот абзац route-map
  match interface {исходящий интерфейс}


Тут есть тонкость: при указании слова interface в подсказке пишется
  interface         Match first hop interface of route
Т.е. вообще говоря, не понятно, что это за параметр. Плюс в зависимости от того, что написано на самом интерфейсе, этот критерий может означать как входящий интерфейс, так и исходящий! А зависит это от того, что написано в команде ip nat на интерфейсе:
ip nat inside – критерий будет означать входящий интерфейс
ip nat outside – критерий будет означать исходящий интерфейс 
В этом вся магия.

UPD: Есть ещё один момент. Если мы поставим пинг с адреса 192.168.1.2 в сторону 5.5.5.5, и в это время упадет основной канал, на маршрутизаторе R2 залипнет трансляция. Трек отработает, новый маршрут 0.0.0.0/0 установится в таблицу маршрутизации, но трансляция останется старая. Если отменить пинг и запустить заново, все будет работать. Если выполнить команду "clear ip nat translation forced" тоже все заработает. Нужно это автоматизировать. В комментах на хабре было сдедующее:

Тут есть проблема в чем. При переключении на запасного провайдера надо почистить таблицу трансляций. Иначе пользовательские сессии подвиснут.
Делается примерно так
event manager applet ISP_SWITCHED_20
event track 30 state any
action 1.0 cli command «enable»
action 2.0 cli command «clear ip nat trans forced»
В версии IOS, которую я использовал в GNS3, в EEM нет события "track", поэтому я использовал событие syslog, в котором указал шаблон, по которому нужно сработать. Получилось так:

!
event manager applet NAT01 
 event syslog pattern "TRACKING-5-STATE"
 action 1.0 cli command "enable"
 action 2.0 cli command "clear ip nat trans forced"
 action 3.0 syslog msg "NAT TRANSLATIONS CLEARED DUE TO TRACK EVENT"
!

Запускаю пинг на RA1, после чего отключаю интерфейс fa0/0.23 на R3, после его включаю.

R1:
R1#ping 5.5.5.5 source 192.168.1.2 repeat 100000 timeout 1 

Type escape sequence to abort.
Sending 100000, 100-byte ICMP Echos to 5.5.5.5, timeout is 1 seconds:
Packet sent with a source address of 192.168.1.2 
!!!!!!!!!!!!!!!!!!!!!!!..................!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!.!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

R2:
R2#
*Mar  1 00:58:38.575: %TRACKING-5-STATE: 1 rtr 1 state Up->Down
R2#
*Mar  1 00:58:38.779: %HA_EM-6-LOG: NAT01: NAT TRANSLATIONS CLEARED DUE TO TRACK EVENT

R2#
*Mar  1 00:59:13.579: %TRACKING-5-STATE: 1 rtr 1 state Down->Up
R2#
*Mar  1 00:59:13.735: %HA_EM-6-LOG: NAT01: NAT TRANSLATIONS CLEARED DUE TO TRACK EVENT

R2:
!
version 12.4
service timestamps debug datetime msec
service timestamps log datetime msec
no service password-encryption
!
hostname R2
!
boot-start-marker
boot-end-marker
!
!
no aaa new-model
memory-size iomem 5
no ip icmp rate-limit unreachable
ip cef
!
!
!
!
no ip domain lookup
ip auth-proxy max-nodata-conns 3
ip admission max-nodata-conns 3
ip sla monitor 1
 type echo protocol ipIcmpEcho 6.6.6.6 source-interface FastEthernet0/1.23
 threshold 3000
 frequency 20
ip sla monitor schedule 1 life forever start-time now
ip sla monitor 2
 type echo protocol ipIcmpEcho 7.7.7.7 source-interface FastEthernet0/1.24
 threshold 3000
 frequency 20
ip sla monitor schedule 2 life forever start-time now
!
!
!
!
!
!
!
!
!
!
!
!         
!
!
!
!
!
ip tcp synwait-time 5
!
track 1 rtr 1
!
track 2 rtr 2

!
!
!
!
interface FastEthernet0/0
 ip address 192.168.12.2 255.255.255.0
 ip nat inside
 ip virtual-reassembly
 duplex auto
 speed auto
!
interface FastEthernet0/1
 no ip address
 duplex auto
 speed auto
!
interface FastEthernet0/1.23
 encapsulation dot1Q 23
 ip address 172.16.23.2 255.255.255.0
 ip nat outside
 ip virtual-reassembly
!
interface FastEthernet0/1.24
 encapsulation dot1Q 24
 ip address 172.16.24.2 255.255.255.0
 ip nat outside
 ip virtual-reassembly
!
ip forward-protocol nd
ip route 0.0.0.0 0.0.0.0 172.16.23.3 10 name DYNAMIC_ISP1 track 1
ip route 0.0.0.0 0.0.0.0 172.16.24.4 20 name DYNAMIC_ISP2 track 2
ip route 0.0.0.0 0.0.0.0 172.16.23.3 250 name static_default_isp1
ip route 6.6.6.6 255.255.255.255 172.16.23.3 name IPSLA1
ip route 7.7.7.7 255.255.255.255 172.16.24.4 name IPSLA2
ip route 192.168.0.0 255.255.0.0 192.168.12.1
!
!
no ip http server
no ip http secure-server
ip nat inside source route-map NAT_FE0/1.23 interface FastEthernet0/1.23 overload
ip nat inside source route-map NAT_FE0/1.24 interface FastEthernet0/1.24 overload
ip nat inside source static tcp 192.168.1.2 23 172.16.23.2 10023 route-map NAT_FE0/1.23 extendable
ip nat inside source static tcp 192.168.1.2 23 172.16.24.2 10023 route-map NAT_FE0/1.24 extendable
!
access-list 100 permit ip host 192.168.1.2 any
!
route-map NAT_FE0/1.24 permit 10
 match ip address 100
 match interface FastEthernet0/1.24
!
route-map NAT_FE0/1.23 permit 10
 match ip address 100
 match interface FastEthernet0/1.23
!         
!
!
!
control-plane
!
!
!
!
!
!
!
!
!
!
line con 0
 exec-timeout 0 0
 privilege level 15
 logging synchronous
line aux 0
 exec-timeout 0 0
 privilege level 15
 logging synchronous
line vty 0 4
 login
!
!
event manager applet NAT01 
 event syslog pattern "TRACKING-5-STATE"
 action 1.0 cli command "enable"
 action 2.0 cli command "clear ip nat trans forced"
 action 3.0 syslog msg "NAT TRANSLATIONS CLEARED DUE TO TRACK EVENT"
!
end

В случае, если на периметре сети предприятия стоит АСА, делается все проще, но тоже с нюансами. При наличии статических трансляций (проброс или mapping портов) и для PAT (напомню, что речь идет о двух ISP) не нужно использовать полисимапы (да и не получится т.к. АСА не поддерживает этот функционал). АСА представляет из себя фаервол, запоминающий состояния соединений (statefull firewall). Уже из коробки она инспектирует tcp, поэтому помнит через какой интерфейс пакет пришел. Изначально она полезет смотреть таблицу соединений, проверит интерфейс входа для соединения, потом уже в таблицу рутинга. Ниже картинка, подробнее тут - Cisco ASA Packet Process Algorithm



Как опубликовать телнет на определенный хост через двух провадеров по двум разным внешним IP. ASA не примит две записи, где в качестве src хоста будут одинаковые хосты. В этом случае я назначаю хосту secondary IP из той же подсети, что и основной IP. Если используется публикуются loopback интерфейсы маршрутизатора (как в моем примере), то не важно к какой сети они принадлежат при наличии на них маршрута на самой АСА. Ниже моя схема и конфиг. Публикуем telnet на R1 через его лупбеки. На внешних адресах АСА сервес светится в портах 10023. Это просто пример. Телнет во внешней сети нельзя использовать из-за отсутсвия шифрования.


ASA Version 8.4(2) 
!
hostname ciscoasa
enable password 8Ry2YjIyt7RRXU24 encrypted
passwd 2KFQnbNIdI.2KYOU encrypted
names
!
interface GigabitEthernet0
 no nameif
 no security-level
 no ip address
!
interface GigabitEthernet0.3
 vlan 3
 nameif mgmt
 security-level 0
 ip address 192.168.247.247 255.255.252.0 
!
interface GigabitEthernet1
 nameif inside
 security-level 100
 ip address 192.168.11.1 255.255.255.0 
!
interface GigabitEthernet2
 no nameif
 no security-level
 no ip address
!
interface GigabitEthernet2.12
 vlan 12
 nameif outside12
 security-level 0
 ip address 172.16.12.1 255.255.255.0 
!
interface GigabitEthernet2.13
 vlan 13
 nameif outside13
 security-level 0
 ip address 172.16.13.1 255.255.255.0 
!
interface GigabitEthernet3
 shutdown
 no nameif
 no security-level
 no ip address
!
interface GigabitEthernet4
 shutdown     
 no nameif
 no security-level
 no ip address
!
interface GigabitEthernet5
 shutdown
 no nameif
 no security-level
 no ip address
!
ftp mode passive
object network obj_r1-loopback0
 host 192.168.1.1
object network obj_r1-loopback1
 host 192.168.1.2
object network obj_r1-loopback0_nonat
 host 192.168.1.1
object-group network objgrp_r1_inet
 network-object object obj_r1-loopback0
access-list outside12_access_in extended permit tcp any object obj_r1-loopback0 eq telnet 
access-list outside13_access_in extended permit tcp any object obj_r1-loopback1 eq telnet 
access-list inside_access_in extended permit ip any any 
access-list global_access extended permit ip any any inactive 
pager lines 24
mtu mgmt 1500
mtu inside 1500
mtu outside12 1500
mtu outside13 1500
no failover
icmp unreachable rate-limit 1 burst-size 1
icmp permit any inside
icmp permit any outside12
icmp permit any outside13
asdm image disk0:/asdm-647.bin
no asdm history enable
arp timeout 14400
!
object network obj_r1-loopback0
 nat (any,outside12) static interface service tcp telnet 10023 
object network obj_r1-loopback1
 nat (any,outside13) static interface service tcp telnet 10023 
!
nat (inside,outside12) after-auto source dynamic obj_r1-loopback0_nonat interface
nat (inside,outside13) after-auto source dynamic obj_r1-loopback0_nonat interface
access-group inside_access_in in interface inside
access-group outside12_access_in in interface outside12
access-group outside13_access_in in interface outside13
access-group global_access global
route outside12 0.0.0.0 0.0.0.0 172.16.12.2 120 track 12
route outside13 0.0.0.0 0.0.0.0 172.16.13.3 130 track 13
route outside12 0.0.0.0 0.0.0.0 172.16.12.2 255
route outside12 4.4.4.24 255.255.255.255 172.16.12.2 1
route outside13 4.4.4.34 255.255.255.255 172.16.13.3 1
route inside 192.168.0.0 255.255.0.0 192.168.11.2 1
route mgmt 192.168.253.0 255.255.255.0 192.168.244.6 1
timeout xlate 3:00:00
timeout conn 1:00:00 half-closed 0:10:00 udp 0:02:00 icmp 0:00:02
timeout sunrpc 0:10:00 h323 0:05:00 h225 1:00:00 mgcp 0:05:00 mgcp-pat 0:05:00
timeout sip 0:30:00 sip_media 0:02:00 sip-invite 0:03:00 sip-disconnect 0:02:00
timeout sip-provisional-media 0:02:00 uauth 0:05:00 absolute
timeout tcp-proxy-reassembly 0:01:00
timeout floating-conn 0:00:00
dynamic-access-policy-record DfltAccessPolicy
user-identity default-domain LOCAL
http server enable
http 0.0.0.0 0.0.0.0 mgmt
no snmp-server location
no snmp-server contact
snmp-server enable traps snmp authentication linkup linkdown coldstart warmstart
sla monitor 12
 type echo protocol ipIcmpEcho 4.4.4.24 interface outside12
 num-packets 3
 threshold 3000
 frequency 15
sla monitor schedule 12 life forever start-time now
sla monitor 13
 type echo protocol ipIcmpEcho 4.4.4.34 interface outside13
 num-packets 3
 threshold 3000
 frequency 15
sla monitor schedule 13 life forever start-time now
!
track 12 rtr 12 reachability
!
track 13 rtr 13 reachability
telnet timeout 5
ssh timeout 5
console timeout 0
threat-detection basic-threat
threat-detection statistics access-list
no threat-detection statistics tcp-intercept
ssl encryption 3des-sha1 aes128-sha1 aes256-sha1 des-sha1 rc4-md5 rc4-sha1
webvpn
 anyconnect-essentials
!
class-map inspection_default
 match default-inspection-traffic
!
!
policy-map type inspect dns preset_dns_map
 parameters
  message-length maximum 512
policy-map global_policy
 class inspection_default
  inspect dns preset_dns_map 
  inspect ftp 
  inspect h323 h225 
  inspect h323 ras 
  inspect rsh 
  inspect rtsp 
  inspect esmtp 
  inspect sqlnet 
  inspect skinny  
  inspect sunrpc 
  inspect xdmcp 
  inspect sip  
  inspect netbios 
  inspect tftp 
  inspect icmp 
!             
service-policy global_policy global
prompt hostname context 
Cryptochecksum:cdcce898e2e45bfe1279480b92908690
: end

1 комментарий:

  1. Thanks for sharing, nice post!

    Chương trình tuyển cộng tác viên bán quần áo trẻ em lương cao tại nhà và tuyển cộng tác viên bán mỹ phẩm online tphcm làm việc tại nhà hay chia sẻ kinh nghiệm mua hàng trên aliexpress về Việt Nam uy tín nhất, hướng dẫn cách mua hàng trên Taobao uy tín đảm bảo an toàn nhất hay cách mua hàng trên taobao trực tiếp tại web shop taobao com tiếng việt và dịch vụ chuyên nhận đặt mua hộ hàng trên aliexpress uy tín ở đâu tốt nhất và với Ting.vn tự hào là địa chỉ mua hàng xách tay uy tín nhất hiện nay.

    ОтветитьУдалить