2026/4/5 20:47:23
网站建设
项目流程
1. 4G模组路由转发的基本原理当你手里有一块4G模组想让它成为其他设备上网的桥梁时路由转发就是关键。这就像把4G模组变成一个迷你路由器让连接它的设备都能共享4G网络。整个过程主要依赖两个核心技术udhcpd负责分配IP地址iptables负责数据包转发。我最早接触这个需求是在开发智能售货机项目时。设备需要通过4G联网但调试时需要用笔记本连接设备查看日志。如果每次调试都要插网线或切换WiFi就太麻烦了。于是想到用4G模组本身作为网关让笔记本通过它上网。实测下来这套方案稳定性出乎意料后来成了我们团队的标配调试方案。这里有个常见误区很多人以为只要开启IP转发就能上网。实际上需要三个关键步骤协同工作DHCP服务分配内网IPudhcpd内核开启IP转发功能配置NAT地址转换iptables2. 环境准备与依赖安装2.1 硬件准备清单在开始配置前建议准备好以下硬件支持Linux系统的开发板如树莓派、海思平台等USB 4G模组如移远EC20、广和通L610网线或USB转网卡用于调试连接电源适配器确保供电稳定我强烈建议先用有线网络测试通过后再切换到4G模组。曾经有个项目我们折腾了两天发现是4G信号问题换成有线测试十分钟就定位到了配置错误。2.2 软件依赖检查在终端执行这些命令检查必要组件# 检查udhcpd是否安装 which udhcpd # 检查iptables版本 iptables --version # 检查内核转发支持 cat /proc/sys/net/ipv4/ip_forward如果缺少udhcpd在Debian系系统可以用sudo apt install udhcpd而在嵌入式系统可能需要交叉编译这时要注意库依赖问题。我遇到过因为uclibc和glibc不兼容导致udhcpd崩溃的情况解决方案是使用开发板厂商提供的编译工具链。3. udhcpd详细配置指南3.1 配置文件深度解析/etc/udhcpd.conf是核心配置文件建议先备份原始文件cp /etc/udhcpd.conf /etc/udhcpd.conf.bak这是我优化过的配置模板已添加详细注释# 地址池范围避免与现有网络冲突 start 192.168.100.100 end 192.168.100.200 # 指定监听接口根据实际网卡名修改 interface eth0 # 关键网络参数 opt dns 114.114.114.114 8.8.8.8 # 备用DNS很重要 option subnet 255.255.255.0 opt router 192.168.100.1 # 必须与接口IP一致 option lease 86400 # 24小时租约 # 静态IP绑定适合固定设备 static_lease 00:1A:2B:3C:4D:5E 192.168.100.50特别注意interface必须与后续ifconfig设置的网卡名完全一致包括大小写。有次调试三小时最后发现是eth0和ETH0的差异导致的。3.2 服务启动与排错启动命令看似简单udhcpd -f /etc/udhcpd.conf 但常见问题包括端口被占用netstat -tulnp | grep :67权限不足需要用root执行配置文件语法错误可用udhcpd -S测试我习惯用这个排查流程# 1. 检查进程 ps aux | grep udhcpd # 2. 查看系统日志 tail -f /var/log/syslog # 3. 测试DHCP分配 dhclient -v eth04. iptables转发规则精讲4.1 NAT转发核心规则这是最关键的iptables命令iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE参数解析-t nat操作NAT表-A POSTROUTING在路由后处理-o ppp0出接口4G模组通常是ppp0-j MASQUERADE动态源地址转换实际项目中我发现如果4G模组使用USB ECM模式接口名可能是eth1或usb0。用ifconfig -a查看当前活跃接口最可靠。4.2 完整防火墙配置除了NAT还需要基础防火墙规则# 清空现有规则 iptables -F iptables -t nat -F # 允许已建立的连接 iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 允许内网访问 iptables -A INPUT -i eth0 -j ACCEPT # 设置NAT iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE # 保存规则根据系统选择 iptables-save /etc/iptables.rules在嵌入式设备上我推荐添加开机自动加载echo iptables-restore /etc/iptables.rules /etc/rc.local5. 4G模组特殊配置5.1 拨号上网设置不同模组拨号方式各异以移远EC20为例echo -e ATCGDCONT1,\IP\,\CMNET\\nATDT*99#\n /dev/ttyUSB2拨号成功后用ip a查看获得的ppp0接口。有个坑要注意某些运营商APN区分大小写我曾经因为把cmnet写成CMNET导致连接失败。5.2 网络接口绑定确保内网接口IP与udhcpd配置匹配ifconfig eth0 192.168.100.1 netmask 255.255.255.0 up验证连通性ping -I eth0 192.168.100.1006. 客户端配置与测试6.1 Windows客户端设置打开网络适配器设置选择自动获取IP地址手动设置备用DNS为114.114.114.114在cmd中执行ipconfig /release ipconfig /renew如果获取不到IP尝试netsh winsock reset netsh int ip reset6.2 Linux客户端调试更推荐用Linux客户端测试可以获取更多信息# 释放现有IP dhclient -r eth0 # 获取新IP dhclient -v eth0 # 查看路由 route -n # 测试外网 ping -c 4 baidu.com7. 常见问题解决方案7.1 DHCP分配失败典型症状客户端显示无法获取IP地址排查步骤检查udhcpd进程是否存在确认监听端口netstat -anu | grep 67抓包分析tcpdump -i eth0 port 67 -vv7.2 能ping通但无法上网这种情况多半是DNS或NAT问题# 测试DNS解析 nslookup baidu.com # 检查NAT规则 iptables -t nat -L -v # 查看内核转发 cat /proc/sys/net/ipv4/ip_forward8. 性能优化技巧8.1 连接数限制防止4G网络过载iptables -A FORWARD -p tcp --syn -m limit --limit 10/s -j ACCEPT8.2 流量监控实时查看流量iftop -i ppp0统计各客户端流量iptables -N TRAFFIC_ACCT iptables -A FORWARD -j TRAFFIC_ACCT在嵌入式设备上内存优化也很重要。我发现udhcpd默认租期86400秒1天对移动设备太长改为3600秒可减少内存占用option lease 3600