一、场景说明
硬件环境
- 上位机:Windows笔记本(WiFi连接外网,有线网口直连开发板)
- 下位机:OK3588开发板(Ubuntu Linux系统,双网口eth0、eth1)
组网需求
笔记本开启Windows自带【Internet连接共享(ICS)】,把WiFi网络共享给有线网卡,开发板网线直连笔记本,以笔记本作为网关访问外网。
常见故障现象
开发板可以ping通笔记本网关192.168.137.1,内网通信完全正常,但是无法ping通外网IP(8.8.8.8),域名解析失败。
二、第一步:Windows笔记本配置(ICS网络共享)
1. 开启网络共享
- 打开「更改适配器设置」,找到WLAN(正在上网的无线网卡)、以太网(网线连接板子的网卡,网络2)。
- 右键WLAN → 属性 → 【共享】选项卡。
- 先取消勾选共享,保存;再次打开,重新勾选:
允许其他网络用户通过此计算机的Internet连接来连接 - 家庭网络连接选择:以太网(网络2),点击确定。
生效后,笔记本有线网卡会自动固定IP:192.168.137.1,这是ICS默认网段。
2. Windows关键优化(90%联网失败都卡在这一步)
以管理员身份打开CMD,逐条执行命令:
cmd
# 1. 开启ICS共享核心服务
sc config SharedAccess start= auto
net stop SharedAccess
net start SharedAccess
# 2. 开启IPv4数据包转发(NAT转发必备)
netsh int ipv4 set global forwarding=enabled
# 3. 重置Windows网络协议栈,修复共享失效bug
netsh winsock reset
netsh int ip reset
执行完成后重启笔记本电脑。
3. 关闭所有拦截策略
- 彻底退出火绒、360、电脑管家等第三方杀毒软件;
- 关闭Windows Defender防火墙(专用+公用网络全部关闭);
防火墙会直接拦截开发板的外网转发数据包。
三、第二步:OK3588开发板(Linux端IP与路由配置)
1. 查看本机网卡信息
执行ifconfig,查看网卡设备名称:
bash
root@ok3588:~# ifconfig
docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:bc:cd:b9:bc txqueuelen 0 (Ethernet)
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.0.232 netmask 255.255.255.0 broadcast 192.168.0.255
ether 76:c6:f0:f5:03:0a txqueuelen 1000
eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
ether 00:e0:99:a6:9c:98 txqueuelen 1000
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 1000
目标网卡:eth0,为有线直连笔记本的网口。
2. 给网卡新增137网段子IP(和网关同网段)
bash
# 给eth0新增IP:192.168.137.11
ifconfig eth0:1 192.168.137.11
3. 修改默认路由(核心!网关指向笔记本192.168.137.1)
- 先删除系统自带的旧默认网关:
bash
ip route del default
- 新增默认路由,把所有外网流量转发到笔记本共享网关:
bash
ip route add default via 192.168.137.1
4. 查看最终路由表
bash
root@ok3588:~# ip route show
default via 192.168.137.1 dev eth0
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown
192.168.0.0/24 dev eth0 proto kernel scope link src 192.168.0.232
192.168.137.0/24 dev eth0 proto kernel scope link src 192.168.137.11
✅ 路由规则解读:
- 内网网段保留原有通信;
- 所有外网流量全部交给笔记本
192.168.137.1转发。
5. 清理Linux防火墙,避免数据包被拦截
bash
# 清空iptables所有过滤规则
iptables -F
iptables -t nat -F
# 关闭反向路由校验(多网卡机器必开,防止回程路由被拦截)
sysctl -w net.ipv4.conf.all.rp_filter=0
sysctl -w net.ipv4.conf.eth0.rp_filter=0
6. 配置DNS,防止域名解析失败
bash
echo "nameserver 114.114.114.114" > /etc/resolv.conf
echo "nameserver 8.8.8.8" >> /etc/resolv.conf
# 锁定DNS文件,防止系统自动覆盖
chattr +i /etc/resolv.conf
四、第三步:连通性测试
测试1:ping内网网关(必须通)
bash
ping 192.168.137.1
正常输出:延迟1~3ms,零丢包,说明二层网线+ARP通信正常。
测试2:ping外网IP
bash
ping 8.8.8.8
测试3:域名连通测试
bash
ping www.baidu.com
能正常收到数据包,代表网络配置全部完成。
五、重点故障排查:内网通,外网完全不通
故障现象
可以正常ping通192.168.137.1,但是外网数据包发出去没有任何回复。
根因定位
Linux路由、网卡配置完全正常,问题出在Windows ICS共享没有开启NAT转发,仅打通了内网,没有转发外网流量。
排查顺序
- 检查笔记本本机能不能正常上网(WiFi网络无异常);
- 重新执行上文Windows管理员CMD命令,重启ICS服务;
- 双重确认Windows防火墙、杀毒软件全部关闭;
- 检查路由表,删除多余的静态路由条目,避免多网段造成路由冲突;
不要同时配置多条同网段静态路由,会导致数据包迷路。
兜底替代方案(ICS共享bug太多时使用)
Windows自带的Internet共享稳定性极差,多网段环境极易失效:
- 方案A:笔记本开启手机热点,开发板直连路由器DHCP自动获取IP;
- 方案B:改用VMware虚拟机NAT模式,彻底抛弃ICS网络共享。
六、永久固化配置(重启不失效)
把临时IP、路由写入网卡配置文件/etc/network/interfaces,开机自动加载,不需要反复手动敲命令。
结尾总结
- ICS共享会自动生成
192.168.137.x网段,开发板必须配置同网段IP; - 默认网关必须指向笔记本
192.168.137.1,删除原有默认路由; - 内网通外网不通,99%是Windows端NAT转发被防火墙拦截或共享服务异常;
- 多网卡Linux务必关闭rp_filter反向路由过滤,防止数据包被内核丢弃。