现在的电脑一般都拥有双网卡,但这是否是一件好事呢?对于某些小白来说,可能并不是(比如我(●ˇ∀ˇ●))。
发现问题
拿到刚到手的树莓派,首先要做的肯定是配环境!但是在VNC连接树莓派时遇到了问题:
当我使用WIFI连接树莓派时,由于带宽限制,界面很卡,影响体验。
当我使用有线连接树莓派时,由于有线网卡的优先级高于无线网卡,导致树莓派只能浏览内网(也就是我笔记本的网络),如果使用笔记本共享外网的话只能使用DHCP自动分配IP,这样则会导致IP变化不方便我们连接 树莓派。
但是我明明有一个无线网卡连接外网啊!!!怎样才能把它利用起来,成了我要解决的问题。
原理探究
找了好久,终于发现了路由表这个神奇的东西,
百度百科这样说道:
在计算机网络中,路由表(routing table)或称路由择域信息库(RIB, Routing Information Base),是一个存储在路由器或者联网计算机中的电子表格(文件)或类数据库。路由表存储着指向特定网络地址的路径(在有些情况下,还记录有路径的路由度量值)。路由表中含有网络周边的拓扑信息。路由表建立的主要目标是为了实现路由协议和静态路由选择。
简单来讲,路由表可以规定发往何处的信息使用哪一个路由,也就是决定要发出的信息(对于计算机)或收到的信息(对于路由器)的下一跳是哪里。
在linux中配置路由表很简单,因为它全部被集成到了route这一个指令中。
首先我们来看路由表长什么样。
拿我的服务器举例,在终端中输入(sudo)route,可以看到:
其中Destination表示目标的IP地址;
Gateway表示选择下一跳网关IP地址(所有跨网段传输的信息均需要通过该网段的网关传输);
GenMask代表掩码,用于确定一个网段;
Flags是用于区分的标志位;
Iface是网卡设备的名称(可以使用(sudo)ifconfig来查看);
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
- route add -host 192.168.1.2 dev eth0 添加设备eth0为主机路由,主机IP为192.168.1.2
- route add -host 10.20.30.148 gw 10.20.30.40 添加网关10.20.30.40为主机路由
- route add -net 10.20.30.40 netmask 255.255.255.248 eth0 添加网络路由,网段为255.255.255.248
- route add -net 10.20.30.48 netmask 255.255.255.248 gw 10.20.30.41 同上,使用网关添加
- route add -net 192.168.1.0/24 eth1 添加网络路由,使用目标IP段/MASK位数形式
- route add default gw 192.168.1.1 添加默认路由
删除路由:route del
- route del -host 192.168.1.2 dev eth0 原理同上
- route del -host 10.20.30.148 gw 10.20.30.40
- route del -net 10.20.30.40 netmask 255.255.255.248 eth0
- route del -net 10.20.30.48 netmask 255.255.255.248 gw 10.20.30.41
- route del -net 192.168.1.0/24 eth1
- 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的情况下还需要切换。
这样设置下来,双网卡内外分工就大功告成了!