有人回答了我的先前的问题通过描述如何使用源策略路由创建新的路由表:
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
。这是立即可行(向接口添加“up”行),还是有其他方法可以做到?
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)。
答案1
不同的管理员通过不同的方式实现这一点。
我主要使用 Debian,我认为“最正确”的方法(最明显、最完整、最有据可查的方法)是像您所做的那样将post-up
指令添加到/etc/network/interfaces
文件。如果这样做,请确保不要作弊,只需将所有up
或post-up
指令放在一个接口下即可。让每个接口添加适合它的路由。
我常见的另一种方法是使用自定义初始化脚本,与@mgorven 发布的脚本非常相似。
答案2
我编写了一个 if-up 脚本,它可以自动为每个非环回接口执行此操作。(我刚刚对其进行了修改,以处理没有定义网关的非 DHCP 接口,因此它可能存在错误。)需要事先创建路由表。
/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"