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]}





ip-address

Specific IP address to be assigned to a remote peer dialing in to the interface. To prevent duplicate IP addresses from being assigned on more than one interface, this argument cannot be applied to a dialer rotary group nor to an ISDN interface.

dhcp-pool

Retrieves an IP address from an on-demand address pool. This option only supports remote access (PPP) sessions into MPLS VPNs.

dhcp

Retrieves an IP address from the DHCP server.

pool

Uses the global default mechanism as defined by the ip address-pool command unless the optional pool-name argument is supplied. This is the default.

pool-name

(Optional) Name of a local address pool created using the ip local pool command. DHCP retrieves an address from this pool regardless of the global default mechanism setting.

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


Вторая опция - вы создаете настоящий взрослый DHCP пул. Сервер сам у себя запрашивает адрес и передает его клиенту.

Сервер
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 

Все потому, что нет маски. IPCP ее не передает, так как она не нужна на линках точка-точка.
Добавляем две команды:

Сервер
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

Комментарии

  1. Пора переходить на Ethernet и забывать о "девушках" :)

    ОтветитьУдалить
    Ответы
    1. А как же передернуть? IPCP не только у них. Есть еще туннели с паролями, типа L2TP. И потом это не от хорошей жизни - цисковский блюпринт к экзамену суров и беспощаден.

      Удалить

Отправить комментарий

Популярные сообщения из этого блога

Cisco Policing and Shaping.

EDU-JUN-JMV lab on vMX. Part1.

Опять GRE. Мультикаст, MTU и мать всех статей.