Table of Contents
路由的工作原理
首先如果目标IP地址是和本机是直接相连的(比如通过point-to-point连接),或者目标IP地址与本机处于同一个网络/网段(比如以太网),那么这个时候不需要路由器,可以直接将数据包发到目标IP地址对应的机器。
主机(host)与路由器的区别:主机不转发数据包。但是如今的主机大多数也是可以配置为转发数据包,具备路由器的功能的。
从网卡或者本地的网络协议栈收到IP数据包后的处理过程:
- 先检查自己是否应该接收这个数据包,比如目标IP地址是自己的某个网卡的地址,或者这个IP数据包是一个广播或者多播的数据包并且自己的某个IP地址在这个范围内。如果自己应该接收这个数据包,那么就将其交给IP数据包中指定的上层协议处理。
- 如果发现自己不应该接受这个IP数据包,那么检查是否开启了IP转发功能。如果没有开启则直接丢掉。
- 查找路由表转发。
路由表查询
按照最长前缀匹配的原则来匹配。
路由表更新
通过路由命令手动更新
通过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
近期评论