1. 项目概述
在小型办公或家庭网络环境中,我们经常需要将一台Linux设备配置为网关,同时为局域网内的其他设备提供DHCP服务。这种方案特别适合那些需要灵活控制IP分配、同时又希望节省额外硬件成本的场景。今天我要分享的,就是如何利用dnsmasq这款轻量级工具,在一台Linux笔记本上搭建完整的DHCP服务器方案。
这个方案的核心价值在于:
- 完全基于开源软件实现,零成本部署
- 配置灵活,可以精确控制IP分配范围
- 支持NAT转发,让内网设备共享上网
- 占用资源少,适合各种性能的设备
我最近在一个物联网项目中实际应用了这个方案,主控设备通过4G模块联网,同时为多个终端设备提供网络接入。整个过程踩过不少坑,也积累了一些实用技巧,下面都会详细分享。
2. 环境准备与拓扑设计
2.1 硬件准备清单
要实现这个方案,你需要准备以下硬件设备:
- 一台运行Linux的笔记本或小型主机(我使用的是Ubuntu 20.04)
- 一个4G模块(我用的是移远EG060KEA,其他型号也可以)
- 一台普通交换机(任何支持802.3协议的都行)
- 2台及以上需要联网的客户端设备(用于测试)
注意:如果没有4G模块,也可以直接用有线宽带连接。4G模块主要用于演示移动网络环境下的配置。
2.2 网络拓扑设计
整个系统的网络拓扑如下图所示:
code复制[4G网络]
|
[wwan0]--[Linux笔记本]--[bridge0]--[交换机]--[Client A/B]
(DHCP服务器)
关键点说明:
- wwan0接口负责连接4G网络
- bridge0是创建的虚拟网桥,作为内网的网关
- 交换机连接所有内网设备
- dnsmasq运行在笔记本上,为Client A/B分配IP
2.3 软件依赖安装
在开始配置前,需要确保系统已安装以下软件包:
bash复制sudo apt update
sudo apt install -y dnsmasq bridge-utils iptables
这些软件包的作用分别是:
- dnsmasq:提供DHCP和DNS服务
- bridge-utils:管理网桥的工具
- iptables:配置防火墙和NAT规则
3. 网络接口配置
3.1 创建并配置网桥
首先我们需要创建一个网桥接口bridge0,并将物理网卡eth0加入其中:
bash复制sudo brctl addbr bridge0
sudo brctl addif bridge0 eth0
sudo ip link set dev bridge0 up
这样操作后,eth0就成为了bridge0的一个成员端口。所有通过eth0的流量现在都会经过bridge0。
实操技巧:如果遇到"Device or resource busy"错误,可能是因为NetworkManager正在管理eth0。可以先运行
sudo nmcli dev set eth0 managed no解除管理。
3.2 配置网桥IP地址
给bridge0分配一个内网IP地址,这个地址将作为局域网的网关:
bash复制sudo ip addr add 192.168.225.1/22 dev bridge0
这里我选择了192.168.225.1/22的配置,这意味着:
- 网关IP:192.168.225.1
- 子网掩码:255.255.252.0(/22)
- 可用IP范围:192.168.224.1 - 192.168.227.254
选择/22而不是常见的/24,是为了提供更大的地址空间(1022个可用IP),这在设备较多的环境中很有用。
4. dnsmasq配置详解
4.1 基本DHCP配置
创建dnsmasq的配置文件:
bash复制sudo mkdir -p /var/run/dnsmasq
sudo nano /var/run/dnsmasq/dnsmasq.conf.bridge0
文件内容如下:
code复制interface=bridge0
dhcp-range=bridge0,192.168.225.100,192.168.225.100,255.255.252.0,12h
dhcp-option=bridge0,3,192.168.225.1
dhcp-option=bridge0,6,8.8.8.8,8.8.4.4
配置参数解析:
interface:指定监听哪个接口dhcp-range:定义IP分配范围- 这里故意只设置了一个IP(192.168.225.100),用于演示限制连接设备数量
- 正常情况下可以设为192.168.225.100,192.168.225.200
dhcp-option=3:设置网关地址dhcp-option=6:设置DNS服务器
4.2 启动dnsmasq服务
启动前先检查53端口是否被占用:
bash复制sudo netstat -tulnp | grep :53
如果有其他服务占用(如systemd-resolved),需要先停止:
bash复制sudo systemctl stop systemd-resolved
然后启动dnsmasq:
bash复制sudo dnsmasq -C /var/run/dnsmasq/dnsmasq.conf.bridge0
排坑记录:如果启动失败,可以加
-d参数在前台运行,方便查看日志。
5. NAT与路由配置
5.1 启用IP转发
要让内网设备能访问外网,需要开启IP转发功能:
bash复制echo "net.ipv4.ip_forward=1" | sudo tee /etc/sysctl.conf
sudo sysctl -p
5.2 配置iptables NAT规则
设置SNAT让内网设备共享wwan0的公网IP:
bash复制sudo iptables -t nat -A POSTROUTING -o wwan0 -j MASQUERADE
sudo iptables -A FORWARD -i bridge0 -o wwan0 -j ACCEPT
sudo iptables -A FORWARD -i wwan0 -o bridge0 -m state --state RELATED,ESTABLISHED -j ACCEPT
规则解释:
- MASQUERADE:将内网IP伪装成wwan0的IP
- FORWARD规则:允许bridge0和wwan0之间的数据包转发
- 只允许已建立的连接返回,提高安全性
5.3 保存iptables规则
为了防止重启后规则丢失,需要保存规则:
bash复制sudo apt install iptables-persistent
sudo netfilter-persistent save
6. 4G模块拨号配置
6.1 移远模块驱动加载
对于EG060KEA模块,需要加载qmi_wwan驱动:
bash复制sudo modprobe qmi_wwan
检查模块是否识别:
bash复制ls /dev/cdc-wdm*
6.2 使用quectel-CM拨号
下载并编译quectel-CM工具:
bash复制git clone https://github.com/Quectel/quectel-CM.git
cd quectel-CM
make
sudo ./quectel-CM &
拨号成功后,会看到wwan0接口获取到IP地址。
经验分享:有时模块需要手动重置才能识别,可以通过
sudo usb_modeswitch -v 0x2c7c -p 0x0125 -M "5553424312345678000000000000061b000000020000000000000000000000"命令重置。
7. 测试与验证
7.1 DHCP分配测试
连接Client A到交换机,检查是否获取到IP:
bash复制# 在Client A上执行
ip addr show
应该看到获取到了192.168.225.100的IP。
尝试连接Client B,应该无法获取IP(因为地址池只配置了一个IP)。
7.2 网络连通性测试
在Client A上测试外网连接:
bash复制ping 8.8.8.8
如果配置正确,应该能ping通。
7.3 查看dnsmasq租约信息
在服务器上查看分配的IP:
bash复制cat /var/lib/misc/dnsmasq.leases
输出示例:
code复制1234567890ab 192.168.225.100 clientA 01:23:45:67:89:ab
8. 高级配置与优化
8.1 扩展DHCP地址池
如果需要支持更多设备,修改dnsmasq配置:
code复制dhcp-range=bridge0,192.168.225.100,192.168.225.200,255.255.252.0,12h
8.2 静态IP分配
为特定设备固定IP:
code复制dhcp-host=00:11:22:33:44:55,192.168.225.50
8.3 开机自启动配置
创建systemd服务文件:
bash复制sudo nano /etc/systemd/system/dnsmasq-bridge0.service
内容如下:
code复制[Unit]
Description=Dnsmasq DHCP server for bridge0
After=network.target
[Service]
ExecStart=/usr/sbin/dnsmasq -C /var/run/dnsmasq/dnsmasq.conf.bridge0
Restart=always
[Install]
WantedBy=multi-user.target
启用服务:
bash复制sudo systemctl enable --now dnsmasq-bridge0.service
9. 常见问题排查
9.1 客户端无法获取IP
检查步骤:
- 确认dnsmasq正在运行:
ps aux | grep dnsmasq - 检查bridge0状态:
ip addr show bridge0 - 查看dnsmasq日志:
journalctl -u dnsmasq-bridge0 -f
9.2 能获取IP但无法上网
排查方法:
- 检查NAT规则:
sudo iptables -t nat -L -n -v - 测试网关连通性:从客户端ping 192.168.225.1
- 检查IP转发是否开启:
sysctl net.ipv4.ip_forward
9.3 4G拨号失败
解决方法:
- 检查模块识别:
lsusb和dmesg | grep qmi - 确认SIM卡状态:
mmcli -m 0 - 尝试手动拨号:
sudo qmicli -d /dev/cdc-wdm0 --dms-get-operating-mode
10. 安全加固建议
10.1 防火墙配置
限制只允许必要的流量:
bash复制sudo iptables -A INPUT -i bridge0 -p udp --dport 67:68 -j ACCEPT
sudo iptables -A INPUT -i bridge0 -p tcp --dport 53 -j ACCEPT
sudo iptables -A INPUT -i bridge0 -p udp --dport 53 -j ACCEPT
sudo iptables -A INPUT -i bridge0 -j DROP
10.2 MAC地址过滤
只允许已知设备连接:
code复制dhcp-host=00:11:22:33:44:55,ignore
dhcp-host=00:11:22:33:44:56,192.168.225.101
10.3 定期更新
保持系统和软件更新:
bash复制sudo apt update && sudo apt upgrade -y
在实际部署中,我建议定期检查dnsmasq的安全公告,并及时打补丁。这个方案虽然简单,但在生产环境中已经稳定运行了半年多,支撑了约30个物联网设备的网络接入。
