关键示意图

image.jpeg

路由策略(使用 ip rule 命令操作路由策略数据库)

1、ip rule 命令:

Usage: ip rule [ list | add | del ] SELECTOR ACTION (add 添加;del 删除; llist 列表)
SELECTOR := [ from PREFIX 数据包源地址] [ to PREFIX 数据包目的地址] [ tos TOS 服务类型][ dev STRING 物理接口] [ pref NUMBER ] [fwmark MARK iptables 标签]
ACTION := [ table TABLE_ID 指定所使用的路由表] [ nat ADDRESS 网络地址转换][ prohibit 丢弃该表| reject 拒绝该包| unreachable 丢弃该包]
[ flowid CLASSID ]
TABLE_ID := [ local | main | default | new | NUMBER ]

2、作用

基于策略的路由比传统路由在功能上更强大(需要区分此处是路由策略,作用的还是路由表,而不是策略路由**:**路由_路由策略和策略路由有什么区别),使用更灵活,它使网络管理员不仅能够根据目的地址而且能够根据报文大小、应用或IP源地址等属性来选择转发路径。

linux 高级路由即基于策略的路由(策略的路由 != 策略路由,策略的路由 == 路由策略,也就叫做路由策略**,比传统路由在功能上更强大,使用也更灵活,它不仅能够像传统路由一样,根据目的地址来转发数据,而且也能够根据报文大小、应用,协议或ip源地址来选择路由转发路径(也即选择路由表)。

也即数据包在传输时是根据RPDB(路由策略数据库)内的策略决定数据包应该用哪个路由表传输的。

3、规则

在 Linux 系统启动时,内核会为路由策略数据库配置三条缺省的规则:

  • 0 匹配任何条件 查询路由表local(ID 255) 路由表local是一个特殊的路由表,包含对于本地和广播地址的高优先级控制路由。rule 0非常特殊,不能被删除或者覆盖。
  • 32766 匹配任何条件 查询路由表main(ID 254) 路由表main(ID 254)是一个通常的表,包含所有的无策略路由。系统管理员可以删除或者使用另外的规则覆盖这条规则(route命令操作的就是这个表)。
  • 32767 匹配任何条件 查询路由表default(ID 253) 路由表default(ID 253)是一个空表,它是为一些后续处理保留的。对于前面的缺省策略没有匹配到的数据包,系统使用这个策略进行处理。这个规则也可以删除。


PS:路由表和策略区别:
规则(策略)指向路由表,多个规则可以引用一个路由表(
意思就是路由的规则、策略)和路由表是两种东西 **路由_路由策略和策略路由有什么区别),而且某些路由表可以没有策略指向它。如果系统管理员删除了指向某个路由表的所有规则,这个表就没有用了,但是仍然存在,直到里面的所有路由都被删除,它才会消失。

路由表 (使用 ip route 命令操作静态路由表)

1、概念

所谓路由表,指的是路由器或者其他互联网网络设备上存储的表(路由表就是单纯的表,需要先结合路由策略的匹配、优先级,再查这个表进行转发),该表中存有到达特定网络终端的路径,在某些情况下,还有一些与这些路径相关的度量。

路由器的主要工作就是为经过路由器的每个数据包寻找一条最佳的传输路径,并将该数据有效地传送到目的站点。由此可见,选择最佳路径的策略即路由算法是路由器的关键所在。为了完成这项工作,在路由器中保存着各种传输路径的相关数据——路由表(Routing Table),供路由选择时使用,表中包含的信息决定了数据转发的策略。

打个比方,路由表就像我们平时使用的地图一样,标识着各种路线,路由表中保存着子网的标志信息、网上路由器的个数和下一个路由器的名字等内容。路由表根据其建立的方法,可以分为动态路由表和静态路由表。
image.jpeg

2、路由表分类

linux 系统中,可以自定义从 1-252个路由表,其中,linux系统维护了4个路由表:

  • 0#表: 系统保留表
  • 253#表: defulte table 没特别指定的默认路由都放在改表
  • 254#表: main table 没指明路由表的所有路由放在该表(route命令操作的就是这个表,所以要指定对非main表的操作话就要使用ip route命令了
  • 255#表: locale table 保存本地接口地址,广播地址、NAT地址 由系统维护,用户不得更改

    3、常用命令 ip route

    路由表的查看可有以下二种方法:

  • ip route list table table_number 或者 ip route show table xxx 也行

  • ip route list table table_name

路由表序号和表名的对应关系在 /etc/iproute2/rt_tables 文件中,可手动编辑。路由表添加完毕即时生效,下面为实例:

  • ip route add default via 192.168.1.1 table 1 在一号表中添加默认路由为192.168.1.1
  • ip route add 192.168.0.0/24 via 192.168.1.2 table 1 在一号表中添加一条到192.168.0.0网段的路由为192.168.1.2

    4、命令示例

    ```bash 【route命令查看,都是 main 表中的内容】 admin@issp:~$ route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 10.127.127.1 0.0.0.0 UG 0 0 0 eth0 10.127.127.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 100.64.0.0 10.127.127.5 255.255.0.0 UG 0 0 0 eth0 121.46.30.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 169.254.169.254 10.127.127.16 255.255.255.255 UGH 0 0 0 eth0

【查看路由策略】 admin@issp:~$ ip rule list 0: from all lookup local 32766: from all lookup main 32767: from all lookup default

【查看 main 表的内容,可以看到与 route -n 的结果一致】 admin@issp:~$ ip route show table main default via 10.127.127.1 dev eth0 onlink 10.127.127.0/24 dev eth0 proto kernel scope link src 10.127.127.2 100.64.0.0/16 via 10.127.127.5 dev eth0 121.46.30.0/24 dev eth0 proto kernel scope link src 121.46.30.151 169.254.169.254 via 10.127.127.16 dev eth0

【查看 main 表的内容】 admin@issp:~$ ip route list table main default via 10.127.127.1 dev eth0 onlink 10.127.127.0/24 dev eth0 proto kernel scope link src 10.127.127.2 100.64.0.0/16 via 10.127.127.5 dev eth0 121.46.30.0/24 dev eth0 proto kernel scope link src 121.46.30.151 169.254.169.254 via 10.127.127.16 dev eth0

【查看 路由表序号和表名的对应关系】 admin@issp:~$ cat /etc/iproute2/rt_tables #

reserved values

# 255 local 254 main 253 default 0 unspec #

local

#

1 inr.ruhep

```

使用 ip route , ip rule , iptables 配置策略路由(非路由策略)

image.jpeg
需求:公司内网要求192.168.0.100以内的使用 10.0.0.1 网关上网(电信),其他IP使用 20.0.0.1 (网通)上网。
实现:
1、首先要在网关服务器上添加一个默认路由,当然这个指向是绝大多数的IP的出口网关。
ip route add default gw 20.0.0.1
2、通过 ip route 添加一个路由表
ip route add table 3 via 10.0.0.1 dev ethX (ethx是10.0.0.1所在的网卡,3 是路由表的编号)
3、添加 ip rule 规则
ip rule add fwmark 3 table 3 (fwmark 3是标记,table 3 是路由表3 上边。 意思就是凡事标记了 3 的数据使用table3 路由表)
4、使用iptables给相应的数据打上标记
iptables -A PREROUTING -t mangle -i eth0 -s 192.168.0.1 -192.168.0.100 -j MARK —set-mark 3

(就是结合 路由iptables概念 打标记,然后路由策略匹配这个标记指定到对应路由表,再查路由表,就可以实现一个特定规则的转发了因为mangle的处理是优先于 nat 和fiter表的,所以相依数据包到达之后先打上标记,之后在通过ip rule规则,对应的数据包使用相应的路由表进行路由,最后读取路由表信息,将数据包送出网关。**
image.jpeg
image.jpeg
这里可以看出 Netfilter 处理网络包的先后顺序:接收网络包,先 DNAT,然后查路由策略,查路由策略指定的路由表做路由,然后 SNAT,再发出网络包。