Getting IP via IPCP. DHCP, option 82, Piglet and Kanga.
Здесь будут все дичайшие верования, слепые заблуждения и вдохновляющая история обретения человечеством IP адреса.
Через IPCP к звездам
В целом на серийных линках нельзя так просто взять и включить DHCP клиент. Нет Ethernetа и бродкаста. Однако адрес можно получить в рамках IPCP, когда обе стороны сообщают свой адрес и добавляют его с 32 маской в RIB. С тем же успехом можно выделять адрес друг другу.
Возьмем два роутера с серийным линком
Серверу предлагаются следующие способы для передачи IP адреса клиенту через команду
peer default ip address {ip-address | dhcp-pool | dhcp | pool [pool-name]}
Static
Первая опция - вы пишите на сервере адрес руками. Клиент его получает.
Сервер
R2#sh run int ser1/0
!
interface Serial1/0
ip address 188.1.12.2 255.255.255.0
encapsulation ppp
peer default ip address 188.1.12.1
Клиент
R1#sh run int ser1/0
!
interface Serial1/0
ip address negotiated
R1#sh ip interface serial 1/0
Serial1/0 is up, line protocol is up
Internet address is 188.1.12.1/32
Broadcast address is 255.255.255.255
Address determined by IPCP
DHCP-pool
Сервер
R2#sh run interface ser1/0
!
interface Serial1/0
ip address 188.1.12.2 255.255.255.0
encapsulation ppp
peer default ip address dhcp-pool POOL
R2#sh run | sec dhcp
ip dhcp excluded-address 188.1.12.2
ip dhcp pool POOL
network 188.1.12.0 255.255.255.0
peer default ip address dhcp-pool POOL
На клиенте все тоже самое
POOL
Третья опция. Как вы понимаете из всего богатства DHCP в предыдущем примере мы берем только адрес. Зачем тогда оно нам? Сделаем просто пул, локальный, без всяких заморочек.
R2#sh run | sec POOL
ip local pool POOL 188.1.12.1
R2#sh run interface ser1/0
!
interface Serial1/0
ip address 188.1.12.2 255.255.255.0
encapsulation ppp
peer default ip address pool POOL
DHCP-proxy
И наконец если написать DHCP то включится механизм проксирования дхцп запросов. Для этого на сервере нужно настроить ip dhcp helper с адресом другого сервера (например роутер R3). Тогда наш сервер R2 будет генерировать запрос, релеить его на R3 а ответ отдавать по IPCP.
Для оптовиков
Если вы лентяй и на каждом интерфейсе не хотите указывать механизм передачи адреса - включите его дефолтом для всех клиентов разом. Тогда на интерфейсе ничего указывать не надо
R2(config)#ip address-pool ?
dhcp-pool Use local DHCP pools
dhcp-proxy-client Use DHCP proxy client feature
local Use Local IP Address pooling
ODAP Manager. Маска, кто ты?
А если у вашего клиента есть свои клиенты. Но раздавать вы хотите все тот же пул. Не беда, вам поможет DHCP Server On-Demand Address Pool Manager. Создаете локально пул и указываете откуда он должен наполняться.
R1#sh run | sec pool
ip dhcp pool ONEDEMAND
origin ipcp
В качестве origin можно выбрать RADIUS server, другой DHCP или наш IPCP
R1(dhcp-config)#origin ?
aaa Subnet is from a AAA server
dhcp Subnet is from another DHCP server
file Static bindings are read from an external file
ipcp Subnet is from IPCP subnet negotiation
Все бы норм, но не работает)))
R1(config)#do sh ip dhcp pool
Pool ONEDEMAND :
Utilization mark (high/low) : 100 / 0
Subnet size (first/next) : 0 / 0
Total addresses : 0
Leased addresses : 0
Pending event : none
0 subnet is currently in the pool
Добавляем две команды:
Сервер
R2(config-if)#do sh run int ser1/0
!
interface Serial1/0
ip address 188.1.12.2 255.255.255.0
encapsulation ppp
peer default ip address pool POOL
ppp ipcp mask 255.255.255.0
Клиент
R1(config-if)#do sh run interf ser1/0
!
interface Serial1/0
ip address negotiated
encapsulation ppp
ppp ipcp mask request
Результат
R1(config-if)#do sh ip dhcp pool
Pool ONEDEMAND :
Utilization mark (high/low) : 100 / 0
Subnet size (first/next) : 0 / 0
Total addresses : 254
Leased addresses : 0
Pending event : none
1 subnet is currently in the pool :
Current index IP address range Leased addresses
188.1.12.1 188.1.12.1 - 188.1.12.254 0
Опция 82
Одним из полей DHCP пакета является GIADDR - адрес гейта. При ретрансляции DHCP запроса релей пишет туда вместо 0 свой IP адрес с интерфейса, смотрящего на клиента. Так как они с клиентом в одной сети, сервер глядя в GIADDR понимает из какого пула ему выдать IP.
Зачем?
Все чудесно работает, тем не менее релей вставляет в пакеты еще и эту опцию, которая выглядит как HEX, полученный из номера опции, длинны и до 255 подопций, среди которых, например, ID релея (какой то адрес, например МАС) или например ID порта, с которого пришел запрос. Все это нужно, чтобы связать выдаваймый адрес с параметрами ретранслятора. А это уже позволяет дробить наш пул на части и выдавать их порелейно.
Дробление достигается за счет создания классов, в которых мы матчим опцию регекспом. Классы привязываются к пулу, им указываются диапазоны. А на стороне релея мы можем вставлять в опцию свои подопции и таким образом создавать группы релеев, которым достанется одинаковый класс.
Разве не здорово? DHCP snooping.
Все хорошо, пока мы не включаем механизм защиты от несанкционированных DHCP серверов - DHCP snooping. Он тоже смотрит на опцию 82 и не пропускает пакеты с ней со стороны клиентских портов. Что хуже - свич с этой функцией сам вставляет опцию 82, при этом не меняет поле GIADDR в пакете (он же не релей, поле остается нулевым). Тогда ближайший маршрутизатор (или релей) отбросит такой пакет. Для лечения нужно на релее после свича ввести ip dhcp relay information trust-all, или отключить на коммутаторе вставку опции 82.
Литература
Единственный вопрос, который у меня остался - за что это все?
Две отличных статьи от Петра про опцию 82 и маску через IPCP
Пора переходить на Ethernet и забывать о "девушках" :)
ОтветитьУдалитьА как же передернуть? IPCP не только у них. Есть еще туннели с паролями, типа L2TP. И потом это не от хорошей жизни - цисковский блюпринт к экзамену суров и беспощаден.
Удалить