Dnsmasq 服务搭建完全教程 / 第 07 章:网络与接口配置
第 07 章:网络与接口配置
7.1 接口监听配置
7.1.1 基本监听选项
# /etc/dnsmasq.d/40-network.conf
# 监听所有接口(默认行为)
# 不指定 listen-address 或 interface 时,监听所有接口
# 监听特定 IP 地址
listen-address=127.0.0.1,192.168.1.1
# 监听特定接口
interface=eth1
# 排除特定接口(不监听)
except-interface=lo
except-interface=eth0
# 仅监听指定接口(bind-interfaces 模式)
bind-interfaces
interface=eth1
interface=eth1.10
interface=eth1.20
7.1.2 bind-interfaces 的重要性
| 模式 | 行为 | 安全性 | 推荐场景 |
|---|
| 默认 | 监听所有接口,回复时使用请求到达的接口 | 低(可能泄露到公网) | 简单测试 |
bind-interfaces | 只监听明确指定的接口 | 高 | 生产环境 |
# 推荐的生产配置
bind-interfaces
listen-address=127.0.0.1,192.168.1.1
# 或
bind-interfaces
interface=eth1
警告:不使用 bind-interfaces 且不指定 listen-address 时,Dnsmasq 会在所有接口(包括公网接口)上响应 DNS 查询,可能导致 DNS 放大攻击。
7.1.3 动态接口
# 监听所有当前和未来的接口(默认)
# 适合 DHCP 服务器,因为接口可能动态变化
# Dnsmasq 默认在接口地址变化时自动重新绑定
# 但使用 bind-interfaces 时需要重启服务
7.2 多子网配置
7.2.1 基于物理接口的多子网
# /etc/dnsmasq.d/41-multi-subnet.conf
# WAN 接口 - 不提供 DHCP
except-interface=eth0
# LAN 子网 1 - 主网络
interface=eth1
dhcp-range=set:lan,192.168.1.100,192.168.1.200,255.255.255.0,24h
dhcp-option=tag:lan,option:router,192.168.1.1
dhcp-option=tag:lan,option:dns-server,192.168.1.1
# LAN 子网 2 - IoT 网络
interface=eth2
dhcp-range=set:iot,192.168.2.100,192.168.2.200,255.255.255.0,168h
dhcp-option=tag:iot,option:router,192.168.2.1
dhcp-option=tag:iot,option:dns-server,192.168.2.1
# DNS 监听地址
listen-address=127.0.0.1,192.168.1.1,192.168.2.1
7.2.2 基于 VLAN 的多子网
# /etc/dnsmasq.d/42-vlan.conf
# 使用 VLAN 子接口
# 需要先创建 VLAN 接口:
# ip link add link eth1 name eth1.10 type vlan id 10
# ip link add link eth1 name eth1.20 type vlan id 20
# ip addr add 192.168.10.1/24 dev eth1.10
# ip addr add 192.168.20.1/24 dev eth1.20
bind-interfaces
# VLAN 10 - 办公网络
interface=eth1.10
dhcp-range=set:vlan10,192.168.10.100,192.168.10.200,255.255.255.0,12h
dhcp-option=tag:vlan10,option:router,192.168.10.1
dhcp-option=tag:vlan10,option:dns-server,192.168.10.1
dhcp-option=tag:vlan10,option:domain-name,"office.lan"
# VLAN 20 - 访客网络
interface=eth1.20
dhcp-range=set:vlan20,192.168.20.100,192.168.20.200,255.255.255.0,2h
dhcp-option=tag:vlan20,option:router,192.168.20.1
dhcp-option=tag:vlan20,option:dns-server,223.5.5.5
# VLAN 30 - IoT 网络
interface=eth1.30
dhcp-range=set:vlan30,192.168.30.100,192.168.30.250,255.255.255.0,168h
dhcp-option=tag:vlan30,option:router,192.168.30.1
dhcp-option=tag:vlan30,option:dns-server,192.168.30.1
# 监听地址
listen-address=127.0.0.1,192.168.10.1,192.168.20.1,192.168.30.1
# 按 VLAN 隔离域名
local=/office.lan/
local=/guest.lan/
local=/iot.lan/
7.2.3 VLAN 网络拓扑
Internet
│
├── eth0 (WAN) ─── 公网 IP
│
├── eth1 (Trunk) ─── 交换机 Trunk 口
│ ├── eth1.10 (VLAN 10) ─── 192.168.10.1/24 ─── 办公设备
│ ├── eth1.20 (VLAN 20) ─── 192.168.20.1/24 ─── 访客设备
│ └── eth1.30 (VLAN 30) ─── 192.168.30.1/24 ─── IoT 设备
│
└── eth2 ─── 10.0.0.1/24 ─── 服务器网络
7.3 网桥配置
7.3.1 Linux 网桥上的 Dnsmasq
# 创建网桥
sudo ip link add name br0 type bridge
sudo ip link set eth1 master br0
sudo ip link set eth2 master br0
sudo ip addr add 192.168.1.1/24 dev br0
sudo ip link set br0 up
# Dnsmasq 在网桥上提供服务
# /etc/dnsmasq.d/43-bridge.conf
interface=br0
bind-interfaces
listen-address=192.168.1.1
dhcp-range=192.168.1.100,192.168.1.200,255.255.255.0,24h
dhcp-option=option:router,192.168.1.1
dhcp-option=option:dns-server,192.168.1.1
7.3.2 网桥注意事项
# Dnsmasq 在网桥上监听时,会看到所有桥接接口的流量
# 需要确保 Dnsmasq 只响应网桥接口
# 避免在物理接口和网桥上同时提供 DHCP
# 错误:同时 interface=eth1 和 interface=br0
# 正确:只 interface=br0
7.4 IPv6 配置
7.4.1 IPv6 地址类型
| 类型 | 前缀 | 说明 |
|---|
| 链路本地 | fe80::/10 | 接口自动生成,不可路由 |
| 唯一本地 | fd00::/8 | 类似 IPv4 私有地址 |
| 全局单播 | 2000::/3 | 公网可路由地址 |
7.4.2 基本 IPv6 DNS 配置
# /etc/dnsmasq.d/44-ipv6.conf
# 监听 IPv6 地址
listen-address=::1,fd00::1
# 或
listen-address=127.0.0.1,::1,192.168.1.1,fd00::1
# IPv6 DNS 记录
address=/nas.home.lan/fd00::10
address=/web.home.lan/fd00::11
host-record=dual.home.lan,192.168.1.50,fd00::50
# 上游 IPv6 DNS
server=2001:4860:4860::8888 # Google DNS IPv6
server=2400:3200::1 # 阿里 DNS IPv6
7.4.3 IPv6 DHCPv6 + SLAAC 配置
# /etc/dnsmasq.d/45-dhcpv6.conf
# 启用路由器通告(RA)
enable-ra
# 无状态 DHCPv6(SLAAC + DHCPv6 信息下发)
interface=eth1
dhcp-range=::,constructor:eth1,ra-stateless,ra-names
# 有状态 DHCPv6(DHCPv6 分配地址)
dhcp-range=fd00::100,fd00::fff,slaac,64,12h
# DHCPv6 选项
dhcp-option=option6:dns-server,[fd00::1]
dhcp-option=option6:domain-search,home.lan
7.4.4 IPv6 无状态地址自动配置(SLAAC)
客户端通过 SLAAC 获取 IPv6 地址的流程:
1. 路由器发送 Router Advertisement (RA)
2. 客户端根据 RA 中的前缀和自身 MAC 生成 IPv6 地址
3. 如果 RA 标记了 "Other" 标志,客户端通过 DHCPv6 获取 DNS 等信息
4. 如果 RA 标记了 "Managed" 标志,客户端通过 DHCPv6 获取地址
| RA 标志 | 含义 | Dnsmasq 配置 |
|---|
| M=0, O=0 | 纯 SLAAC | 默认 |
| M=0, O=1 | SLAAC + DHCPv6 信息 | ra-stateless |
| M=1 | DHCPv6 有状态 | slaac |
7.4.5 IPv6 反向 DNS
# IPv6 反向解析
# fd00::10 的反向域名格式
ptr-record=0.1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.d.f.ip6.arpa,"nas.home.lan"
# 使用 hosts 文件自动生成(推荐)
# /etc/hosts 中添加:
# fd00::10 nas.home.lan
7.5 DHCP 中继配置
7.5.1 中继场景
当 DHCP 客户端和服务器不在同一子网时,需要 DHCP Relay:
┌──────────┐ ┌───────────┐ ┌──────────┐
│ 客户端 │──VLAN──→│ DHCP Relay│──路由──→│ Dnsmasq │
│192.168.2.x│ │ (路由器) │ │10.0.0.1 │
└──────────┘ └───────────┘ └──────────┘
VLAN 20 giaddr 主服务器
192.168.2.1
7.5.2 配置 Dnsmasq 接受中继请求
# /etc/dnsmasq.d/46-relay.conf
# Dnsmasq 需要知道所有可能的子网
dhcp-range=192.168.1.100,192.168.1.200,255.255.255.0,12h
dhcp-range=192.168.2.100,192.168.2.200,255.255.255.0,12h
dhcp-range=192.168.3.100,192.168.3.200,255.255.255.0,12h
# 或使用 tagged ranges
dhcp-range=set:vlan1,192.168.1.100,192.168.1.200,255.255.255.0,12h
dhcp-range=set:vlan2,192.168.2.100,192.168.2.200,255.255.255.0,12h
7.6 网络地址转换(NAT)集成
7.6.1 Dnsmasq + iptables NAT 配置
# 启用 IP 转发
echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward
echo "net.ipv4.ip_forward = 1" | sudo tee -a /etc/sysctl.conf
# 配置 NAT
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
sudo iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT
sudo iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
# Dnsmasq 配置
interface=eth1
bind-interfaces
dhcp-range=192.168.1.100,192.168.1.200,255.255.255.0,24h
dhcp-option=option:router,192.168.1.1
dhcp-option=option:dns-server,192.168.1.1
7.7 特殊网络场景
7.7.1 桥接 WiFi 接入点
# Dnsmasq 在 WiFi AP 桥接模式下
# WiFi 客户端通过桥接获取与有线相同的子网地址
# 网桥配置
sudo ip link add name br-lan type bridge
sudo ip link set eth1 master br-lan
sudo ip link set wlan0 master br-lan
sudo ip addr add 192.168.1.1/24 dev br-lan
# Dnsmasq 配置
interface=br-lan
bind-interfaces
dhcp-range=192.168.1.100,192.168.1.250,255.255.255.0,24h
7.7.2 隔离网络(DMZ)
# DMZ 网络:隔离的服务器网络
interface=eth2
bind-interfaces
dhcp-range=set:dmz,10.0.0.100,10.0.0.200,255.255.255.0,24h
dhcp-option=tag:dmz,option:router,10.0.0.1
dhcp-option=tag:dmz,option:dns-server,10.0.0.1
# DMZ 中的服务器通常使用静态绑定
dhcp-host=aa:bb:cc:dd:ee:01,10.0.0.10,web-01,infinite
dhcp-host=aa:bb:cc:dd:ee:02,10.0.0.11,api-01,infinite
7.8 完整多网段配置示例
# /etc/dnsmasq.d/40-network-full.conf
# === 全局设置 ===
bind-interfaces
domain=home.lan
expand-hosts
# === WAN 接口(不提供服务)===
except-interface=eth0
# === LAN 主网络 (192.168.1.0/24) ===
listen-address=192.168.1.1
interface=eth1
dhcp-range=set:lan,192.168.1.100,192.168.1.200,255.255.255.0,24h
dhcp-option=tag:lan,option:router,192.168.1.1
dhcp-option=tag:lan,option:dns-server,192.168.1.1
dhcp-option=tag:lan,option:ntp-server,192.168.1.1
# === VLAN 10 - 办公 (192.168.10.0/24) ===
listen-address=192.168.10.1
interface=eth1.10
dhcp-range=set:vlan10,192.168.10.100,192.168.10.200,255.255.255.0,12h
dhcp-option=tag:vlan10,option:router,192.168.10.1
dhcp-option=tag:vlan10,option:dns-server,192.168.10.1
# === VLAN 20 - 访客 (192.168.20.0/24) ===
listen-address=192.168.20.1
interface=eth1.20
dhcp-range=set:vlan20,192.168.20.100,192.168.20.200,255.255.255.0,2h
dhcp-option=tag:vlan20,option:router,192.168.20.1
dhcp-option=tag:vlan20,option:dns-server,223.5.5.5
# === VLAN 30 - IoT (192.168.30.0/24) ===
listen-address=192.168.30.1
interface=eth1.30
dhcp-range=set:vlan30,192.168.30.100,192.168.30.250,255.255.255.0,168h
dhcp-option=tag:vlan30,option:router,192.168.30.1
# === IPv6 双栈 ===
listen-address=::1,fd00::1
enable-ra
dhcp-range=::,constructor:eth1,ra-stateless,ra-names
dhcp-option=option6:dns-server,[fd00::1]
# === 本地域名 ===
local=/home.lan/
local=/168.192.in-addr.arpa/
local=/0.0.10.in-addr.arpa/
local=/0.d.f.ip6.arpa/
# === 上游 DNS ===
server=223.5.5.5
server=8.8.8.8
no-resolv
# === 日志 ===
log-queries
log-dhcp
log-facility=/var/log/dnsmasq/dnsmasq.log
7.9 小结
| 场景 | 关键配置 | 注意事项 |
|---|
| 多接口 | interface=eth1, interface=eth2 | 使用 bind-interfaces |
| VLAN | interface=eth1.10 | 需要先创建 VLAN 子接口 |
| 网桥 | interface=br0 | 不要同时监听桥接的物理接口 |
| IPv6 | listen-address=::1, enable-ra | 配合 SLAAC/DHCPv6 |
| 中继 | 配置所有子网的 dhcp-range | 由 relay 转发 |
7.10 扩展阅读