Виртуальные CPE с помощью Cisco IOS, VRF, DHCP и NAT

vCPE-scheme

В последнее время не редко можно встретить упоминание концепции vCPE – виртуальной CPE на стороне оператора, технически это означает L2 до оператора (т.е оператор терминирует все абонентские устройства). Причины такого подхода могут быть разные – от персонифицированного родительского контроля до нежелания/неспособности абонента настраивать свою CPE (пробрасывать порты, вешать ACL-и т.п). В этой заметке рассматривается следующий сценарий: каждому абоненту выделяется статический внешний IP, локальная сеть пробрасывается отдельным вланом до устройства vCPEs, в локальной сети используется адресация 192.168.1.0/24 (по желанию абонента может быть изменена), абоненту предоставляются сервисы DHCP, source NAT и NAT port forwarding. В примере используется оборудование Cisco 7200 с ПО “c7200-advipservicesk9-mz.152-4.S5.bin”, но аналогичная конфигурация может быть применена и на современном оборудовании Cisco с ПО IOS или IOS-XE.

Конфигурация ASBR (относящаяся к поставленной задаче):

hostname ASBR
!
interface GigabitEthernet0/0
 description to-vCPEs
 ip address 192.0.2.1 255.255.255.252 //p-t-p сеть между ASBR и vCPEs
!
ip route 198.51.100.0 255.255.255.0 192.0.2.2 //198.51.100.0/24 - выделенная сеть белых адресов под виртуальные CPE

Конфигурация vCPEs: базовые настройки:

hostname vCPEs
!
interface GigabitEthernet1/0
 description to-ASBR
 ip address 192.0.2.2 255.255.255.252 //p-t-p сеть для между ASBR и vCPEs
 ip nat outside //исходящий NAT-интерфейс (смотрит в интернет)
 negotiation auto
!
interface GigabitEthernet2/0
 description to-Clients
 no ip address
 negotiation auto
!
ip vrf Client1 //создаём vrf для 1ого клиента
!
ip vrf Client2 //создаём vrf для 2ого клиента
!
interface GigabitEthernet2/0.11
 encapsulation dot1Q 11 //выделяем 11-ый vlan 1ому клиенту
 ip vrf forwarding Client1 //помещаем этот сабынтрфейс в vrf Client1
 ip address 192.168.1.1 255.255.255.0 
 ip nat inside //входящий NAT-интерфейс (смотрит в сторону клиента)
!
interface GigabitEthernet2/0.12
 encapsulation dot1Q 12 //выделяем 12-ый vlan 2ому клиенту
 ip vrf forwarding Client2 //помещаем этот сабынтрфейс в vrf Client2
 ip address 192.168.1.1 255.255.255.0
 ip nat inside //входящий NAT-интерфейс (смотрит в сторону клиента)

Маршрутизация:

ip route 0.0.0.0 0.0.0.0 192.0.2.1 //маршрут по умолчанию на asbr
ip route 198.51.100.0 255.255.255.0 Null0 //предотвращение петли маршрутизации для трафика, которые не попадает под таблицу трансляций
ip route vrf Client1 0.0.0.0 0.0.0.0 192.0.2.1 global //маршрут по умолчанию для клиента 1 (поскольку клиент находит в vrf, а интернет в GRT, дописываем global)
ip route vrf Client2 0.0.0.0 0.0.0.0 192.0.2.1 global //маршрут по умолчанию для клиента 2 (поскольку клиент находит в vrf, а интернет в GRT, дописываем global)

Настройка NAT:

ip access-list standard Client1 //локальные IP-адреса 1ого клиента, которые будут попадать под NAT
 permit 192.168.1.0 0.0.0.255
!
ip access-list standard Client2 //локальные IP-адреса 1ого клиента, которые будут попадать под NAT
 permit 192.168.1.0 0.0.0.255
!
ip nat pool Client1 198.51.100.0 198.51.100.0 prefix-length 16 //Внешний IP-адрес 1ого клиента
ip nat pool Client2 198.51.100.1 198.51.100.1 prefix-length 16 //Внешний IP-адрес 2ого клиента
!
ip nat inside source list Client1 pool Client1 vrf Client1 overload //привязка 1ого клиента к его внешнему IP-адресу
ip nat inside source list Client1 pool Client2 vrf Client2 overload //привязка 2ого клиента к его внешнему IP-адресу
!
ip nat inside source static tcp 192.168.1.10 23 198.51.100.0 23 vrf Client1 extendable //пример проброса порта 198.51.100.0:23 на 192.168.1.10:23 для 1ого клиента 
ip nat inside source static tcp 192.168.1.10 23 198.51.100.1 23 vrf Client2 extendable //пример проброса порта 198.51.100.1:23 на 192.168.1.10:23 для 2ого клиента 

Относительно “prefix-length 16” – нужно задавать такой prefix-length, чтобы выбранный адрес не был network- или broadcast-адресом, иначе Cisco не даст его использовать. Т.е если вы хотите использовать внешний IP 200.0.0.0, то prefix-length должен быть 7 или меньше.

Настройка DHCP-сервиса для клиентов:

ip dhcp pool Client1 //именной пул для 1ого клиента
 vrf Client1 //привязка пула к vrf 1ого клиента
 network 192.168.1.0 255.255.255.0 //сеть из которой выдавать адреса
 default-router 192.168.1.1 //шлюз по умолчанию, который выдавать 1ому клиенту
 dns-server 203.0.113.1 203.0.113.2 //dns-сервера, которые выдавать 1ому клиенту
!
ip dhcp pool Client2 //именной пул для 2ого клиента
 vrf Client2 //привязка пула к vrf 2ого клиента
 network 192.168.1.0 255.255.255.0 //сеть из которой выдавать адреса
 default-router 192.168.1.1 //шлюз по умолчанию, который выдавать 1ому клиенту
 dns-server 203.0.113.1 203.0.113.2 //dns-сервера, которые выдавать 2ому клиенту
!
ip dhcp excluded-address vrf Client1 192.168.1.2 192.168.1.10 //исключение некоторых адресов .2-.10, чтобы 1ый клиент мог их назначать статически, без dhcp
ip dhcp excluded-address vrf Client2 192.168.1.2 192.168.1.10 //исключение некоторых адресов .2-.10, чтобы 2ой клиент мог их назначать статически, без dhcp

Конфигурация свитча ISP-switch:
vCPE-switch-config

Настройка завершена. Запросим IP-адрес по DHCP с клиента 1 и клиента 2, посмотрим таблицу dhcp-bindings на vCPEs:

vCPEs#show ip dhcp binding 
Bindings from all pools not associated with VRF:
IP address      Client-ID/ 		Lease expiration 	Type       State      Interface

Bindings from VRF pool Client1:
IP address      Client-ID/ 		Lease expiration 	Type       State      Interface
192.168.1.11    0063.6973.636f.2d63.    Nov 09 2014 08:57 PM    Automatic  Active     GigabitEthernet2/0.11
                6130.612e.3031.3564.
                2e30.3030.382d.4769.
                302f.30

Bindings from VRF pool Client2:
IP address      Client-ID/ 		Lease expiration 	Type       State      Interface
192.168.1.11    0063.6973.636f.2d63.    Nov 09 2014 08:57 PM    Automatic  Active     GigabitEthernet2/0.12
                6130.392e.3031.3564.
                2e30.3030.382d.4769.
                302f.30

Из этой таблицы видно, что dhcp-сервис работает per-vrf, как нам и надо.

Проверка пингом:

Client2#ping 192.0.2.1 repeat 2

Type escape sequence to abort.
Sending 2, 100-byte ICMP Echos to 192.0.2.1, timeout is 2 seconds:
!!
Success rate is 100 percent (2/2), round-trip min/avg/max = 80/86/92 ms

ASBR# debug ip icmp
*Nov  8 22:35:40.647: ICMP: echo reply sent, src 192.0.2.1, dst 198.51.100.1
*Nov  8 22:35:40.739: ICMP: echo reply sent, src 192.0.2.1, dst 198.51.100.1
Client1#ping 192.0.2.1 repeat 2

Type escape sequence to abort.
Sending 2, 100-byte ICMP Echos to 192.0.2.1, timeout is 2 seconds:
!!
Success rate is 100 percent (2/2), round-trip min/avg/max = 40/46/52 ms

ASBR# debug ip icmp
*Nov  8 22:37:23.823: ICMP: echo reply sent, src 192.0.2.1, dst 198.51.100.0
*Nov  8 22:37:23.867: ICMP: echo reply sent, src 192.0.2.1, dst 198.51.100.0

Как видно, Client1 пронатился в 198.51.100.0, а Client2 в 198.51.100.1

Проверка проброса портов (для этого назначим на Client1 и Client2 статический адрес 192.168.1.10/24):

ASBR#telnet 198.51.100.0 23
Trying 198.51.100.0 ... Open

User Access Verification

Password: 
Client1>exit
[Connection to 198.51.100.0 closed by foreign host]

ASBR#telnet 198.51.100.1 23
Trying 198.51.100.1 ... Open

User Access Verification

Password: 
Client2>exit

[Connection to 198.51.100.1 closed by foreign host]

И под конец, примеры как посмотреть таблицу трансляций (чтобы узнать к какому vrf относится трансляция нужно использовать verbose):

vCPEs#show ip nat translations         
Pro Inside global      Inside local       Outside local      Outside global
tcp 198.51.100.0:23    192.168.1.10:23    ---                ---
icmp 198.51.100.0:1024 192.168.1.10:25    192.0.2.1:25       192.0.2.1:1024
tcp 198.51.100.1:23    192.168.1.10:23    ---                ---
...
vCPEs#show ip nat translations verbose 
Pro Inside global      Inside local       Outside local      Outside global
tcp 198.51.100.1:1024  192.168.1.11:49179 192.0.2.1:23       192.0.2.1:23
    create 00:00:03, use 00:00:01, left 00:00:58, Map-Id(In): 2, 
    flags: 
extended, timing-out, use_count: 0, VRF : Client2, entry-id: 1, lc_entries: 0
...
Advertisements

3 thoughts on “Виртуальные CPE с помощью Cisco IOS, VRF, DHCP и NAT

  1. MonaxGT

    Давно хотел посмотреть пример использования данного функционала. Спасибо за статью)

    Reply
  2. Yakov

    Вы серъезно ? Настраивать все это руками предлагаете ? Как минимум можно загружать настройки на порт через ISG.

    Reply
    1. Sergey Post author

      Почему руками? Никто не запрещает всё это заливать скриптами.
      Относительно ISG тут не очень понятно как реализовать сам процесс терминации. Если говорить про платформу asr1k, то первая проблема в том, что q-in-q termination с ambigious vlan не работает с vrf selection (когда вы из radius-а говорите какой это будет vrf), вторая, что subnet session не работает с vrf selection. На asr9k не пробовал.

      По крайней мере, для B2B-кастомеров (т.е. не объёмах 100к+) это можно реализовать так как описано в этой статье (руками или скриптами это уже по вашему желанию)

      Reply

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s