在 Linux 上配置 DHCP 中继代理
一、准备与原理
- 作用:在不同子网/广播域之间转发 DHCP 报文(客户端 UDP 68 → 服务器 UDP 67),让 DHCP 服务器为远端网段分配地址。
- 拓扑要求:中继主机至少有两个接口,分别连接客户端网段与服务器网段;服务器需能路由回中继主机。
- 路由要点:确保服务器到各客户端网段的回程路由可达(静态路由或动态路由均可)。
- 转发能力:Linux 主机需开启IP 转发,否则跨网段转发不生效。
二、方案一 ISC DHCP Relay(isc-dhcp-relay)
- 安装
- Debian/Ubuntu:sudo apt-get update && sudo apt-get install isc-dhcp-relay
- RHEL/CentOS:sudo yum install dhcp-relay
- Fedora:sudo dnf install dhcp-relay
- 配置(常见路径与示例)
- 编辑配置文件(发行版不同,常见为:/etc/default/isc-dhcp-relay 或 /etc/sysconfig/dhcp-relay)
- 示例(/etc/default/isc-dhcp-relay):
- INTERFACESv4=“eth0 eth1” # 监听客户端侧接口
- SERVERS=“192.0.2.10 192.0.2.11” # DHCP 服务器地址(可多台)
- 可选:RELAY_PORT=67(默认)
- 启动与开机自启
- sudo systemctl start isc-dhcp-relay
- sudo systemctl enable isc-dhcp-relay
- 说明
- 多数发行版该服务仅做DHCP 转发,不会在本机充当 DHCP 服务器。
- 若需为服务器侧接口指定地址,可在 SERVERS 前设置 RELAY_ADDRESS(部分发行版支持)。
三、方案二 dnsmasq(轻量方案,兼 DNS/DHCP)
- 适用:希望同时提供 DNS 与 DHCP 中继 的场景。
- 安装
- sudo apt-get install dnsmasq 或 sudo yum/dnf install dnsmasq
- 配置(/etc/dnsmasq.conf)
- 仅中继(不提供本机 DHCP 地址分配):
- interface=eth0 # 客户端侧接口
- dhcp-relay=192.0.2.10 # 上游 DHCP 服务器
- dhcp-relay-port=67
- 如需本机在该接口也分配地址(与中继并存),可补充:
- dhcp-range=192.168.10.100,192.168.10.200,12h
- 启动与开机自启
- sudo systemctl start dnsmasq
- sudo systemctl enable dnsmasq
- 提示
- 同时启用“本机 DHCP 分配”和“中继”时,注意地址池不要重叠,避免冲突。
四、网络与安全配置
- 开启 IP 转发
- 临时:echo 1 > /proc/sys/net/ipv4/ip_forward
- 永久:在 /etc/sysctl.conf 设置 net.ipv4.ip_forward=1 并执行 sysctl -p
- 防火墙放行 DHCP 端口
- firewalld:sudo firewall-cmd --permanent --add-service=dhcp && sudo firewall-cmd --reload
- ufw:sudo ufw allow 67/udp;sudo ufw allow 68/udp
- 路由与连通性
- 确保 DHCP 服务器到各客户端网段有可达路由(网关/静态路由),中继主机到服务器网段同样可达。
五、验证与排错
- 服务状态
- systemctl status isc-dhcp-relay 或 systemctl status dnsmasq
- 抓包验证 DHCP 转发
- sudo tcpdump -i eth0 port 67 or port 68 -nn -vv
- 正常可见客户端 DISCOVER/OFFER/REQUEST/ACK 经过中继转发
- 日志排查
- Debian/Ubuntu:tail -f /var/log/syslog | grep -i dhcp
- RHEL/CentOS:tail -f /var/log/messages | grep -i dhcp
- 常见故障
- 收不到 Offer:检查服务器到客户端网段回程路由、服务器是否配置了对应子网与地址池、防火墙是否放行 67/68/UDP。
- 中继不生效:确认 INTERFACES 包含客户端侧接口、服务器地址正确、已开启 IP 转发。