计算机 · 2021年11月20日 0

路由

路由的工作原理

首先如果目标IP地址是和本机是直接相连的(比如通过point-to-point连接),或者目标IP地址与本机处于同一个网络/网段(比如以太网),那么这个时候不需要路由器,可以直接将数据包发到目标IP地址对应的机器。

主机(host)与路由器的区别:主机不转发数据包。但是如今的主机大多数也是可以配置为转发数据包,具备路由器的功能的。

从网卡或者本地的网络协议栈收到IP数据包后的处理过程:

  1. 先检查自己是否应该接收这个数据包,比如目标IP地址是自己的某个网卡的地址,或者这个IP数据包是一个广播或者多播的数据包并且自己的某个IP地址在这个范围内。如果自己应该接收这个数据包,那么就将其交给IP数据包中指定的上层协议处理。
  2. 如果发现自己不应该接受这个IP数据包,那么检查是否开启了IP转发功能。如果没有开启则直接丢掉。
  3. 查找路由表转发。

路由表查询

按照最长前缀匹配的原则来匹配。

路由表更新

通过路由命令手动更新

通过route,ip route等命令手动修改路由表。

通过ICMP重定向更新

通过协议更新

对于大型路由器,需要通过BGP(Border Gateway Protocol,边际网关协议),RIP(Routing Information Protocol,路由信息协议)、OSPF等协议来发现和更新路由表。

常用路由命令

查看路由表

route -n

路由表的含义:

字段含义
目标目标网络或主机
网关网关地址,*或者0表示目标和本机在同一个网络,不需要路由
网络掩码(Genmask)
标志(Flags)路由项标志:
U(up),该路由是活动的
H(host),该路由项的目标是一台主机
G(gateway),该路由项的目标是网关
D(dynamically),该路由项是由重定向生成的
M(modified),该路由项被重定向修改过
A(installed by addrconf)
C(cache)
!(reject)
Metric权值,又称路由度量,为0时表示处于同一个网络,大于0时表示是一个外部网络地址。度量可能包含了带宽、延迟、经过节点数、路径成本、负载、最大传输成本、可靠性及传输成本等。
Ref路由项被引用的次数(Linux未使用)
Use该路由项被使用的次数
Iface该路由项对应的输出网卡接口。如果IP数据包是由本机产生的,那么这个网卡接口也将决定这个IP数据包的源地址。

上面路由表的第一条的目标地址是default,即默认路由项。默认网关路由项的网络掩码必须是0.0.0.0。

netstat -nr
ip route

IP转发

可以将一台linux机器设置为路由器,让其中转该机器上的多个网卡之间的流量。

1. 首先需要打开该Linux机器的IP转发功能:

echo 1 > /proc/sys/net/ipv4/ip_forward

2.假设机器上有eth0和eth1两个网卡,分别位于两个不同的网段192.168.0.0/24和192.168.1.0/24,我们想要允许来自192.168.0.0/24的流量转发到192.168.1.0/24,来自192.168.1.0/24的流量转发到192.168.0.0/24,那么我们需要在iptables中添加规则允许这种流量的转发 (因为iptables默认是拒绝这种转发的)

iptables -I FORWARD -i eth0 -o eth1 -j ACCEPT
iptables -I FORWARD -i eth1 -o eth0 -j ACCEPT

3.还需要设置路由表,告诉Linux要怎么转发

route add -net 192.168.0.0 netmask 255.255.255.0 dev eth1
route add -net 192.168.1.0 netmask 255.255.255.0 dev eth0