我在 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/16
192 开头的子网是一个拼写错误。但是,更改静态 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
出现,因此我创建了一个新文件。所以现在一切都在启动时运行。connman
systemd
.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