我正在开发一个 Debian 8 系统,该系统有两个网络接口(一个以太网和一个 3G 调制解调器),并且应该有两个同时连接到 MQTT 代理的连接,即应该通过两个接口建立连接。我使用的语言是Python,MQTT客户端是Paho。
为 Paho 的连接方法提供名为 bind_address 的参数应该完全符合我的要求。我只需创建两个 Paho 实例,并为它们提供我的两个接口的 IP 地址。
问题是只有其中之一能够连接。
我尝试 ping 显式指定接口 ( ping -I ifname a.b.c.d
) 的代理 IP,并且该接口适用于两个接口。此外,为 Paho 的两个实例提供相同的 IP(以太网 IP)也是可行的。
此时,我的猜测是这个问题与路由有关,但这是我不太熟悉的领域。
我怎样才能解决这个问题?
ip addr
按要求输出:
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:04:25:18:e9:a9 brd ff:ff:ff:ff:ff:ff
inet 82.195.211.80/23 brd 82.195.211.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::204:25ff:fe18:e9a9/64 scope link
valid_lft forever preferred_lft forever
3: sit0@NONE: <NOARP,UP,LOWER_UP> mtu 1480 qdisc noqueue state UNKNOWN group default
link/sit 0.0.0.0 brd 0.0.0.0
inet6 ::127.0.0.1/96 scope host
valid_lft forever preferred_lft forever
4: wwan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 1000
link/ether 0a:71:b0:b9:ca:39 brd ff:ff:ff:ff:ff:ff
inet 10.36.124.58/30 brd 10.36.124.59 scope global wwan0
valid_lft forever preferred_lft forever
inet6 fe80::871:b0ff:feb9:ca39/64 scope link
valid_lft forever preferred_lft forever
ip route
按要求输出:
default via 82.195.210.1 dev eth0 metric 202
default via 10.36.124.57 dev wwan0 metric 204
default via 82.195.210.1 dev eth0 proto static metric 1024
10.36.124.56/30 dev wwan0 proto kernel scope link src 10.36.124.58 metric 204
10.36.124.58 via 127.0.0.1 dev lo metric 204
82.195.210.0/23 dev eth0 proto kernel scope link src 82.195.211.80 metric 202
82.195.211.80 via 127.0.0.1 dev lo metric 202
答案1
简单源策略路由可能会解决你的问题。创建一个新的路由表,名为移动的任意未使用的数字(此处为 100;这是可选的,您可以只使用该数字):
echo 100 mobile >> /etc/iproute2/rt_tables
设置此表以路由至您的 3G 网关:
ip route add default via 10.36.124.57 dev wwan0 table mobile
ip route flush cache
最后,为您的 3G 源地址添加规则以使用新设置移动的桌子:
ip rule add from 10.36.124.58 table mobile
我从你的问题中获取了接口名称(wwan0)和地址。可以合理地预期接口名称会保持稳定(至少在您将另一个 3G 调制解调器连接到计算机之前),但本地地址和网关地址可能会在每次连接时发生变化。您可能想要编写此设置的脚本。