0

我在编写用于路由家庭网络的脚本中遇到问题。基本上在我的路由器上,我有 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 网关才能使用我的脚本为其正确构建路由规则。我错过了什么?或者真的不能这样做,因为网络似乎缺乏解决方案。提前致谢!

4

1 回答 1

0

到目前为止,我无法在 asuswrt 或 ubuntu 中找到 Windows“ipconfig /all”的相应命令。我确定我错过了一些东西。当您在 Windows 上运行该命令时,您可以随时看到所有网络接口及其当前 ip/subnet/gateway/dns 的列表。

我想我无论如何都找到了解决这个问题的方法。再次总结问题,这就是我的系统实际发生的情况

  1. wan界面出现
  2. 在 ip route 主表中添加了“默认通过 WANGATEWAYIP dev WANINTERFACE”路由
  3. tun11 (vpn1) 接口出现
  4. 在 ip route 主表中添加了“0.0.0.0/1 via VPN1GATEWAYIP dev tun11”路由
  5. tun12 (vpn2) 接口出现
  6. 在 ip route 主表中没有添加任何内容,因为(我认为)已经有一个“默认”路由和一个“0.0.0.0/1”路由。

这样我就可以得到 wan、tun11 的网关,但不能得到 tun12 的网关。而且由于我没有像“ipconfig / all”这样的东西,我没有找到另一种方法来获取这个网关ip。

我发现的解决方法是这样的:

  1. 当 tun11 接口出现时,脚本会扫描 ip route 主表中的“0.0.0.0/1”路由并保存网关 ip(然后我使用它在 ip 路由的自定义表中构建适当的默认规则,其中所有流量用于该接口通过标记路由到)
  2. 然后脚本从 ip route table main 中删除“0.0.0.0/1”路由
  3. 当 tun12 接口出现时,成功添加了一个新的“0.0.0.0/1”路由(因为前一个已被删除)
  4. 该脚本读取 tun12 网关 ip 并在另一个表中构建默认路由。

它现在已经工作了大约十天,但我想我迟早会因为异步而遇到一些问题。我不太喜欢这种方法,所以如果有人可以提出更好的建议,那就太好了

谢谢

于 2020-01-07T18:04:49.907 回答