温馨提示×

ubuntu dhcp如何与防火墙配合

小樊
43
2025-12-30 00:37:51
栏目: 智能运维

Ubuntu DHCP 与防火墙配合实践

一、端口与方向速览

  • DHCP 基于 UDP,涉及 67/68 端口;DHCPv6 使用 546/547
  • 角色与方向对照:
    • DHCP 服务器:入站 UDP 67(接收 Discover/Request),出站 UDP 68(发送 Offer/Ack)
    • DHCP 客户端(如 dhclient):入站 UDP 68(接收 Offer/Ack),出站 UDP 67(发送 Discover/Request)
  • 若启用 IPv6,需额外放行 UDP 546/547

二、使用 UFW 的推荐做法

  • 安装与启用
    • 安装:sudo apt update && sudo apt install ufw
    • 启用:sudo ufw enable
  • 仅放行 DHCP 相关流量(示例为所有来源,可按需收紧)
    • IPv4
      • 服务器:sudo ufw allow in proto udp from any to any port 67
      • 客户端:sudo ufw allow in proto udp from any to any port 68
    • IPv6(如启用 DHCPv6)
      • 服务器:sudo ufw allow in proto udp from any to any port 547
      • 客户端:sudo ufw allow in proto udp from any to any port 546
  • 查看与重载
    • 查看:sudo ufw status verbose
    • 重载:sudo ufw reload
  • 说明
    • UFW 规则默认持久化,重启后仍然有效;如需更细粒度控制,可在规则中加入 from <网段> 限制来源。

三、使用 iptables 的推荐做法

  • 基本放行(示例为所有来源,可按需收紧)
    • 服务器
      • 入站:sudo iptables -A INPUT -p udp --dport 67 -j ACCEPT
      • 出站:sudo iptables -A OUTPUT -p udp --sport 67 -j ACCEPT
    • 客户端
      • 入站:sudo iptables -A INPUT -p udp --dport 68 -j ACCEPT
      • 出站:sudo iptables -A OUTPUT -p udp --sport 68 -j ACCEPT
  • 可选:同时放行源端口 67/68,以兼容某些实现
    • 例如:sudo iptables -A INPUT -p udp --sport 67 -j ACCEPT
  • 持久化保存
    • 安装:sudo apt-get install iptables-persistent
    • 保存:sudo netfilter-persistent save
    • 重载:sudo netfilter-persistent reload
  • 说明
    • 若系统启用 IPv6,请为 UDP 546/547 添加对应规则。

四、常见场景与排错要点

  • 场景一:本机作为 DHCP 服务器
    • 放行 UDP 67 入站(服务器收 Discover/Request),放行 UDP 68 出站(服务器发 Offer/Ack);如启用 IPv6,放行 UDP 547 入站、546 出站
  • 场景二:本机作为 DHCP 客户端(如 dhclient
    • 放行 UDP 68 入站(收 Offer/Ack),放行 UDP 67 出站(发 Discover/Request);如启用 IPv6,放行 UDP 546 入站、547 出站
  • 场景三:多网卡/仅特定网段放行
    • 在 UFW 中使用 from <网段> to any 或在 iptables 中增加 -s <网段> 条件,仅对内部接口放行,避免外网滥用。
  • 快速验证
    • 查看状态:sudo ufw statussudo iptables -L -v -n
    • 抓包定位:sudo tcpdump -ni <接口> udp and port 67 or port 68(IPv6 加 and port 546 or port 547
    • 服务日志:sudo journalctl -u isc-dhcp-server -b(服务器)或查看 /var/log/syslog(客户端)。

0