Chinaunix首页 | 论坛 | 博客
  • 博客访问: 117447
  • 博文数量: 165
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1655
  • 用 户 组: 普通用户
  • 注册时间: 2022-09-26 14:37
文章分类

全部博文(165)

文章存档

2024年(2)

2023年(95)

2022年(68)

我的朋友

分类: 云计算

2022-10-10 11:05:39

概述

在Linux中,我们通常使用route 命令来做路由信息的管理。但是该命令仅仅只能用于基本路由信息的管理,面对功能更加强大的基于策略的路由机制,route 命令就显得捉襟见肘。在传统路由算法中,只能基于目的地址进行路由选择。但是如果对路由选择有更复杂的要求,比如针对不同源地址、传输层端口甚至是payload进行更细致的路由控制,传统的基于目的地址的路由表就无法满足需求了,需要使用功能更加强大的路由策略数据库routeing database: RPDB 来处理。

命令安装

安装很简单,按照如下命令安装即可。

  1. # 查看iproute是否安装
  2. # 查看iproute版本
  3. ]# ip -V
  4. ip utility, iproute2-ss170501
  5. # 安装
  6. yum install iproute -y

路由策略数据库(RPDB)

RPDB是存放策略的数据库,被策略匹配的数据包会执行相关的操作,可以通过ip rule 来管理。

在系统启动时,内核会配置三条默认策略:

  1. # 通过ip rule show可以查看当前RPDB中的规则
  2. ]# ip rule show
  3. 0: from all lookup local # 优先级为0,匹配任意源地址,查询local路由表转发
  4. 32766: from all lookup main # 优先级为32766,匹配任意源地址,查询main路由表转发
  5. 32767: from all lookup default # 优先级为32767,匹配任意源地址,查询default路由表转发
  6. 1. local路由表是一个特殊的路由表,包含本地地址和广播地址的高优先级控制路由, 例如访问127.0.0.1就是参考的这条规则。
  7. 2. main路由表是一个通用路由表,正常通过route -n命令操作的就是这个路由表。
  8. 3. default路由表默认是一个空表,除非有特别的要求,否则保持为空即可。

每条策略路由的规则由一个选择器 和一个动作 组成,RPDB按照优先级顺序进行规则匹配,优先级数字越小越优先。被选择器 匹配的报文会执行对应的操作,操作如果成功,则根据指定的路由转发数据,之后终止RPDB匹配,如果执行失败,则报错并且终止RPDB匹配。否则RPDB将继续执行下一条规则。

ip rule命令说明

  1. # 执行ip rule help可以查看帮助信息,如果需要更详细的帮助信息,可以执行man ip-rule
  2. ]# ip rule help
  3. Usage: ip rule { add | del } SELECTOR ACTION
  4. ip rule { flush | save | restore }
  5. ip rule [ list [ SELECTOR ]]
  6. SELECTOR := [ not ] [ from PREFIX ] [ to PREFIX ] [ tos TOS ] [ fwmark FWMARK[/MASK] ]
  7. [ iif STRING ] [ oif STRING ] [ pref NUMBER ] [ l3mdev ]
  8. [ uidrange NUMBER-NUMBER ]
  9. ACTION := [ table TABLE_ID ]
  10. [ nat ADDRESS ]
  11. [ realms [SRCREALM/]DSTREALM ]
  12. [ goto NUMBER ]
  13. SUPPRESSOR
  14. SUPPRESSOR := [ suppress_prefixlength NUMBER ]
  15. [ suppress_ifgroup DEVGROUP ]
  16. TABLE_ID := [ local | main | default | NUMBER ]

选择器(SELECTOR)

  1. from PREFIX: 根据源地址前缀匹配
  2. to PREFIX: 根据目的地址前缀匹配
  3. tos TOS: 根据ip包头TOS字段的值进行匹配
  4. fwmark FWMARK[/MASK]: 配合iptables -t mangle 打标记,根据标记进行匹配
  5. iif STRING: 选择要匹配的数据包的输入接口。
  6. oif STRING: 选择要匹配的出接口设备。只对来自本地套接字并与设备绑定的报文有效
  7. pref NUMBER: 规则的优先级。这里的pref可以替换成priority或者order,效果是一样的。

动作(ACTION)

  1. table TABLE_ID: 在规则匹配的时候,指定使用的路由表,被匹配的数据包将按照指定的路由表进行路由。此处的table也可以替换为lookup,效果是一样的。
  2. blackhole: 丢弃匹配的数据包。
  3. unreachable: 丢弃匹配的数据包,并生成"Network is unreachable"错误。
  4. prohibit: 丢弃匹配的数据包,并生成"Communication is administratively prohibited"错误。

查看策略

  1. ]# ip rule show
  2. 0: from all lookup local
  3. 32766: from all lookup main
  4. 32767: from all lookup default

添加策略

  1. # 来自192.168.22.3的数据包,都参考id为10的路由表进行转发
  2. ip rule add from 192.168.22.3 table 10
  3. # 设置规则的优先级为100,发往192.168.23.0/24的数据包,都参考id为100的路由表进行转发
  4. ip rule add to 192.168.23.0/24 table 20 pref 100
  5. # 给协议是tcp,源地址是192.168.24.0/24,目的端口是80的数据包,在路由前打上1的标记
  6. iptables -t mangle -A PREROUTING -p tcp -m multiport --dports 80 -s 192.168.24.0/24 -j MARK --set-mark 1
  7. # 将标记为1的数据包,参考id为iptables_table的路由表进行转发
  8. ip rule add fwmark 1 table iptables_table
  9. # 来自192.168.25.0/24的数据包都将丢弃
  10. ip rule add from 192.168.25.0/24 blackhole
  11. ip rule add from 192.168.26.0/24 unreachable
  12. ip rule add from 192.168.27.0/24 prohibit

注意,添加动作是table TABLE_ID时,默认情况下,只能添加数字,如果添加的是字符的话,会有如下报错。

  1. ]# ip rule add from 192.168.22.3 table iptables_table
  2. Error: argument "iptables_table" is wrong: invalid table ID

这就带来一个问题,如果时间久了,就不知道自己当时添加的这个路由表是啥意思了。所以需要有一个数字和字符的对应关系。这个对应关系,就保存在/etc/iproute2/rt_tables 这个文件里。

  1. # 编辑/etc/iproute2/rt_tables,添加iptables_table表的id为100
  2. ]# cat /etc/iproute2/rt_tables
  3. #
  4. # reserved values
  5. #
  6. 255 local
  7. 254 main
  8. 253 default
  9. 0 unspec
  10. # 自定义路由表
  11. 100 iptables_table
  12. #
  13. # local
  14. #
  15. #1 inr.ruhep

添加之后,就可以正常执行ip rule add from 192.168.22.3 table iptables_table 了。并且执行ip rule show的时候,路由表也是按照定义的字符显示。

删除策略

  1. # 根据路由表删除
  2. ip rule del table iptables_table
  3. # 根据来源地址删除
  4. ip rule del from 192.168.22.0/24
  5. # 根据优先级删除
  6. ip rule del pref 100
  7. # 根据标记删除
  8. ip rule del fwmark 100

路由表管理

目前看,通过ip rule命令,可以根据不同的规则,选择不同的路由表来转发数据。那么如何对不同的路由表做管理呢? 很简单,只要在正常执行的命令之后,加上table TABLE_ID 即可。

查看路由表路由条目

  1. # ip route show等价于ip route show table main,也就是查的是默认的main路由表
  2. ip route show
  3. # 查看指定目标的路由
  4. ip route show 192.168.22.0/24
  5. # 查看指定路由表iptables_table中的路由
  6. ip route show table iptables_table
  7. ip route show table 100

添加路由

  1. # 向iptables_table中添加默认路由
  2. ip route add default via 192.168.22.1 dev eth1 src 192.168.22.3 table iptables_table
  3. ]# ip route show table 100
  4. default via 192.168.22.1 dev eth1 src 192.168.22.3

删除路由

  1. # 删除iptables_table路由表中的路由
  2. ip route del default via 192.168.22.1 dev eth1 src 192.168.22.3 table iptables_table
阅读(324) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~