Пролог
На хабре было довольно много топиков, описывающих те или иные варианты построения провайдерских сетей, в том числе и с использованием указанных в заголовке технологий. Отчасти они помогли мне в решении своей задачи, но многое пришлось копать самому. Хочу поделиться тем, что получилось и попытаться сэкономить время последователям.
Итак, постоновка задачи:
Необходимо организовать сеть, максимально удобную для конечного пользователя, при этом также удобную (с точки зрения минимальной нагрузки на техподдержку) и безопасную (с точки зрения мошенничества) для оператора. К тому же сеть должна быть недорогой. Кто-то возразит, что Cisco и «недорого» — несовместимые понятия, однако для решения нашей задачи годятся и End of Life старички, которые можно приобрести по очень демократичным ценам.
Для обеспечения удобства пользователя были отброшены следующие варианты:
- статическое назначение ip-адресов — неудобно для пользователя, адрес нужно где-то записывать, потерявшие адрес пользователи названивают в техподдержку
- dhcp с привязкой по mac-адресу — неудобно для пользователя, при смене устройства нужно перерегистрировать его у провайдера или менять на нем mac.
- всевозможные виды туннелей, в основном pptp — требует настройки у клиента, забытые логины и пароли
Из всех рассмотренных вариантов для пользователя наиболее удобен вариант с DHCP, но для провайдера есть ряд сложностей:
Привязка по mac неудобна, так как придется перерегистрировать новые mac-адреса. Аутентификация пользователя в биллинге только по ip-адресу тоже на первый взгляд кажется ненадежной, хитрый пользователь может поставить себе вручную ip-адрес соседа и внести смуту. Однако решение есть и строится оно на технологиях из заголовка статьи — option 82 и dynamic arp inspection
Кому интересно решение — прошу под кат
Решение
DHCP сервер для выдачи адресов будет ориентироваться на опцию 82, которая определяет, с какого физического порта коммутатора пришел запрос на получение адреса. Таким образом мы добиваемся того, что Вася Пупкин из 14-й квартиры, кабель которого подключен в 7-й порт нашего коммутатора SW-01 всегда получит адрес 10.10.1.7, например, вне зависимости от того, какое устройство он подключит к своему кабелю. Такой подход позволяет нам идентифицировать Васю Пупкина только по IP-адресу, но тут есть проблема. Сосед Жора, который не хочет платить за инет, поставит себе руками адрес Васи Пупкина, создаст в сети конфликт IP-адресов и будет пользоваться Интернетом за счет Васи.
Чтобы такого не произошло, существует технология Dynamic ARP Inspection. Суть технологии сводится к проверке связки mac+ip, полученных от DHCP-сервера и сравнении их с ARP-запросами, поступающими на порт. Таким образом, даже если сосед Жора поставит себе такой же mac и IP, как у Васи, коммутатор проверит, выдавал ли DHCP в этот порт такой IP такому mac-у. Если не выдавал, пакет будет отброшен.
Собственно настройка
В нашем распоряжении есть два коммутатора: Cisco 2950-24 и Cisco 2960-24-TT-L
Коммутатор 2950 будет использоваться для подключения абонентов. На нем сконфигурирован Management vlan 254 для управления.
IP коммутатора — 10.0.254.10, mac — 00:11:92:1B:3A:00
Коммутатор 2960 будет выступать в роли DHCP-сервера и решать задачу инспектирования ARP.
IP коммутатора — 10.0.254.2, mac — 00:16:C8:D7:D2:80
MAC можно посмотреть командой show version
cisco WS-C2950-24 (RC32300) processor (revision P0) with 19911K bytes of memory.
Processor board ID FOC0825Z1GD
Last reset from system-reset
Running Standard Image
24 FastEthernet/IEEE 802.3 interface(s)
32K bytes of flash-simulated non-volatile configuration memory.
Base ethernet MAC Address: 00:11:92:1B:3A:00
Коммутатор 2950 не поддерживает Dynamic ARP Inspection, но мы можем решить эту задачу на вышестоящем коммутаторе. В примере в качестве такого коммутатора использован Cisco 2960-24-TT-L, хотя более правильно использовать L3 коммутатор, например, 3550-12T или 3550-12G, тогда он сможет решить и задачу Inter-VLAN Routing тоже.
И так, на С2950 конфигурируем следующее:
- В режиме глобальной конфигурации указываем необходимость добавления опций в dhcp-relay сообщение:
ip dhcp relay information option
- В настройках management-интерфейса указать, что DHCP-запросы нужно пересылать на 2960-й коммутатор по адресу 10.0.254.2
interface Vlan254 ip address 10.0.254.10 255.255.255.0 ip helper-address 10.0.254.2
- В режиме глобальной конфигурации активировать DHCP-snooping для всех наших vlan-ов
ip dhcp snooping vlan 10 ip dhcp snooping vlan 20 ip dhcp snooping vlan 254 ip dhcp snooping
- Определить, что DHCP-offer разрешены только с порта 24, к которому подключен вышестоящий 2960 с DHCP-сервером.
interface FastEthernet0/24 ip dhcp snooping trust
Конфигурация С2960 чуть более сложная:
- Для каждого пользователя необходимо создать запись ip dhcp class
ip dhcp class user01 remark SW2950-1 port 01 relay agent information relay-information hex 01060004000a0001020800060011921b3a00
В классе достаточно указать только relay-information, но для удобства также рекомендуется использовать комментарий remark, в который можно записать, например, данные абонента.
Здесь самое важное — понять принцип формирования hex-строки. Это 18 байт, содержащиеся в option 82
Ее содержимое состоит из двух полей: circuit-id и remote-id
circuit-id содержит номер vlan и номер физического порта, с которого пришел dhcp запрос.
remote-id содержит mac-адрес коммутатора, который отправил этот запрос.
Данную строку можно извлечь анализатором wireshark, но делать это для каждого абонента неудобно, поэтому рассмотрим, как ее сгенерировать.
- После создания dhcp-классов для абонентов, настроим пулы адресов для каждого влана
Время аренды адреса указано 5 минут. Это нужно для того, чтобы при подключении нового устройства с другим адресом в свой порт, абонент быстро получил на него адрес. В противном случае будет ошибка, что данный пул исчерпан, так как в нем всего 1 адрес. Кроме того, в примере опущены остальные настройки dhcp-пула, такие, как шлюз, днс и т.д.
ip dhcp pool vlan10 network 10.0.10.0 255.255.255.0 lease 0 0 5 class user01 address range 10.0.10.11 10.0.10.11 class user02 address range 10.0.10.12 10.0.10.12
- Необходимо сконфигурировать на коммутаторе соответствующие ip-интерфейсы для каждого пула. Делается это через interface vlan
Не смотря на то, что С2960 является коммутатором второго уровня, он позволяет держать активными несколько ip-интерфейсов, но не может маршрутизировать между ними трафик.
interface Vlan10 ip address 10.0.10.2 255.255.255.0 ! interface Vlan20 ip address 10.0.20.2 255.255.255.0 ! interface Vlan254 ip address 10.0.254.2 255.255.255.0
- На этом коммутаторе нам тоже необходимо настроить dhcp-snooping, так как эта опция формирует базу привязки выданных IP-адресов к mac-адресам.
Командой ip dhcp snooping database мы определим место хранения базы, в примере она будет храниться в файле dhcp на флеш. Можно также указать в качестве места хранения ftp, tftp, http, https, scp и другие url.
Команда ip dhcp snooping information option allow-untrusted разрешает принимать запросы с опцией 82 со всех портов коммутатора.
ip dhcp snooping vlan 10 ip dhcp snooping vlan 20 ip dhcp snooping information option allow-untrusted ip dhcp snooping database flash:dhcp ip dhcp snooping
- На данный момент у нас работает привязка ip-адреса к физическому порту коммутатора. Остается настроить Dynamic ARP Inspection. Делается это одной простой командой:
ip arp inspection vlan 10,20
Proof of Concept
Проверим назначение адреса клиенту, подключенному в 9-й порт коммутатора. Порт находится в 20-м влане, согласно нашей схемы, клиент должен получить адрес 10.0.20.9
Сформируем значение hex: 0106000400140008020800060011921b3a00
где 0014 — 20-й влан,
0008 — 9-й порт коммутатора
0011921b3a00 — его mac.
ip dhcp class user09
remark SW2950-1 port 09
relay agent information
relay-information hex 0106000400140008020800060011921b3a00
ip dhcp pool vlan20
network 10.0.20.0 255.255.255.0
lease 0 0 5
class user09
address range 10.0.20.9 10.0.20.9
Так этот обмен выглядит в wireshark:
А так выглядит вывод команды debug ip dhcp server events
2d00h: DHCPD: Sending notification of DISCOVER:
2d00h: DHCPD: htype 1 chaddr 000a.e45b.dcc6
2d00h: DHCPD: remote id 00060011921b3a00
2d00h: DHCPD: circuit id 000400140008
2d00h: DHCPD: interface = Vlan20
2d00h: DHCPD: class id 4d53465420352e30
2d00h: DHCPD: out_vlan_id 0
2d00h: DHCPD: DHCPOFFER notify setup address 10.0.20.9 mask 255.255.255.0
2d00h: DHCPD: Sending notification of ASSIGNMENT:
2d00h: DHCPD: address 10.0.20.9 mask 255.255.255.0
2d00h: DHCPD: htype 1 chaddr 000a.e45b.dcc6
2d00h: DHCPD: lease time remaining (secs) = 300
2d00h: DHCPD: interface = Vlan20
2d00h: DHCPD: out_vlan_id 0
000a.e45b.dcc6 — mac-адрес клиента
Теперь подключаем в этот же порт другой ноутбук.
2d00h: DHCPD: Sending notification of DISCOVER:
2d00h: DHCPD: htype 1 chaddr 089e.012b.6ce1
2d00h: DHCPD: remote id 00060011921b3a00
2d00h: DHCPD: circuit id 000400140008
2d00h: DHCPD: interface = Vlan20
2d00h: DHCPD: class id 4d53465420352e30
2d00h: DHCPD: out_vlan_id 0
2d00h: DHCPD: no free address within the address range for class user09 in pool vlan20
2d00h: DHCPD: Sending notification of ASSIGNMENT FAILURE:
Сначала мы получаем сообщение о том, что в пуле нет свободных адресов (так как 5 минут, выделенные на аренду этого адреса другому маку, еще не истекли).
Однако через некоторое время мы получаем нужный нам адрес, но уже для клиента с маком 08-9e-01-2b-6c-e1
2d00h: DHCPD: Sending notification of DISCOVER:
2d00h: DHCPD: htype 1 chaddr 089e.012b.6ce1
2d00h: DHCPD: remote id 00060011921b3a00
2d00h: DHCPD: circuit id 000400140008
2d00h: DHCPD: interface = Vlan20
2d00h: DHCPD: class id 4d53465420352e30
2d00h: DHCPD: out_vlan_id 0
2d00h: DHCPD: Adding binding to radix tree (10.0.20.9)
2d00h: DHCPD: Adding binding to hash tree
2d00h: DHCPD: assigned IP address 10.0.20.9 to client 0108.9e01.2b6c.e1. (316 0)
2d00h: DHCPD: DHCPOFFER notify setup address 10.0.20.9 mask 255.255.255.0
2d00h: DHCPD: Sending notification of ASSIGNMENT:
Теперь проверим, сможет ли сосед нашего клиента, подключенный к порту 10 коммутатора, поставить себе вручную адрес 10.0.20.9
Так как Cisco 2950 не поддерживает Dynamic ARP Inspection, данную технологию нужно настраивать на вышестоящем коммутаторе Cisco 2960.
Команда show ip dhcp snooping binding на С2960 покажет привязку IP адресов к mac-ам
MacAddress IpAddress Lease(sec) Type VLAN Interface
------------------ --------------- ---------- ------------- ---- --------------------
08:9E:01:2B:6C:E1 10.0.20.9 288 dhcp-snooping 20 FastEthernet0/1
Total number of bindings: 1
FastEthernet0/1 — интерфейс коммутатора 2960, в который включен нижестоящий 2950.
Подключим в 10-й порт С2950 компьютер с настроенным вручную адресом 10.0.20.9
И тут же увидим уведомление об ошибке, из которого видно, что она произошла в 20-м влане на 1-м порту коммутатора. Кроме того, мы видим айпи и мак адреса, которые вызвали ошибку. 000a.e45b.dcc6/10.0.20.9/
2d01h: %SW_DAI-4-DHCP_SNOOPING_DENY: 1 Invalid ARPs (Req) on Fa0/1, vlan 20.([000a.e45b.dcc6/10.0.20.9/0000.0000.0000/10.0.20.9/23:48:25 EEST Mon Sep 2 2013])
Узнать, кто конкретно попытался мошенничать можно зайдя на коммутатор С2950 и посмотрев таблицу коммутации
SW2950-1#show mac-address-table
Mac Address Table
-------------------------------------------
Vlan Mac Address Type Ports
---- ----------- -------- -----
20 000a.e45b.dcc6 DYNAMIC Fa0/10
20 089e.012b.6ce1 DYNAMIC Fa0/9
Мы видим, что интересующий нас mac висит на порту 10.
На этом, пожалуй, все, дополнительную информацию можно найти в этих статьях:
Особенности работы и настройки DHCP на маршрутизаторах Cisco
Особенности работы и настройки DHCP на маршрутизаторах Cisco (Часть 2)
IPoE, а также Client-VLAN и DHCP Option 82
Проблема IPoE — от себя добавлю, что тут как раз нет проблемы, если все правильно настроено.
Атака канального уровня ARP-spoofing и как защитить коммутатор Cisco — хорошая статья, показывающая еще одну пользу от Dynamic ARP Inspection — повышение безопасности сети в целом.