路由表和策略路由的区别
通常我们维护静态路由表会手工填写所有 IP 地址段的路由规则,使用命令或者写入配置文件永久生效,先以 Windows/Linux 常用方法为例
#Windows 静态路由
-- 键入 route -p add [目标] [mask < 网络掩码 & gt;] [网关] [metric < 度量值 & gt;] [if < 接口 & gt;]
route print
route delete
route -p add 172.16.19.0 mask 255.255.255.0 198.15.0.1
#RHEL 静态路由
vi /etc/sysconfig/network
default via 192.168.3.1 dev eth0
10.211.6.0/24 via 192.168.3.1 dev eth0
10.0.0.0/8 via 10.212.52.1 dev eth1
#CentOS 静态路由
ip route add 172.16.5.0/24 via 10.0.0.101 dev eth0
vim /etc/sysconfig/network-scripts/route-eth0
172.16.5.0/24 via 10.0.0.101
这种办法针对少量的规则还可以轻松应对,但规则一旦增加麻烦也就接踵而至,网段地址不断变化就必须及时更新路由表,否则其他用户就无法访问。如果可以根据用户访问进来的路径设定策略路由就会方便很多,而 rt_tables 就是为此而生。
路由寻址
路由寻找过程中,会根据路由策略的优先级来查找路由表。所以分析时,
- 第一,我们应该根据优先级遍历路由策略。匹配路由策略则跳到第二步,否则继续遍历路由策略。
- 第二,找路由策略绑定的路由表,从路由表中匹配路由。若匹配到路由则跳到第三,否则跳到第一,继续下一个优先级的路由策略。
- 第三,找到路由。
Linux 添加静态路由最佳实践
临时路由
以下两种方法可以立即生效,但重启后会消失,切记使用场景:
#route 命令参数,使用 route 命令,查看本机路由直接输入 route -n 回车即可
add 增加路由
del 删除路由
-net 设置到某个网段的路由
-host 设置到某台主机的路由
gw 出口网关 IP 地址
dev 出口网关 物理设备名
# 添加路由
route add -net 192.168.0.0/24 gw 192.168.0.1
route add -host 192.168.1.1 dev 192.168.0.1
# 删除路由
route del -net 192.168.0.0/24 gw 192.168.0.1
# 添加默认路由
route add default gw 192.168.0.1
# 使用 ip route 命令和 route 命令类似
add 增加路由
del 删除路由
via 网关出口 IP 地址
dev 网关出口 物理设备名
# 添加路由
ip route add 192.168.0.0/24 via 192.168.0.1
ip route add 192.168.1.1 dev 192.168.0.1
# 删除路由
ip route del 192.168.0.0/24 via 192.168.0.1
# 增加默认路由
ip route add default via 192.168.0.1 dev eth0
永久路由
该方法需要重启网络会造成短暂的网络服务中断
# 可以通过临时命令立即生效
route add -net 192.168.3.0/24 gw 192.168.3.254
# 在 / etc/sysconfig/static-routes 文件里添加如下内容 (没有 static-routes 的话就手动建立一个这样的文件)
any net 192.168.3.0/24 gw 192.168.3.254
any net 10.250.228.128 netmask 255.255.255.192 gw 10.250.228.129
# 如果是生产系统可以考虑暂时不重启服务避免网络中断
CentOS 6: service network restart
CentOS 7: systemctl restart network.service
CentOS 8:
必须先加载配置
nmcli c reload
以下三个命令都可以重启网卡
nmcli c up ens160
nmcli d reapply ens160
nmcli d connect ens160
也可以 down/up 网卡
ifdown eth0 && ifup eth0
或者 down/up 网络连接
nmcli connection down ens33 && nmcli connection up ens33
rt_tables
rt_tables 简单来说就是通过给表的命名使得管理简单化
大部分人习惯直接将路由表优先级号码直接作为表的名称来使用,这样做的好处是非常直观和简明的表达了表所在优先级的位置,但是当表的优先级结构出现变动时,我们对巨大的路由表的修改就显得很烦琐和费事了。
在 /etc/iproute2/
目录下, 有这么一个文件 rt_tables
, 只要对它进行改动,我们将很容易的完成路由表优先级结构的变动。(数值越小优先级别越高)
当路由表的优先级发生变化的时候,我们只需要编辑 /etc/iproute2/rt_tables
这个文件就可以直接改变路由表的优先级次序。
cat /etc/iproute2/rt_tables
#
# reserved values
#
255 local
254 main
253 default
0 unspec
#
# local
#
#1 inr.ruhep
Linux 最多可以支持 255 张路由表,其中有 3 张表是内置的:
- 表 255 本地路由表(Local table) 本地接口地址,广播地址,已及 NAT 地址都放在这个表。该路由表由系统自动维护,管理员不能直接修改。
- 表 254 主路由表(Main table) 如果没有指明路由所属的表,所有的路由都默认都放在这个表里,一般来说,旧的路由工具(如 route)所添加的路由都会加到这个表。一般是普通的路由。
- 表 253 默认路由表 (Default table) 一般来说默认的路由都放在这张表,但是如果特别指明放的也可以是所有的网关路由。
- 表 0 保留
策略性路由应用及分析 (iproute2)
简单的说 rt_tables 就是为了配合策略(rule)而存在的,类似于网络设备中的策略路由。
策略性路由
策略性是指对于 IP 包的路由是以网络管理员根据需要定下的一些策略为主要依据进行路由的。例如我们可以有这样的策略:“所有来直自网 A 的包,选择 X 路径;其他选择 Y 路径”,或者是 “所有 TOS 为 A 的包选择路径 F;其他选者路径 K”。
Cisco 的网络操作系统 (Cisco IOS) 从 11.0 开始就采用新的策略性路由机制。而 Linux 是在内核 2.1 开始采用策略性路由机制的。策略性路由机制与传统的路由算法相比主要是引入了多路由表以及规则的概念。
多路由表(multiple Routing Tables)
传统的路由算法是仅使用一张路由表的。但是在有些情形底下,我们是需要使用多路由表的。例如一个子网通过一个路由器与外界相连,路由器与外界有两条线路相连,其中一条的速度比较快,一条的速度比较慢。对于子网内的大多数用户来说对速度并没有特殊的要求,所以可以让他们用比较慢的路由;但是子网内有一些特殊的用户却是对速度的要求比较苛刻,所以他们需要使用速度比较快的路由。如果使用一张路由表上述要求是无法实现的,而如果根据源地址或其它参数,对不同的用户使用不同的路由表,这样就可以大大提高路由器的性能。
规则(rule)
规则是策略性的关键性的新的概念。我们可以用自然语言这样描述规则,例如我门可以指定这样的规则:
- 规则一:所有来自 192.16.152.24 的 IP 包,使用路由表 10, 本规则的优先级别是 1500
- 规则二:所有的包,使用路由表 253,本规则的优先级别是 32767
我们可以看到,规则包含 3 个要素:
- 什么样的包,将应用本规则(所谓的 SELECTOR,可能是 filter 更能反映其作用);
- 符合本规则的包将对其采取什么动作(ACTION),例如用那个表;
- 本规则的优先级别。优先级别越高的规则越先匹配(数值越小优先级别越高)。
配置实例
双网卡多 IP 路由配置
环境
内网有个机器有2个网卡,并且是不同的网段和网关。
其中的B服务器有2个网卡。这个时候我们就只有默认网关为10.1.1.1 那查看路由表就是如下:
[root@localhost ~]# ip route show table all
10.1.1.0/24 dev eth0 proto kernel scope link src 10.1.1.247
10.1.2.0/24 dev eth1 proto kernel scope link src 10.1.2.239
169.254.0.0/16 dev eth0 scope link metric 1002
169.254.0.0/16 dev eth1 scope link metric 1003
default via 10.1.1.1 dev eth0
[root@localhost ~]# ip rule show
0: from all lookup local
32766: from all lookup main
32767: from all lookup default
这个时候我们可以发现,从1网段到1网段来回都没有问题,2网段来回也没有问题。但是从server A到server B的2网段是不通的。 因为你去到2网段后,server B的默认路由是10.1.1.1。
所以我们需要设置server B上,来自哪个网卡的路由就从哪个网卡出去。这样server A到server B的2网段就没有问题了。
首先添加2个route table:
vim /etc/iproute2/rt_tables
$ cat /etc/iproute2/rt_tables
#
# reserved values
#
255 local
254 main
253 default
252 lan1
251 lan2
0 unspec
然后再添加ip route和ip rule
ip route flush table lan1
ip route add default via 10.1.1.1 dev eth0 src 10.1.1.247 table lan1
ip rule add from 10.1.1.247 table lan1
ip route flush table lan2
ip route add default via 10.1.2.1 dev eth1 src 10.1.2.239 table lan2
ip rule add from 10.1.2.239 table lan2
这个时候我们再查看路由表如下:
[root@localhost ~]# ip route show all
10.1.1.0/24 dev eth0 proto kernel scope link src 10.1.1.247
10.1.2.0/24 dev eth1 proto kernel scope link src 10.1.2.239
169.254.0.0/16 dev eth0 scope link metric 1002
169.254.0.0/16 dev eth1 scope link metric 1003
default via 10.1.1.1 dev eth0
[root@localhost ~]# ip rule show
0: from all lookup local
32764: from 10.1.2.239 lookup lan2
32765: from 10.1.1.247 lookup lan1
32766: from all lookup main
32767: from all lookup default
这个时候从表面上似乎解决了问题,从server A访问server B的2网段也能正常返回,从server C访问server B的1网段也可以正常返回。
但是我们发现,这个时候从server B访问server A的1网段的时候,一直网络状态在SYN的状态(也就是由 server B 发起的连接异常)。
这个时候我们发现,上面的ip rule只是设定了,来自2网段的走lan2(又设定了src为自己), 来自1网段的走lan1(又设定了src 为自己的IP)。而没有设定如果主动出去是怎么样的。
因此我们把上面的ip rule加了2条.
ip route flush table lan1
ip route add default via 10.1.1.1 dev eth0 src 10.1.1.247 table lan1
ip rule add from 10.1.1.247 table lan1
ip rule add from 10.1.1.247 to 10.1.1.0/24 table main
ip route flush table lan2
ip route add default via 10.1.2.1 dev eth1 src 10.1.2.239 table lan2
ip rule add from 10.1.2.239 table lan2
ip rule add from 10.1.2.239 to 10.1.2.0/24 table main
然后我们查看路由表如下:
[root@localhost ~]# ip route show table all
default via 10.1.1.1 dev eth0 table lan1 src 10.1.1.247
10.1.1.0/24 dev eth0 proto kernel scope link src 10.1.1.247
10.1.2.0/24 dev eth1 proto kernel scope link src 10.1.2.239
169.254.0.0/16 dev eth0 scope link metric 1002
169.254.0.0/16 dev eth1 scope link metric 1003
default via 10.1.1.1 dev eth0
default via 10.1.2.1 dev eth1 table lan2 src 10.1.2.239
[root@localhost ~]# ip rule show
0: from all lookup local
32762: from 10.1.2.239 to 10.1.2.0/24 lookup main
32763: from 10.1.2.239 lookup lan2
32764: from 10.1.1.247 to 10.1.1.0/24 lookup main
32765: from 10.1.1.247 lookup lan1
32766: from all lookup main
32767: from all lookup default
从上面这个例子中可以窥见,平时我们用 netstat -rn 这样来查看路由是没有问题的,但是当出现自定义 route table 的时候,我们需要注意的一些东西,一个是 route table 本身,还有是ip rule去定义使用哪个table。
双网卡不同运营商配置
设置两张路由表,加网通和电信两个路由表
vi /etc/iproute2/rt_tables
251 tel # 电信路由表
252 cnc # 网通路由表
给网卡绑定两个地址用于电信和网通两个线路:
ip addr add 192.168.0.2/24 dev eth0
ip addr add 10.0.0.2/24 dev eth1
分别设置电信和网通的路由表
电信路由表:
#确保找到本地子网
ip route add 192.168.0.0/24 via 192.168.0.2 dev eth0 table tel
#内部回环网络
ip route add 127.0.0.0/8 dev lo table tel
#192.168.0.1为电信网络默认网关地址
ip route add default via 192.168.0.1 dev eth0 table tel
网通线路路由表:
#确保找到本地子网
ip route add 10.0.0.0/24 via 10.0.0.2 dev eth1 table cnc
#内部回环网络
ip route add 127.0.0.0/8 dev lo table cnc
#10.0.0.1是网通的默认网关
ip route add default via 10.0.0.1 dev eth1 table cnc
电信和网通各有自己的路由表,制定策略,让192.168.0.2的回应数据包走电信的路由表路由,10.0.0.2的回应数据包走网通的路由表路由
ip rule add from 192.168.0.1 table tel
ip rule add from 10.0.0.1 table cnc
个人理解总结
当服务器有多张网卡的时候,其实和路由器是一样的,有一个默认路由(或者叫默认网关),另外一个网关只能通过手工添加一条静态路由来控制数据包走法。