我在编写用于路由家庭网络的脚本中遇到问题。基本上在我的路由器上,我有 3 个接口(WAN 和 2 个 VPN 隧道)客户端应该通过这些接口之一基于源 IP 进行路由。
实际上,该脚本在运行 Asuswrt-merlin 的华硕路由器(wan 和 1 个 vpn)上运行,但我试图为 1 个 wan 和 2 个 vpns 编写它,最终它甚至可以在 Asuswrt 和 ubuntu 上运行,因此使用基本的 shell 命令(但我想如果它适用于梅林,它也适用于其他两个)。
测试脚本工作正常,但我不得不硬编码 2 个 tun 接口的网关,因为我没有找到从 ifconfig/ip route/ip a/ 等 shell 命令中提取此类信息的方法。
更具体地说,这三个接口都是基于 dhcp 的。WAN 接口指向我网络中的另一个路由器,因此网关是已知的。这是默认路由(默认...通过... dev eth0)
tun11 和 tun12 连接到一个 vpn 提供程序(openvpn),但只有完成连接的第一个接口以“0.0.0.0/1 ... via [IP] dev tun1X”的形式添加到主路由表中,从而显示其网关(通过 [IP])。
另一个没有,我无法在其他地方找到第三个网关 ip。当然,如果我不能动态地获取这些信息,那么脚本就会变得毫无用处。
编辑:
ip route show table all
192.168.200.200 dev eth0 table wan0 proto kernel scope link
YYY.YYY.YYY.116 via 192.168.200.200 dev eth0 table wan0
10.12.134.0/25 dev tun12 table wan0 proto kernel scope link src 10.12.134.2
192.168.200.0/24 dev eth0 table wan0 proto kernel scope link src 192.168.200.254
10.0.0.0/24 dev br0 table wan0 proto kernel scope link src 10.0.0.254
127.0.0.0/8 dev lo table wan0 scope link
default via 192.168.200.200 dev eth0 table wan0
192.168.200.200 dev eth0 proto kernel scope link
YYY.YYY.YYY.116 via 192.168.200.200 dev eth0
XXX.XXX.XXX.96/27 dev tun11 proto kernel scope link src XXX.XXX.XXX.98
10.12.134.0/25 dev tun12 proto kernel scope link src 10.12.134.2
192.168.200.0/24 dev eth0 proto kernel scope link src 192.168.200.254
10.0.0.0/24 dev br0 proto kernel scope link src 10.0.0.254
127.0.0.0/8 dev lo scope link
0.0.0.0/1 via XXX.XXX.XXX.97 dev tun11
128.0.0.0/1 via XXX.XXX.XXX.97 dev tun11
default via 192.168.200.200 dev eth0
broadcast XXX.XXX.XXX.96 dev tun11 table local proto kernel scope link src XXX.XXX.XXX.98
broadcast 192.168.200.0 dev eth0 table local proto kernel scope link src 192.168.200.254
broadcast 127.255.255.255 dev lo table local proto kernel scope link src 127.0.0.1
local XXX.XXX.XXX.98 dev tun11 table local proto kernel scope host src XXX.XXX.XXX.98
broadcast 10.12.134.127 dev tun12 table local proto kernel scope link src 10.12.134.2
local 10.0.0.254 dev br0 table local proto kernel scope host src 10.0.0.254
local 127.0.1.1 dev lo table local proto kernel scope host src 127.0.0.1
broadcast 10.0.0.255 dev br0 table local proto kernel scope link src 10.0.0.254
local 192.168.200.254 dev eth0 table local proto kernel scope host src 192.168.200.254
broadcast 192.168.200.255 dev eth0 table local proto kernel scope link src 192.168.200.254
local 10.12.134.2 dev tun12 table local proto kernel scope host src 10.12.134.2
broadcast 10.12.134.0 dev tun12 table local proto kernel scope link src 10.12.134.2
broadcast XXX.XXX.XXX.127 dev tun11 table local proto kernel scope link src XXX.XXX.XXX.98
local 127.0.0.1 dev lo table local proto kernel scope host src 127.0.0.1
broadcast 10.0.0.0 dev br0 table local proto kernel scope link src 10.0.0.254
local 127.0.0.0/8 dev lo table local proto kernel scope host src 127.0.0.1
unreachable default dev lo table 0 proto kernel metric 4294967295 error -101 hoplimit 255
unreachable default dev lo table 0 proto kernel metric 4294967295 error -101 hoplimit 255
从这里我可以获取所有相关信息(子网、IP、网关),但不能获取 tun12 网关。它没有被添加。
route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.200.200 0.0.0.0 255.255.255.255 UH 0 0 0 eth0
YYY.YYY.YYY.116 192.168.200.200 255.255.255.255 UGH 0 0 0 eth0
XXX.XXX.XXX.96 0.0.0.0 255.255.255.224 U 0 0 0 tun11
10.12.134.0 0.0.0.0 255.255.255.128 U 0 0 0 tun12
192.168.200.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
10.0.0.0 0.0.0.0 255.255.255.0 U 0 0 0 br0
127.0.0.0 0.0.0.0 255.0.0.0 U 0 0 0 lo
0.0.0.0 XXX.XXX.XXX.97 128.0.0.0 UG 0 0 0 tun11
128.0.0.0 XXX.XXX.XXX.97 128.0.0.0 UG 0 0 0 tun11
0.0.0.0 192.168.200.200 0.0.0.0 UG 0 0 0 eth0
也不在这里……与两个 vpns 关联的特定路由表也是空的(表 111 和 112)
编辑:为了进一步澄清这个问题,到目前为止,我可以得到(使用上述输出):
WAN IP: 192.168.200.254
WAN subnet: 192.168.200.0/24
WAN gateway: 192.168.200.200
tun11 IP: XXX.XXX.XXX.98
tun11 subnet: XXX.XXX.XXX.96/27
tun11 gateway: XXX.XXX.XXX.97
tun12 IP: 10.12.134.2
tun12 subnet: 10.12.134.0/25
tun12 gateway: ???
我需要 tun12 网关才能使用我的脚本为其正确构建路由规则。我错过了什么?或者真的不能这样做,因为网络似乎缺乏解决方案。提前致谢!