有人通过描述如何使用源策略路由创build一个新的路由表来回答我先前的问题 :
echo 13 eth3 >> /etc/iproute2/rt_tables ip route add default via 10.20.0.1 table eth3 ip rule add from 10.20.0.2 lookup eth3
如何使这些“ip”命令在重新启动后保持不变? 我假设有一些适当的行被添加到/etc/network/interfaces 。 这是否马上(向界面添加“上”线),还是有另一种方法呢?
iface eth3 inet static address 10.20.0.2 netmask 255.255.255.0 up ip route add default via 10.20.0.1 table eth3 up ip rule add from 10.20.0.2 lookup eth3 down ip rule del from 10.20.0.2 lookup eth3 down ip route del default via 10.20.0.1 table eth3
(我在Ubuntu 12.04上)。
不同的pipe理员以不同的方式完成这个任务
我主要使用Debian,我觉得“最正确的”,正确的被定义为最明显的,集成的和logging的方式来做到这一点,是通过在你的/etc/network/interfaces文件中添加post-up指令完成。 如果你这样做,确保你没有作弊,只是把你所有的up或post-up指令放在一个界面下。 让每个接口添加适合它的路由。
我经常看到的这种做法的另一种方法是使用一个自定义的init脚本,它非常类似于@mgorven发布的脚本。
我写了一个if-up脚本,它会自动为每个非回送接口执行此操作。 (我刚刚修改它来处理没有定义的网关的非DHCP接口,所以它可能是越野车。)路由表需要事先创build。
/etc/network/if-up.d/source-route :
#!/bin/sh set -e if [ "$METHOD" = loopback ]; then exit 0 elif [ "$METHOD" = dhcp ]; then IF_ADDRESS="$(echo "$IP4_ADDRESS_0" | cut -d'/' -f1)" IF_GATEWAY="$(echo "$IP4_ADDRESS_0" | cut -d' ' -f2)" elif [ "$METHOD" = static]; then if [ ! "$GATEWAY" ]; then IF_GATEWAY="$(echo "$IF_ADDRESS" | cut -d. -f1-3).1" fi fi ip route flush table "$IFACE" ip route add default via "$IF_GATEWAY" table "$IFACE" ip rule del lookup "$IFACE" || true ip rule add from "$IF_ADDRESS" lookup "$IFACE"