计算机网络 - 路由器

隔离并联通冲突域

如何隔离

假设,我们有四个网段需要分别被单独隔离,子网 1: 192.168.32.0,子网 2: 172.0.1.0,子网 3: 10.1.1.0,子网 4: 10.2.2.0;隔离的方法主要有,

直连路由

如图,路由器上的 LAN 口分别做为每个子网的网关,直接连接所有子网的交换机,比如 192.168.32.1 的网关就是 192.168.32.1,对应的也就是路由器的第一个 LAN 口,直接连接子网段的交换机;

特点,直连路由不用配置路由表,因为所有的 IP 包的转发都在一个路由器上发生,且每个 LAN 口都指明了 IP 包转发的路径,所以不用配置。

注意,有些入门级的路由器,是一个交换机 + 路由的叠加,LAN 口不能配置 IP,因为路由器的 LAN 口实际上就是交换机的接口;而路由器只有唯一一个 LAN 口可以配置网关,这种情况下,路由器不能作为直连路由的方式来直接连接不同的网段;如果遇到这样的情况,检查 1、检查路由器是否需要进行设置扩展 LAN 口,这样可以针对不同的 LAN 口设置不同的网关;2、看路由器是否支持 VLAN,用虚拟以太网的方式来划分。

非直连路由

每个子网单独连接一个路由器,然后再由路由器连接其它路由器,注意有

  1. 两路由器之间通过 WAN 口连接,相连的两个 WAN 口必须在同一个网段。
  2. 路由器本身就相当于连接交换机的一台主机节点,同样通过 MAC 地址彼此通讯。
  3. 根据报文的目的地地址并通过路由表的配置对数据包进行转发。

直连路由 + 非直连路由

一部分的子网直接连接在一个路由器上,另外的可以单独连接

负责 IP 层既网络层通讯

路由器是三层通讯设备,既是 IP 层通讯设备。TCP 层呢,路由器参与不呢?TCP 流控是由网卡控制的,不是路由器,所以,路由器的通讯只在 IP 层。

路由表

方向、网关、尺度、网卡接口

路由表主要由方向、网关、尺度、网卡接口四部分组成

  1. 方向
    指的是所发送数据包的目的地址
  2. 网关
    路由器 LAN 口的 IP 地址;
  3. 尺度
    从源到目的地经过了几个路由器节点(自身路由除外),也称为跳数,每经过一个路由就是一跳,用来粗略的衡量从源到目的地的距离。
  4. 网卡接口
    指主机的网卡接口;该定义只在主机上有效,路由器、交换机上没有这个定义。

主机

1
2
3
4
5
6
7
8
bogon:comedsh.github.io mac$ netstat -nr
Routing tables

Internet:
Destination Gateway Flags Refs Use Netif
0.0.0.0 192.168.1.1 UGSc 120 0 en0
127 127.0.0.1 UCS 1 0 lo0
127.0.0.1 127.0.0.1 UH 18 23742 lo0

上面罗列出了我当前 mac 主机上的路由表信息,

  1. 方向(Destination)
    0.0.0.0 -> 表示任意的 IP 地址(注意,这是缺省路由配置下的目的地址,任意方向)
  2. 网关(Gateway)
    192.168.1.1 -> 路由器的网关地址
  3. 跳数(Refs)
    120 -> 估算的跳数
  4. 网卡接口(Netif)
    en0 -> 本机的物理网卡名称

意思就是说,目标地址是任意 IP 地址的数据包,均通过物理网卡 en0 发送至路由器网关 192.168.1.1,然后交由路由器转发。

备注,一旦通过 DHCP 获得了 IP 地址,系统会默认生成一条缺省路由既 Destination 为 0.0.0.0,该设置的意义在于,当其他所有的路由规则都不匹配的时候,才使用该路由。注意,该路由的设置是比较危险的,如果你有两个网卡,期望是一张网卡连接外网,另外一张网卡连接内网的,但是如果你只设置了一个缺省路由,那么只会有一个张网卡工作,所以,当你有多张网卡,多个子网需要连接的时候,需要时刻检查你的缺省路由的情况。

交换机

无需路由表,交换机直连路由器,通过 MAC 地址与路由器进行通讯,这里,可以简单的视路由器为交换机的一个主机节点。

路由器

非直连路由的示图为例,假设子网 1 的某台主机 192.168.32.5 主机发送一个数据包给子网 3 的某台主机 10.1.1.8,那么路由表该如何进行设置呢?

  1. 主机(192.168.32.5)路由表
    方向: 10.1.1.0 (表示子网 3 的网段)
    网关: 192.168.32.1
    网卡接口: en0
    表示当前主机发送到 10.1.1.0 子网 3 网段的数据包,需要经过物理网卡 en0 将数据发送给路由器的网关 192.168.32.1。

  2. 路由器(10.0.0.1)路由表配置
    方向: 10.1.1.0
    网关: 10.0.0.2
    跳数: 2 (表示需要经过两个路由器的转发,不用配置,路由器会自己估算)
    表示凡是目的地址为 10.1.1.0 的数据包在通过本路由以后,均要通过 10.0.0.2 (另一台路由的 WAN 口地址) 转发

  3. 路由器(10.0.0.2)路由表配置
    方向: 10.1.1.0
    网关: 50.0.0.3
    跳数: 1
    表示凡是目的地址为 10.1.1.0 的数据包在通过本路由以后,均要通过 50.0.0.3 (另一台路由的 WAN 口地址) 进行转发。

当数据包到达路由器(10.0.0.2)以后,路由器便将数据包通过对应的交换机发给内网主机 10.1.1.8。

10.0.0.2 -> 50.0.0.3 的数据包转发需要配置路由表吗?答案是不需要,因为两点之间是通过直连路由连接的。
50.0.0.3 -> 10.1.1.8 的数据包转发需要配置路由表吗?同样不需要,因为是直连路由

WAN 口 / LAN 口

WAN 口,路由器与路由器的连接口。
LAN 口,内网主机或者交换机与路由器连接的接口。

连通广域网

NAT

内网主机发送的数据包的源地址在 Internet 上是不合发的,是不能被识别的,所以,需要在路由器上通过 NAT 技术,将源地址转换为路由器所对应的合法的 Internet 地址。比如,我们有路由器,且该路由器的 IP 地址是 Internet 的合法地址 172.168.23.5,而内网主机的 IP 地址是 192.168.32.5,那么此时,如果 192.168.32.5 发送一个数据包到 Internet 上的某个主机 10.158.8.8,因为数据包源地址 192.168.32.5 不是 Internet 上的合法地址,所以,10.158.8.8 在收到数据包以后,无法进行回执;所以,当内网数据包经过路由器的时候,路由器需要对源地址进行转换,将 192.168.32.5 的地址转换为 172.168.32.5,所以,当 10.158.8.8 收到数据包以后,才能进行有效的回执。-> 这就是 NAT;

延伸,10.158.8.8 回执的数据包是发送给路由器 172.168.23.5 的啊,那内网主机 192.168.32.5 是如何接收到回执数据包的呢?

  1. 192.168.32.5 通过应用程序的随机端口 65000,向路由器 172.168.32.5 发送了一个数据包。
  2. 路由器 172.68.32.5 收到该数据包以后,首先,将 192.168.32.5 的源 IP 地址修改为 172.68.32.5,然后随机开启一个端口 52333,向目的地址 10.158.8.8 转发该数据包。
  3. 路由器 SESSION
    路由器将缓存当前的临时通道 192.168.32.5:65000 <-> 172.168.32.5:52333
  4. 10.158.8.8 回执信息 -> 172.168.32.5:52333
  5. 通过路由器 SESSION 192.168.32.5:65000 <-> 172.168.32.5:52333,将数据包172.168.32.5:52333 转发给 192.168.32.5:65000,所以,最终,内网主机也就能够收到 10.158.8.8 的回执数据包。

DNAT

若内网某主机需要做为服务器使用,这个时候,可以通过 DNAT 将路由器的某个端口映射到该内网主机上。

另一个视野

从链路层上看,路由器其实就是交换机的一个子节点,通过 MAC 地址通讯。

route 本机常用命令

mac

1
$ netstat -nr

Ubuntu

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

# 显示所有的路由表配置信息,显示信息会被 DNS 转义
$ route

# 不转义
$ route -n

$ route add -net 10.171.32.0 netmask 255.255.255.0 gw 192.168.32.1 dev eth0
$ route add -h
Usage: inet_route [-vF] del {-host|-net} Target[/prefix] [gw Gw] [metric M] [[dev] If]
inet_route [-vF] add {-host|-net} Target[/prefix] [gw Gw] [metric M]
[netmask N] [mss Mss] [window W] [irtt I]
[mod] [dyn] [reinstate] [[dev] If]
inet_route [-vF] add {-host|-net} Target[/prefix] [metric M] reject
inet_route [-FC] flush NOT supported

$ route del -h
Usage: route [-nNvee] [-FC] [<AF>] List kernel routing tables
route [-v] [-FC] {add|del|flush} ... Modify routing table for AF.

route {-h|--help} [<AF>] Detailed usage syntax for specified AF.
route {-V|--version} Display version/author and exit.

-v, --verbose be verbose
-n, --numeric don't resolve names
-e, --extend display other/more information
-F, --fib display Forwarding Information Base (d

# 添加一个网关为 192.168.32.1 的缺省路由
$ ip route add default via 192.168.32.1