当电缆连接到 eth0 时,无法通过 wwan0 连接互联网

当电缆连接到 eth0 时,无法通过 wwan0 连接互联网

我在 Beaglebone 卡上运行 Angstrom Linux。它的以太网端口 (etho) 中有一根电缆,USB 端口中有一个 USB 3G 调制解调器加密狗,其接口名为 wwan0。

交叉以太网电缆的另一端是另一台在 Raspberry Pi 上运行的 Linux 计算机。

当以太网电缆断开时,我可以访问互联网,但是当连接电缆时,互联网流量将定向到 eth0 接口。

ip 路由表如下所示:

root@beaglebone:~# ip route
default dev eth0  scope link
default via 95.192.114.29 dev wwan0
95.192.114.28/30 dev wwan0  proto kernel  scope link  src 95.192.114.30
169.254.0.0/16 dev eth0  proto kernel  scope link  src 169.254.29.204

当执行 ping 8.8.8.8 时失败,但是当我这样做时

ping -I wwan0 8.8.8.8

这很好用。我也能ping通

ping 169.254.1.N # 'far' end of ethernet crossover cable

这是以太网交叉电缆的另一端,它可以工作。那么如何确保互联网流量通过正确的接口流出呢?这是重新编译内核之前必须在 menuconfig 中选择“高级路由器”选项的情况之一吗?或者交换两条默认路由的顺序就足够了吗?

该卡不会路由来自其他地方的任何数据,它在 I2C 总线上接收数据,并应该将此数据写入互联网上的一台服务器和交叉电缆另一端的另一台服务器。

/etc/network/interfaces
iface eth0 inet static
    address 169.254.1.N+1 # 'near' end of crossover cable
    netmask 255.255.0.0
    gateway 169.254.1.2

allow-hotplug wwan0
iface wwan0 inet dhcp

另一个可能相关的问题是 IP 地址未正确设置为我在上面的 /etc/network/interfaces 中设置的静态地址,它位于正确的子网 169.254.0.X 上,但它不是我静态配置的。

编辑4

如果我尝试删除编辑 2 下的默认路由

route del default gw 0.0.0.0 dev eth0

connman立即采取行动并立即重新添加它,如通过以下所示可见journalctl

beaglebone connmand[853]: eth0 {del} route 0.0.0.0 gw 0.0.0.0 scope 0 <UNIVERSE>
beaglebone connmand[853]: eth0 {add} route 0.0.0.0 gw 0.0.0.0 scope 0 <UNIVERSE>

(这两行的时间戳与使用journalctl --follow查看时相同)

编辑3

root@beaglebone:~# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
2: can0: <NOARP,UP,LOWER_UP,ECHO> mtu 16 qdisc pfifo_fast state UNKNOWN qlen 10
    link/can
3: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 34:b1:f7:1b:02:86 brd ff:ff:ff:ff:ff:ff
    inet 169.254.252.60/16 brd 169.254.255.255 scope global eth0
4: wwan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000
    link/ether 00:01:02:03:04:05 brd ff:ff:ff:ff:ff:ff
    inet 78.78.88.67/29 scope global wwan0

编辑2

在我看来,第一行看起来很可疑。

netstat -rn
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
0.0.0.0         0.0.0.0         0.0.0.0         U         0 0          0 eth0
0.0.0.0         95.196.157.233  0.0.0.0         UG        0 0          0 wwan0
95.196.157.232  0.0.0.0         255.255.255.252 U         0 0          0 wwan0
169.254.0.0     0.0.0.0         255.255.0.0     U         0 0          0 eth0

编辑 0 和编辑 1

根据下面 FloHimself 的评论,涉及的唯一子网是以169.254.0.0/16192 开头的子网是一个拼写错误。但是,更改静态 IP 地址并不能阻止静态 IP 发生变化,并且这ping -I wwan0仍然是访问万维网的唯一方法。

答案1

通过使用telnet读取输出,journalctl --follow我可以看到connmand每当我尝试更正路由表时删除的路由。所以我使用以下方法禁用它systemctl

systemctl disable connman.service

我还修改/etc/network/interfaces为使用点对点配置eth0

auto eth0
iface eth0 inet static
        address 169.254.1.2
        netmask 255.255.0.0
        pointopoint 169.254.1.1
        gateway 169.254.1.1
        scope link

然后使用ifup eth0界面就出现了。现在我可以ping通过 eth0 电缆连接远程端点169.254.1.1,而8.8.8.8无需使用ping -I N.N.N.N.

编辑0

禁用后在启动时从未自动eth0出现,因此我创建了一个新文件。所以现在一切都在启动时运行。connmansystemd.service

[Unit]
Description=Network interface eth0
Wants=network.target
Before=network.target

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/bin/sh -c "ifup eth0"
ExecStop=/bin/sh -c "ifdown eth0"

[Install]
WantedBy=multi-user.target

相关内容