问题根源是ubuntu主机ip转发未开启;需检查/proc/sys/net/ipv4/ip_forward值是否为1,若为0则临时执行sudo sysctl -w net.ipv4.ip_forward=1验证,再通过写入/etc/sysctl.d/99-ipforward.conf实现永久生效。

当开发板能 ping 通 Ubuntu 主机,却无法访问外网(如 ping 8.8.8.8 成功但 ping www.baidu.com 失败),且 DNS 配置无误时,大概率是 Ubuntu 主机的 IP 转发未开启——这是嵌入式网络调试中最常被忽略的基础环节。
确认 IP 转发当前状态
执行以下任一命令,查看返回值是否为 1:
cat /proc/sys/net/ipv4/ip_forwardsysctl net.ipv4.ip_forward
若输出为 0,说明转发功能当前被禁用。注意:该参数为内核运行时开关,不依赖路由表或 iptables 规则,值为 0 时所有跨网卡转发的数据包会被直接丢弃。
临时启用转发验证问题
快速测试是否为根本原因,可先临时开启:
sudo sysctl -w net.ipv4.ip_forward=1
开启后立即在开发板上重试访问外网(如 curl -v http://httpbin.org/ip)。若恢复正常,即可锁定问题根源。⚠️此设置重启后失效,仅用于验证。
配置永久生效
避免每次重启都手动开启,需写入系统配置:
- 向持久化配置文件写入:
echo "net.ipv4.ip_forward = 1" | sudo tee /etc/sysctl.d/99-ipforward.conf - 加载新配置:
sudo sysctl -p /etc/sysctl.d/99-ipforward.conf
部分旧版系统可能使用 /etc/sysctl.conf,但推荐用 .conf 后缀的独立文件,便于管理和排查。
检查是否被其他配置覆盖
某些桌面环境或云镜像会通过 systemd 或网络管理器重置该参数。排查方法:
- 运行
systemctl list-files systemd-sysctl.service | grep sysctl查看实际加载的配置路径 - 检查是否有冲突项:
grep -r "ip_forward" /etc/sysctl.d/ /etc/sysctl.conf 2>/dev/null - 若发现多个
ip_forward = 0条目,需注释或删除低优先级配置
修改后务必再次执行 sysctl -p 并验证 /proc/sys/net/ipv4/ip_forward 值为 1。











