
Estoy configurando un firewall/enrutador de puerta de enlace usando rhel 8. Tengo un servidor con dos NICS, una pública que es un cliente dhcp, la segunda NIC será interna. La primera NIC es una zona pública, la segunda NIC es una zona interna. Me gustaría convertir la NIC interna en un servidor DHCP para clientes internos.
Necesito bloquear mi servidor DHCP para que no reciba solicitudes DHCP en la zona pública.
Pregunta: ¿Puede configurar dhcp para que sea un servidor solo para una NIC específica, o administrar esto con reglas de firewall para bloquear todo DHCP de la zona pública? ¿Cuál es una buena práctica al configurar una puerta de enlace multifunción como esta?
Respuesta1
En RHEL 8, dhcpd.service
utiliza la $DHCPDARGS
variable en la ExecStart=
línea de comando:
# /usr/lib/systemd/system/dhcpd.service
[Unit]
Description=DHCPv4 Server Daemon
Documentation=man:dhcpd(8) man:dhcpd.conf(5)
Wants=network-online.target
After=network-online.target
After=time-sync.target
[Service]
Type=notify
EnvironmentFile=-/etc/sysconfig/dhcpd
ExecStart=/usr/sbin/dhcpd -f -cf /etc/dhcp/dhcpd.conf -user dhcpd -group dhcpd --no-pid $DHCPDARGS
StandardError=null
[Install]
WantedBy=multi-user.target
Pero el archivo de entorno /etc/sysconfig/dhcpd
donde se definiría dicha variable tiene una advertencia que indica que no se debe usar más ese archivo:
cat /etc/sysconfig/dhcpd
# WARNING: This file is NOT used anymore.
# If you are here to restrict what interfaces should dhcpd listen on,
# be aware that dhcpd listens *only* on interfaces for which it finds subnet
# declaration in dhcpd.conf. It means that explicitly enumerating interfaces
# also on command line should not be required in most cases.
# If you still insist on adding some command line options,
# copy dhcpd.service from /lib/systemd/system to /etc/systemd/system and modify
# it there.
# https://fedoraproject.org/wiki/Systemd#How_do_I_customize_a_unit_file.2F_add_a_custom_unit_file.3F
# example:
# $ cp /usr/lib/systemd/system/dhcpd.service /etc/systemd/system/
# $ vi /etc/systemd/system/dhcpd.service
# $ ExecStart=/usr/sbin/dhcpd -f -cf /etc/dhcp/dhcpd.conf -user dhcpd -group dhcpd --no-pid <your_interface_name(s)>
# $ systemctl --system daemon-reload
# $ systemctl restart dhcpd.service
Entonces, aparentemente el ISC dhcpd de RHEL 8 ha sido parcheado para seleccionar las interfaces para escuchar en función de si su archivo de configuración incluye declaraciones de subred para la interfaz o no. Si no hay una declaración de subred para una interfaz en particular, no debería responder para esa interfaz.
Debido a cómo funciona el protocolo DHCP en IPv4, dhcpd
será necesario utilizar un socket sin formato (para poder recibir paquetes de difusión con dirección de origen 0.0.0.0 y destino 255.255.255.255, y también enviar a 255.255.255.255 sin estar restringido por enrutamiento IPv4 normal), por lo que de todos modos necesita procesar sus paquetes entrantes con más cuidado.
Debido a que dhcpd
utiliza sockets sin formato, tampoco se ve afectado por iptables
los firewalls.
Si aún desea agregar nombres de interfaz en la línea de comando, puede cp /lib/systemd/system/dhcpd.service /etc/systemd/system/
modificar la versión en /etc/systemd/system
, o simplemente usarla systemctl edit dhcpd.service
para crear un archivo de anulación. Por supuesto, deberá recordar que los archivos de servicio pueden tener varias ExecStart=
líneas, por lo que para anular la línea existente en lugar de simplemente agregar otra, deberá ejecutar systemctl edit dhcpd.service
y escribir tres líneas:
[Service]
ExecStart=
ExecStart=/usr/sbin/dhcpd -f -cf /etc/dhcp/dhcpd.conf -user dhcpd -group dhcpd --no-pid <your_interface_name(s)>
La primera ExecStart=
línea vacía le dice a systemd que desea anular la ExecStart
definición existente en el archivo de servicio en lugar de agregar una segunda.
Si utiliza la cp /lib/systemd/system/dhcpd.service /etc/systemd/system/
estrategia, recuerde ejecutarla systemctl daemon-reload
después de modificar el /etc/systemd/system/dhcpd.service
archivo.
Si usa systemctl edit dhcpd.service
, ejecutará el equivalente a systemctl daemon-reload
automáticamente.
Respuesta2
Depende de qué demonio dhcp en particular esté utilizando, pero sí, es posible configurar un demonio dhcp para dar diferentes respuestas según la interfaz de donde proviene la solicitud dhcp/bootp.opara ejecutar múltiples instancias de dhcpd, cada una configurada para escuchar solo en una interfaz.
En su caso, parece que solo quiere decirle a su dhcpd que escuche solo en su interfaz LAN privada. Si está utilizando ISC dhcpd, puede hacerlo simplemente agregando los nombres de las interfaces que desea que escuche en la línea de comando dhcpd.
por ejemplo, en mi sistema, quiero que dhcpd escuche solo en mis interfaces inalámbricas ( wifi0
) y de red interna ( br0
- uso una interfaz en puente porque es conveniente para ejecutar máquinas virtuales), así que lo ejecuto como:
/usr/sbin/dhcpd -4 -q -cf /etc/dhcp/dhcpd.conf br0 wlan0