如何在调用“ip route add”之前验证参数?

如何在调用“ip route add”之前验证参数?

我正在使用一个程序,该程序设置 etcd 参数,这些参数扩展为调用“ip route add ...”,并且我需要这些调用成功而不会出现错误。该模板使用如下格式:

ip route add < route > [ via < gateway > ] dev < interface >

我收到过这样的回复:

# ip route show
169.254.0.0/16 dev ens192 scope link metric 1002 
172.16.25.64/26 dev ens192 proto kernel scope link src 172.16.25.115 
254.146.247.0/24 dev ens224 scope link 

# ip route add 10.20.30.0/24 via 172.16.25.124 dev ens192
# ip route delete 10.20.30.0/24 via 172.16.25.124 dev ens192
# ip route add 10.20.31.0/24 via 172.16.25.124 dev ens224
RTNETLINK answers: Network is unreachable

# ip route add 10.20.31.0/24 via 254.146.247.1 dev ens224
# ip route delete 10.20.31.0/24 via 254.146.247.1 dev ens224
# ip route add 10.20.30.0/24 via 254.146.247.1 dev ens192
RTNETLINK answers: Network is unreachable

# ping -c 1 172.16.25.124
PING 172.16.25.124 (172.16.25.124) 56(84) bytes of data.
64 bytes from 172.16.25.124: icmp_seq=1 ttl=64 time=0.294 ms

--- 172.16.25.124 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.294/0.294/0.294/0.000 ms

# ping -c 1 254.146.247.1
PING 254.146.247.1 (254.146.247.1) 56(84) bytes of data.
ping: sendmsg: Operation not permitted

--- 254.146.247.1 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

我正在使用 Python 收集要存储在 etcd 数据库中的参数,以便在重新启动使用填充的配置文件的服务时使用“ip route add...”执行填充的模板。我正在寻找一种方法来验证用于路由、网关和接口的值,以便最终调用“ip route add”时,它们不会失败。特别是,从上面的示例中,我需要知道网关 IP 地址 254.146.247.1 无法从接口 ens192 访问。

我无法使用 ping,如上面的示例所示。 172.16.25.124 可 ping 通并且可以用作接口 ens192 的网关,但不能用作 ens224。 254.146.247.1 无法 ping 通,但可以用作接口 ens224 的网关,但不能用作 ens192 的网关。

任何帮助将不胜感激。

答案1

尝试下面的代码,

#!/bin/bash
IP_RULES_FILE=/tmp/iprules.txt

while read rule
do
   GW=`echo $rule |  awk '{print $6}'`
   ping -c1 $GW 2>/dev/null 1>/dev/null
   if [ "$?" = 0 ]; then
    $rule
    else
        echo "host $gw is not reachable"
    fi
done < $IP_RULES_FILE
  • 请将iproute存储在/tmp/iprules.txt需要添加的文件中。
  • 该脚本将在服务器中配置网关之前从给定的规则获取网关并验证可达性

答案2

我能够通过解析 netstat 的输出来解决这个问题:

# netstat -nr
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
169.254.0.0     0.0.0.0         255.255.0.0     U         0 0          0 ens192
172.16.25.64    0.0.0.0         255.255.255.192 U         0 0          0 ens192
254.146.247.0   0.0.0.0         255.255.255.0   U         0 0          0 ens224

接口的网关地址必须来自为该接口配置的目标地址。在我的示例中(ip Route add 10.20.31.0/24 via 254.146.247.1 dev ens224)之所以有效,是因为我从为接口(ens224)配置的 IP 网络(254.146.247.0/24)中选择了一个 IP 地址(254.146.247.1)。

相关内容