lunes, 2 de enero de 2017

Utilizar DHCP Policies para asignar direcciones IP a equipos con un Class ID especifico.

¡Hola a todos! 
En esta oportunidad les quiero acercar el paso a paso para crear una política de DHCP para poder permitir que los servidores DHCP puedan otorgar direcciones IP dentro de un Scope especifico a equipos que tengan definido el valor ClassID (UserClassInformation).
Como todos saben, las políticas de DHCP son una de las funcionalidades introducidas en Windows Server 2012. Esta funcionalidad permite configurar un servidor DHCP para que pueda asignar direcciones IP u Opciones especificas basado en ciertas condiciones que pueden ser definidas. Dichas Condiciones son las siguientes:
  • Dirección MAC
  • Vendor Class
  • User Class
  • Client Identifier
  • Relay Agent Information (y sus diferentes opciones) 
Para más información acerca de las políticas de DHCP les recomiendo revisar la siguiente nota de nuestro blog. 
En esta nueva entrada nos vamos a enfocar exclusivamente en la asignación por ClassID. El ClassID es un parámetro que podemos asignar a los equipos mediante línea de comando utilizando IPCONFIG. Debido a que es un parámetro que se configura por NIC, por el momento solo tenemos este método para asignarlo, pero se puede utilizar un logon script y aplicarlo vía GPO si se necesita realizar de manera masiva.
Para más información de cómo configurar el ClassID en nuestros clientes DHCP les recomiendo revisar la siguiente nota 
Ahora sí, ¡vamos a poner manos a la obra! 
En primer lugar, en nuestro laboratorio usamos la siguiente configuración:
  •  Un equipo con Windows 10 utilizando el ClassID “Class1”, llamado “Windows10”
    • La dirección MAC de este equipo es 00-15-5D-00-02-06, la vamos a utilizar para confirmar a quien pertenecen los paquetes de DHCP
  • Un equipo con Windows 8.1 sin ClassID especificado, llamado “WIN81”
    • La dirección MAC de este equipo es 00-15-5D-00-02-09, misma utilidad
  • Un Servidor DHCP con Windows 2012 R2
    • El DHCP posee un único Scope con 100 direcciones disponibles, configurado en la red 10.0.0.0, con un pool entre las direcciones .100 y .200

Se puede utilizar el laboratorio definido en esta nota, solo que nosotros vamos a utilizar otro parámetro para crear las políticas. 
Nuestra intención en este laboratorio es que el DHCP solamente entregue direcciones IP a los equipos que poseen el ClassID configurado, y que no responda a los equipos que no poseen este campo, o que poseen otro ClassID diferente. 
Una vez tuvimos todo definido, procedimos a hacer las pruebas. En nuestro caso utilizamos Network Monitor 3.4 mientras capturamos tráfico desde el servidor DHCP, para poder obtener la información que está llegando al servidor. 
Primero probamos sin las Policies para ver cómo se envía la información en el paquete DISCOVER: 
Win81:
Frame Number
Time and Date
Time Delta
SourceIP
Destination IP
Protocol
Description
ConversationID
28
7:24:28 AM 12/27/2016
0.0000000
0.0.0.0
255.255.255.255
DHCP
DHCP:RequestMsgType = DISCOVER, TransactionID
= 0xC72EA3B9
{DHCP:16, UDP:18, IPv4:17}
29
7:24:28 AM 12/27/2016
0.0004758
10.0.0.15
255.255.255.255
DHCP
DHCP:ReplyMsgType = OFFER, TransactionID
= 0xC72EA3B9
{DHCP:16, UDP:18, IPv4:17}
30
7:24:28 AM 12/27/2016
0.0013013
0.0.0.0
255.255.255.255
DHCP
DHCP:RequestMsgType = REQUEST, TransactionID
= 0xC72EA3B9
{DHCP:16, UDP:18, IPv4:17}
31
7:24:28 AM 12/27/2016
0.0009594
10.0.0.15
255.255.255.255
DHCP
DHCP:ReplyMsgType = ACK, TransactionID =
0xC72EA3B9
{DHCP:16, UDP:18, IPv4:17}

Vemos el detalle del paquete DISCOVER: 

Frame: Number = 28, Captured Frame Length = 342, MediaType = ETHERNET
+ Ethernet: Etype = Internet
IP (IPv4),DestinationAddress:[FF-FF-FF-FF-FF-FF],SourceAddress:[00-15-5D-00-02-09]
+ Ipv4: Src = 0.0.0.0, Dest = 255.255.255.255, Next Protocol = UDP, Packet ID = 12960, Total IP Length = 328
UdpSrcPort = BOOTP client(68), DstPort = BOOTP server(67), Length = 308
– Dhcp: Request, MsgType = DISCOVER, TransactionID = 0xC72EA3B9
    OpCode: Request, 1(0x01)
    Hardwaretype: Ethernet
    HardwareAddressLength: 6 (0x6)
    HopCount: 0 (0x0)
    TransactionID: 3341722553 (0xC72EA3B9)
    Seconds: 0 (0x0)
  + Flags: 0 (0x0)
    ClientIP: 0.0.0.0
    YourIP: 0.0.0.0
    ServerIP: 0.0.0.0
    RelayAgentIP: 0.0.0.0
  + ClientHardwareAddress: 00-15-5D-00-02-09 ­­à MAC de la VM que usamos
   ServerHostName
    BootFileName:
    MagicCookie: 99.130.83.99
  + MessageType: DISCOVER – Type 53
  + clientID: (Type 1) – Type 61
  + RequestedIPAddress: 10.0.0.102 – Type 50
 – DHCPEOptionsHostName:
   + HostNameWIN81 – Type 12  à Aquí se ve el nombre del equipo. No hay ningún otro parámetro definido como User Class
  – DHCPEOptionsVendorClassIdentifier:
   + VendorClassIdentifierMSFT 5.0 – Type 60 à Aquí se ve el Vendor Class (otra de las variables que se pueden usar para las Policies) definido como “MSFT 5.0” indicando que es un Windows.
  ParameterRequestList:  – Type 55
  + End:
    Padding: Binary Large Object (9 Bytes) 

WIN10:

Frame Number
Time and Date
Time Delta
Source IP
Destination IP
Protocol
Description
Conversation ID
344
7:25:00 AM 12/27/2016
3.1722974
0.0.0.0
255.255.255.255
DHCP
DHCP:RequestMsgType = DISCOVER, TransactionID
= 0xA287BD46
{DHCP:150, UDP:18, IPv4:17}
345
7:25:00 AM 12/27/2016
0.0366063
10.0.0.15
255.255.255.255
DHCP
DHCP:ReplyMsgType = OFFER, TransactionID
= 0xA287BD46
{DHCP:150, UDP:18, IPv4:17}
346
7:25:00 AM 12/27/2016
0.0012689
0.0.0.0
255.255.255.255
DHCP
DHCP:RequestMsgType = REQUEST, TransactionID
= 0xA287BD46
{DHCP:150, UDP:18, IPv4:17}
347
7:25:00 AM 12/27/2016
0.0009970
10.0.0.15
255.255.255.255
DHCP
DHCP:ReplyMsgType = ACK, TransactionID =
0xA287BD46
{DHCP:150, UDP:18, IPv4:17}

Detalle del paquete DISCOVER:

  Frame: Number = 344, Captured Frame Length = 345, MediaType = ETHERNET
+ Ethernet: Etype = Internet IP (IPv4),DestinationAddress:[FF-FF-FF-FF-FF-FF],SourceAddress:[00-15-5D-00-02-06]
+ Ipv4: Src = 0.0.0.0, Dest = 255.255.255.255, Next Protocol = UDP, Packet ID = 25292, Total IP Length = 331
UdpSrcPort = BOOTP client(68), DstPort = BOOTP server(67), Length = 311
– Dhcp: Request, MsgType = DISCOVER, TransactionID = 0xA287BD46
    OpCode: Request, 1(0x01)
    Hardwaretype: Ethernet
    HardwareAddressLength: 6 (0x6)
    HopCount: 0 (0x0)
    TransactionID: 2726804806 (0xA287BD46)
    Seconds: 0 (0x0)
  + Flags: 32768 (0x8000)
    ClientIP: 0.0.0.0
    YourIP: 0.0.0.0
    ServerIP: 0.0.0.0
    RelayAgentIP: 0.0.0.0
  + ClientHardwareAddress: 00-15-5D-00-02-06 à MAC de la VM.
    ServerHostName:
    BootFileName:
    MagicCookie: 99.130.83.99
  + MessageType: DISCOVER – Type 53
  – DHCPEOptionsUserClassInformation:
   + UserClassInformation: Class1 – Type 77 à Este es el parámetro del ClassID. Como se puede observar es del tipo “UserClassInformation”, por lo que debemos usar ese tipo de Policy para poder lograr nuestro cometido.
  clientID: (Type 1) – Type 61
  + RequestedIPAddress: 10.0.0.100 – Type 50
  – DHCPEOptionsHostName:
   + HostNameWindows10 – Type 12 à Nombre de la máquina, definido como “Windows10”
  – DHCPEOptionsVendorClassIdentifier:
   + VendorClassIdentifierMSFT 5.0 – Type 60  à Aquí se ve el Vendor Class (otra de las variables que se pueden usar para las Policies) definido como “MSFT 5.0” indicando que es un Windows.
  + ParameterRequestList:  – Type 55
  + End:

Como pudimos observar, en la maquina con Windows 10 tenemos el parámetro UserClassInformation conteniendo nuestro ClassID, tal como se puede ver en el siguiente IPCONFIG: 
C:\Windows\system32>ipconfig /all
Windows IP Configuration
   Host Name . . . . . . . . . . . . : Windows10
   Primary Dns Suffix  . . . . . . . : DALAB.TEST
   Node Type . . . . . . . . . . . . : Hybrid
   IP Routing Enabled. . . . . . . . : No
   WINS Proxy Enabled. . . . . . . . : No
   DNS Suffix Search List. . . . . . : DALAB.TEST

Ethernet adapter LAN:
    Connection-specific DNS Suffix  . : DALAB.TEST
   Description . . . . . . . . . . . : Microsoft Hyper-V Network Adapter #2
   Physical Address. . . . . . . . . : 00-15-5D-00-02-06
   DHCP Enabled. . . . . . . . . . . : Yes
   Autoconfiguration Enabled . . . . : Yes
   Link-local IPv6 Address . . . . . : fe80::3d33:2adb:23bf:4ad6%4(Preferred)
   IPv4 Address. . . . . . . . . . . : 10.0.0.100(Preferred)
   Subnet Mask . . . . . . . . . . . : 255.255.255.0
   Lease Obtained. . . . . . . . . . : Tuesday, December 27, 2016 5:07:20 AM
   Lease Expires . . . . . . . . . . : Tuesday, December 27, 2016 6:08:09 AM
   Default Gateway . . . . . . . . . : fe80::215:5dff:fe00:204%4
                                       10.0.0.254
   DHCPv4 Class ID . . . . . . . . . : Class1
   DHCP Server . . . . . . . . . . . : 10.0.0.15
   DHCPv6 IAID . . . . . . . . . . . : 50337117
   DHCPv6 Client DUID. . . . . . . . : 00-01-00-01-1F-C8-F4-0D-00-15-5D-00-02-07
   DNS Servers . . . . . . . . . . . : 10.0.0.15
                                       10.0.0.2
   NetBIOS over Tcpip. . . . . . . . : Enabled

Una vez confirmado el tipo de clase que tenemos que utilizar, procedimos a crear nuestro User Class en el DHCP y nuestra DHCP Policy. Cabe destacar que, para poder hacer restricciones de IP, la Policy debe ser creada en el Scope y no en el protocolo a nivel general. Creando la política es creada en el protocolo (IPv4 o IPv6) solo nos permitirá modificar opciones de DHCP, pero no nos dará la opción de hacer restricciones de IP.

El procedimiento realizado fue el siguiente:
  • Abrimos la consola del DHCP.
  • Hacemos click derecho en el protocolo (en nuestro caso IPv4) y Seleccionamos “Define User Classes…”
 1 
  • En la ventana damos click en “Add”
 2 
  • Definimos los siguientes parámetros:
    1. Display Name: Class1
    2. Description: Una descripción, en nuestro caso “Class1”
    3. En la columna ASCII escribimos el nombre de nuestra clase (en nuestro caso “Class1”)
    4. OK
 3 
  • Nos debería quedar algo así, donde una vez confirmado, hacemos click en Close:
 4 
  • Expandimos el Scope que deseamos (en nuestro caso es el único: 10.0.0.0).
  • Hacemos click derecho en “Policies” y elegimos “New Policy”
 5 
  • Damos un nombre a la Policy (en nuestro caso ClassID Test)
 6 
  • Elegimos solo una condición, para ello hacemos click en el botón “Add”
 7 
  • En la ventana de las condiciones elegimos:
    1. Criteria: User Class
    2. Operator: Equals
    3. Value: Class1 (la clase que creamos previamente)
    4. Add
    5. OK
 8 
  • Volviendo a la ventana de las condiciones, nos debería quedar así, damos Next:
 9 
  • Aquí debemos definir la totalidad del Pool de direcciones del Scope, para que solo le asigne direcciones a ese ClassID, caso contrario, al resto de los equipos, les podría otorgar una dirección IP que esté fuera de este rango. Damos Next:
 10 
  • En este laboratorio no nos interesa definir ninguna opción especial para el DHCP, por lo que en esta ventana damos Next sin tocar nada:
 11 
  • Revisamos el resumen y damos click a Finish:
 12 
  • En la ventana del DHCP vamos a ver lo siguiente:
 13 
Una vez que finalizamos con la configuración del DHCP, debemos hacer la prueba desde los clientes.
La siguiente tabla muestra el comportamiento de las peticiones hechas por la maquina WIN81: 
Frame Number
Time and Date
Time Delta
Source IP
Destination IP
Protocol
Description
Conversation ID
130
7:12:06 AM 12/27/2016
0.0000000
0.0.0.0
255.255.255.255
DHCP
DHCP:RequestMsgType = DISCOVER, TransactionID
= 0xDF901C50
{DHCP:25, UDP:51, IPv4:50}
137
7:12:09 AM 12/27/2016
3.4806414
0.0.0.0
255.255.255.255
DHCP
DHCP:RequestMsgType = DISCOVER, TransactionID
= 0xDF901C50
{DHCP:25, UDP:51, IPv4:50}
171
7:12:13 AM 12/27/2016
3.9845302
0.0.0.0
255.255.255.255
DHCP
DHCP:RequestMsgType = DISCOVER, TransactionID
= 0xDF901C50
{DHCP:25, UDP:51, IPv4:50}
174
7:12:22 AM 12/27/2016
9.0094941
0.0.0.0
255.255.255.255
DHCP
DHCP:RequestMsgType = DISCOVER, TransactionID
= 0xDF901C50
{DHCP:25, UDP:51, IPv4:50}
189
7:12:38 AM 12/27/2016
15.9084890
0.0.0.0
255.255.255.255
DHCP
DHCP:RequestMsgType = DISCOVER, TransactionID
= 0xDF901C50
{DHCP:25, UDP:51, IPv4:50}
261
7:13:10 AM 12/27/2016
31.4478446
0.0.0.0
255.255.255.255
DHCP
DHCP:RequestMsgType = DISCOVER, TransactionID
= 0xBCE19FCF
{DHCP:33, UDP:51, IPv4:50}
263
7:13:14 AM 12/27/2016
3.9777514
0.0.0.0
255.255.255.255
DHCP
DHCP:RequestMsgType = DISCOVER, TransactionID
= 0xBCE19FCF
{DHCP:33, UDP:51, IPv4:50}
265
7:13:22 AM 12/27/2016
8.0122051
0.0.0.0
255.255.255.255
DHCP
DHCP:RequestMsgType = DISCOVER, TransactionID
= 0xBCE19FCF
{DHCP:33, UDP:51, IPv4:50}
269
7:13:38 AM 12/27/2016
16.4807827
0.0.0.0
255.255.255.255
DHCP
DHCP:RequestMsgType = DISCOVER, TransactionID
= 0xBCE19FCF
{DHCP:33, UDP:51, IPv4:50}

Si revisamos el detalle de cualquiera de los paquetes, vemos lo siguiente: 

Frame: Number = 130, Captured Frame Length = 342, MediaType = ETHERNET
+ Ethernet: Etype = Internet IP (IPv4),DestinationAddress:[FF-FF-FF-FF-FF-FF],SourceAddress:[00-15-5D-00-02-09]
+ Ipv4: Src = 0.0.0.0, Dest = 255.255.255.255, Next Protocol = UDP, Packet ID = 12942, Total IP Length = 328
UdpSrcPort = BOOTP client(68), DstPort = BOOTP server(67), Length = 308
– Dhcp: Request, MsgType = DISCOVER, TransactionID = 0xDF901C50
    OpCode: Request, 1(0x01)
    Hardwaretype: Ethernet
    HardwareAddressLength: 6 (0x6)
    HopCount: 0 (0x0)
    TransactionID: 3750763600 (0xDF901C50)
    Seconds: 0 (0x0)
  + Flags: 0 (0x0)
    ClientIP: 0.0.0.0
    YourIP: 0.0.0.0
    ServerIP: 0.0.0.0
    RelayAgentIP: 0.0.0.0
  + ClientHardwareAddress: 00-15-5D-00-02-09 à MAC del equipo WIN81
    ServerHostName:
    BootFileName:
    MagicCookie: 99.130.83.99
  + MessageType: DISCOVER – Type 53
  + clientID: (Type 1) – Type 61
  + RequestedIPAddress: 10.0.0.102 – Type 50
  – DHCPEOptionsHostName:
   + HostNameWIN81 – Type 12 à Host name del equipo, indicando que es el WIN81.
  – DHCPEOptionsVendorClassIdentifier:
   + VendorClassIdentifier: MSFT 5.0 – Type 60
  + ParameterRequestList: – Type 55
  + End:
    Padding: Binary Large Object (9 Bytes)

Como se puede observar, el DHCP no está respondiendo a los paquetes DISCOVER, debido a que este equipo no posee el ClassID configurado. Esto permite que otro servidor DHCP pueda responder a dicha consulta sin que el que hemos estado configurando tenga ningún tipo de interferencia. 
Ahora bien, veamos que sucede cuando la maquina Windows10 intenta obtener una dirección IP: 
Frame Number
Time and Date
Time Delta
Source IP
Destination IP
Protocol
Description
Conversation ID
363
7:15:11 AM 12/27/2016
93.0611034
0.0.0.0
255.255.255.255
DHCP
DHCP:RequestMsgType = DISCOVER, TransactionID
= 0x4C1B42ED
{DHCP:40, UDP:310, IPv4:309}
364
7:15:11 AM 12/27/2016
0.0003419
10.0.0.15
255.255.255.255
DHCP
DHCP:ReplyMsgType = OFFER, TransactionID
= 0x4C1B42ED
{DHCP:40, UDP:310, IPv4:309}
365
7:15:11 AM 12/27/2016
0.0011971
0.0.0.0
255.255.255.255
DHCP
DHCP:RequestMsgType = REQUEST, TransactionID
= 0x4C1B42ED
{DHCP:40, UDP:310, IPv4:309}
366
7:15:11 AM 12/27/2016
0.0005999
10.0.0.15
255.255.255.255
DHCP
DHCP:ReplyMsgType = ACK, TransactionID =
0x4C1B42ED
{DHCP:40, UDP:310, IPv4:309}

Mirando en el paquete DISCOVER vemos que efectivamente está recibiendo la dirección IP debido a que tiene el UserClassInformation con el ClassID que hemos definido: 

Frame: Number = 363, Captured Frame Length = 345, MediaType = ETHERNET
+ Ethernet: Etype = Internet IP (IPv4),DestinationAddress:[FF-FF-FF-FF-FF-FF],SourceAddress:[00-15-5D-00-02-06]
+ Ipv4: Src = 0.0.0.0, Dest = 255.255.255.255, Next Protocol = UDP, Packet ID = 25290, Total IP Length = 331
UdpSrcPort = BOOTP client(68), DstPort = BOOTP server(67), Length = 311
– Dhcp: Request, MsgType = DISCOVER, TransactionID = 0x4C1B42ED
    OpCode: Request, 1(0x01)
    Hardwaretype: Ethernet
    HardwareAddressLength: 6 (0x6)
    HopCount: 0 (0x0)
    TransactionID: 1276855021 (0x4C1B42ED)
    Seconds: 0 (0x0)
  + Flags: 32768 (0x8000)
    ClientIP: 0.0.0.0
    YourIP: 0.0.0.0
    ServerIP: 0.0.0.0
    RelayAgentIP: 0.0.0.0
  + ClientHardwareAddress: 00-15-5D-00-02-06 à MAC del equipo Windows10
    ServerHostName:
    BootFileName:
    MagicCookie: 99.130.83.99
  + MessageType: DISCOVER – Type 53
  – DHCPEOptionsUserClassInformation:
   + UserClassInformation: Class1 – Type 77 à ClassID que hemos definido en el equipo.
  + clientID: (Type 1) – Type 61
  + RequestedIPAddress: 10.0.0.100 – Type 50
  – DHCPEOptionsHostName:
   + HostNameWindows10 – Type 12 à Host name del equipo, indicando que es el Windows10.
  – DHCPEOptionsVendorClassIdentifier:
   + VendorClassIdentifier: MSFT 5.0 – Type 60
  + ParameterRequestList: – Type 55
  End:
   
Con esto ya podemos confirmar que nuestro servidor DHCP solo va a responder a las peticiones de IP de los clientes que poseen el ClassID definido por nosotros y “dejará pasar” el resto de las peticiones, permitiendo que otros DHCP puedan responder a esas consultas. 
Cabe destacar que se pueden utilizar múltiples Condiciones en las políticas, e incluso Wildcards para hacer un poco más abarcativa la condición.

Espero que la nota haya sido de utilidad!