我正在尝试通过不同的接口(在带有 raspbian strech 的 raspberry pi 上)打开多个反向 ssh 隧道以实现后备。
话虽如此,我在通过不同接口打开传出的 ssh 连接时确实遇到了问题。目前有:
- eth0 作为静态 IP(192.168.1.200)
- wlan0 通过 dhcp(192.168.178.100)
将 ssh 绑定到 IP 地址对“eth0”有效,但对“wlan0”无效:
ssh -b 192.168.1.200 user@externalip
工作中ssh -b 192.168.178.100 user@externalip
是不是在职的
除此之外,我可以通过两个接口跟踪到互联网的路由:
ssh -b 192.168.1.200 user@externalip
工作中
sudo traceroute -i wlan0 google.com
traceroute to google.com (172.217.21.14), 30 hops max, 60 byte packets
1 192.168.178.1 (192.168.178.1) 12.528 ms 17.229 ms 21.757 ms
2 192.0.0.1 (192.0.0.1) 26.576 ms 41.445 ms 47.408 ms ...
...
sudo traceroute -i eth0 google.com
traceroute to google.com (172.217.21.14), 30 hops max, 60 byte packets
1 192.168.1.1 (192.168.1.1) 0.537 ms 0.404 ms 0.570 ms
...
知道如何让两个接口上的 ssh 都工作吗?
路线-n:
0.0.0.0 192.168.1.1 0.0.0.0 UG 202 0 0 eth0
0.0.0.0 192.168.178.1 0.0.0.0 UG 303 0 0 wlan0
192.168.0.0 0.0.0.0 255.255.252.0 U 202 0 0 eth0
192.168.178.0 0.0.0.0 255.255.255.0 U 303 0 0 wlan0
答案1
默认情况下,仅使用(主)路由表中的第一个匹配条目来确定到目的地的路由。此外,未在此匹配条目上收到的数据包将被丢弃,因为rp_filter
。
您的设置需要策略路由:现在,路由不仅必须取决于目的地,还必须取决于源,方法是将多条路由存储在多个路由表中,并根据源选择合适的路由表。 前面的陈述仍然正确:将选择表中的第一个匹配路由,但它可能会从(一个)不同的表中选择。
main
因此,您首先设置额外的路由表(“任意”选择表值)来补充仅使用该表无法实现的功能:
ip route add table 1921681 default via 192.168.1.1 dev eth0
ip route add table 192168178 default via 192.168.178.1 dev wlan0
然后使用正确的源选择器来选择合适的表ip rule
。这里仅添加一条新规则就足够了,但是为了对称,将同时添加两条规则,以便在主路由表上提供更大的灵活性,例如在更改度量标准时(请参阅下文):
ip rule add from 192.168.0.0/22 lookup 1921681
ip rule add from 192.168.178.0/24 lookup 192168178
现在的规则是:
# ip rule
0: from all lookup local
32764: from 192.168.178.0/24 lookup 192168178
32765: from 192.168.0.0/22 lookup 1921681
32766: from all lookup main
32767: from all lookup default
将条目32764
et视为查找通常表的32765
条目的例外。32766
main
就是这样,现在您之前的命令将按预期工作,当您使用选项声明源 IP 时,两个路由可以同时工作-b
。
如果您不声明源 IP,系统将不会立即匹配附加规则和路由表,而是默认使用主表时所做的选择:第一个匹配的路由将获胜,从而192.168.1.200
在您当前设置中选择源。
再重复一遍,如果你没有明确说明源 IP(通常情况下),你的主路由仍然会选择默认默认路由和相应的默认源 IP,那么规则32764
和32765
将确保它无论在什么情况下都能正常工作。因此,您可以使用指标来选择哪个路由和 IP 优先。
例如,wlan0
现在在未声明源 IP 时优先选择 ,将202
的度量增加到 ,eth0
以1000
使 成为wlan0
默认路由,从而优先选择 IP。明确声明源 IP 仍将直接匹配规则32764
或32765
。先前建立的连接计为“声明源 IP”,因此不会受到干扰。
ip route add default via 192.168.1.1 dev eth0 metric 1000
ip route del default via 192.168.1.1 dev eth0 metric 202
一些补充说明:
- 请勿尝试删除
main
(通常)表中的所有默认路由,否则如果应用程序未声明源 IP(“Network is unreachable
”),则您的连接将无法再建立。 - 可能存在更复杂的情况,包括在两个不同的网络上拥有相同的 IP,但这将需要额外的设置,并且可能需要 netfilter 和 的帮助
iptables
。 - 甚至可以使用以下方法对这些路由进行负载平衡:
iptables
和分数并在 中使用这些标记作为选择器ip rule
,但要让它在所有情况下都能正常工作会更加复杂,尤其是在混合使用源 IP 已声明和源 IP 由系统选择的连接时,以及对于 UDP 尤其如此。然后,它可能还需要笨拙地使用 NAT 和放松rp_filter
。
答案2
确保已启用接口
ip link set dev eth0 up
ip link set dev wlan0 up