从双网卡——到路由表

  1. 1. 发现问题
  2. 2. 原理探究
  3. 3. 解决问题

现在的电脑一般都拥有双网卡,但这是否是一件好事呢?对于某些小白来说,可能并不是(比如我(●ˇ∀ˇ●))。

发现问题

拿到刚到手的树莓派,首先要做的肯定是配环境!但是在VNC连接树莓派时遇到了问题:
当我使用WIFI连接树莓派时,由于带宽限制,界面很卡,影响体验。
当我使用有线连接树莓派时,由于有线网卡的优先级高于无线网卡,导致树莓派只能浏览内网(也就是我笔记本的网络),如果使用笔记本共享外网的话只能使用DHCP自动分配IP,这样则会导致IP变化不方便我们连接 树莓派。
但是我明明有一个无线网卡连接外网啊!!!怎样才能把它利用起来,成了我要解决的问题。

原理探究

找了好久,终于发现了路由表这个神奇的东西,
百度百科这样说道:
在计算机网络中,路由表(routing table)或称路由择域信息库(RIB, Routing Information Base),是一个存储在路由器或者联网计算机中的电子表格(文件)或类数据库。路由表存储着指向特定网络地址的路径(在有些情况下,还记录有路径的路由度量值)。路由表中含有网络周边的拓扑信息。路由表建立的主要目标是为了实现路由协议和静态路由选择。

简单来讲,路由表可以规定发往何处的信息使用哪一个路由,也就是决定要发出的信息(对于计算机)或收到的信息(对于路由器)的下一跳是哪里。

在linux中配置路由表很简单,因为它全部被集成到了route这一个指令中。
首先我们来看路由表长什么样。
拿我的服务器举例,在终端中输入(sudo)route,可以看到:
Snipaste_2020-08-13_17-38-05.jpg
其中Destination表示目标的IP地址;
Gateway表示选择下一跳网关IP地址(所有跨网段传输的信息均需要通过该网段的网关传输);
GenMask代表掩码,用于确定一个网段;
Flags是用于区分的标志位;
Iface是网卡设备的名称(可以使用(sudo)ifconfig来查看);
Snipaste_2020-08-13_17-44-12.jpg
Flags标志位确定了一系列的路由类型,主要有以下几种:
主机路由:
顾名思义,主机路由表示单独指向某个特定主机(IP)的路由,所有目标为该主机的信息都发送到所设定的网关,同时也确定了用哪个网卡设备传输信息。
主机路由除了Flags的区别,最明显的特征就是它的Destination是一个完整的IP地址,并且它的GenMask是255.255.255.255。这说明了它的目标不是一个网络而是一个特定的主机(IP)。


网络路由:
理解了主机路由 在来理解网络路由并不是很难。网络路由指向一个特定的网段,因此它的GenMask不全是 1(比如是255.255.0.0)。它的Destination中也包含0(比如192.168.0.0),0的含义就是任意,这个网段表示整个192.168.*.*的网络。
同理,所有目标为该网络的信息都发送到所设定的网关。


默认路由:
剩下最简单的就是默认路由了,没有特殊指明的主机(IP),就发送到默认路由设定的网关。默认路由最明显的特征是它的Destination是default,GenMask是0.0.0.0(表示全部网段)。

想要改变路由表,就要使用route命令,它的基本操作如下:

添加路由:route add

  1. route add -host 192.168.1.2 dev eth0 添加设备eth0为主机路由,主机IP为192.168.1.2
  2. route add -host 10.20.30.148 gw 10.20.30.40 添加网关10.20.30.40为主机路由
  3. route add -net 10.20.30.40 netmask 255.255.255.248 eth0 添加网络路由,网段为255.255.255.248
  4. route add -net 10.20.30.48 netmask 255.255.255.248 gw 10.20.30.41 同上,使用网关添加
  5. route add -net 192.168.1.0/24 eth1 添加网络路由,使用目标IP段/MASK位数形式
  6. route add default gw 192.168.1.1 添加默认路由

删除路由:route del

  1. route del -host 192.168.1.2 dev eth0 原理同上
  2. route del -host 10.20.30.148 gw 10.20.30.40
  3. route del -net 10.20.30.40 netmask 255.255.255.248 eth0
  4. route del -net 10.20.30.48 netmask 255.255.255.248 gw 10.20.30.41
  5. route del -net 192.168.1.0/24 eth1
  6. route del default gw 192.168.1.1

解决问题

了解了基础知识,我们来解决一下实际问题!
首先删除所有默认网关:

# sudo route del default gw 192.168.20.1
# sudo route del default gw 192.168.21.1

添加eth0(有线网卡)仅进行内网访问,即仅在Destination为192.168.*.*的时候使用它。

# sudo route add -net 192.168.0.0 netmask 255.255.0.0 eth0(或gw 192.168.21.1)

添加wlan0(无线网卡)进行全网络的访问,即在非内网情况下,使用wlan0进行访问。

# sudo route add default wlan0(或gw 192.168.20.1)

需要注意的是,如果使用网关确定,需要设置两个网卡的 默认网关不同;
这样设置还有一个弊端就是在访问外网时不能使用有线网卡,可能在没有WiFi的情况下还需要切换。

这样设置下来,双网卡内外分工就大功告成了!