首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iproute2继承或复制表

iproute2继承或复制表
EN

Unix & Linux用户
提问于 2018-02-12 03:10:09
回答 2查看 2.2K关注 0票数 4

我已经在Linux“路由器”上设置了源代码策略路由,使用:

代码语言:javascript
复制
ip rule add from 192.168.1.0/24 table FOO
ip route add default dev eth0 table FOO

从该子网转发的数据包到达Internet目的地。

问题是表FOO不从表main继承本地连接的路由。

我可以手动添加本地连接的线路,但很明显,这是脆弱的,需要更多的维护。

我希望表FOO继承表main的所有路由,而不是"ip路由添加默认.“,我可以使用"ip路由更改默认值”。

对于其他子网,表main的默认路由必须保持不变。

我该怎么做?

EN

回答 2

Unix & Linux用户

发布于 2018-03-25 19:14:16

下面是添加新路由表和规则的通常方法,OP不希望这样做:

  1. 创建一个包含“异常”的新路由表,称为FOO
  2. 添加具有选择此表FOO的条件的规则
  3. 由于规则的优先级较低(更好),所以首先读取新表FOO,因此通常完全绕过main表。要“纠正”此问题,将从main表中的路由复制到表FOO

规则应该是这样的:

代码语言:javascript
复制
# ip rule 
0:  from all lookup local 
32765:  from 192.168.1.0/24 lookup FOO 
32766:  from all lookup main 
32767:  from all lookup default 

OP不希望做3,因为当路由改变时,它会增加管理负担。

据我所知,这是OP所希望的:

  1. 每个本地流量都应该按照表main中的通常路线来处理。
  2. 如果流量来自192.168.1.0/24,则其默认路由应从表FOO (此处为dev eth0)中选择。
  3. 否则,流量将使用“通常”的默认路径。

让我们按照这个顺序来实现它,而不是通常的顺序。结果可能不是问题中所描述的那样,而是所希望的结果。如果没有实际要解决的问题和OP给出的适当配置,有些事情可能会显得很尴尬(比如重用ip route的输出以将默认路由从表main移动到表default)。

从通常的规则开始:

代码语言:javascript
复制
# ip rule
0:  from all lookup local 
32766:  from all lookup main 
32767:  from all lookup default 

注意,default表是空的(默认情况下),可以免费使用。

代码语言:javascript
复制
# ip route show table default
#
  1. 将查找main的规则移至较低优先级# ip规则添加优先级32000从所有查找主# ip规则模型优先级32766
  2. 实现异常# ip路由添加默认的dev eth0表FOO # ip规则添加优先级32100从192.168.1.0/24查找FOO
  3. 将“常规”默认路由从表main移动到表default,以允许在规则32100处触发异常。规则32767仍将给出来自default表的默认路由,如果之前没有找到匹配,则没有连接丢失。# ip路由添加$(ip路由显示0.0.0.0/0)表默认# ip路由模型默认

规则现在将如下所示:

代码语言:javascript
复制
# ip rule
0:  from all lookup local 
32000:  from all lookup main 
32100:  from 192.168.1.0/24 lookup FOO 
32767:  from all lookup default 

容器中的几个示例(这没有什么意义,只是为了查看所涉及的表):

代码语言:javascript
复制
# ip -br link
lo               UNKNOWN        00:00:00:00:00:00 <LOOPBACK,UP,LOWER_UP> 
eth0@if12        UP             66:d4:11:94:49:5f <BROADCAST,MULTICAST,UP,LOWER_UP> 
local0@if9       UP             00:16:3e:6a:c1:e9 <BROADCAST,MULTICAST,UP,LOWER_UP> 
# ip -4 -br a
lo               UNKNOWN        127.0.0.1/8 
local0@if9       UP             10.0.3.66/24 
# ip route
10.0.3.0/24 dev local0 proto kernel scope link src 10.0.3.66 
# ip route show table FOO
default dev eth0 scope link 
# ip route show table default
default via 10.0.3.1 dev local0 

# ip -o route get 10.0.3.2
10.0.3.2 dev local0 src 10.0.3.66 \    cache 
# ip -o route get 8.8.8.8
8.8.8.8 via 10.0.3.1 dev local0 table default src 10.0.3.66 \    cache 
# ip -o route get 8.8.8.8 from 192.168.1.2 iif local0
8.8.8.8 from 192.168.1.2 dev eth0 table FOO \    cache  iif local0

就这样。唯一的用法差异是,现在必须在表default (253)而不是表main (254)中设置“常规”默认路由。必须对引导脚本进行调整以处理它:设置不应声明默认路由或网关,而应运行将执行ip route add default ... table default的附加自定义脚本。对于Debian,这可以通过post-up命令(如post-up ip route add default via xxx table default || :)在/etc/network/interfaces中完成。对于RHEL7,这应该用路线-XXX文件来完成。对于systemd的新网络方法,我不知道。

票数 3
EN

Unix & Linux用户

发布于 2021-01-05 16:59:54

只需加上

代码语言:javascript
复制
ip rule add from 192.168.1.0/24 table main suppress_prefixlength 0

数据包将转到table main并找到路由,但不会使用table main中的默认路由。

然后数据包转到table FOO并被路由到eth0

票数 2
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/423502

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档