强曰为道
与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

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=1SLAAC + DHCPv6 信息ra-stateless
M=1DHCPv6 有状态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
VLANinterface=eth1.10需要先创建 VLAN 子接口
网桥interface=br0不要同时监听桥接的物理接口
IPv6listen-address=::1, enable-ra配合 SLAAC/DHCPv6
中继配置所有子网的 dhcp-range由 relay 转发

7.10 扩展阅读