多网卡之指定程序访问特定网卡

如果当时有好好听计算机网络这门课,那下面聊的东西非常简单。

起因来自一次驻场开发,所在工作环境需要用网线连接虚拟云桌面进行操作,于是我就一会插网线云桌面开发,又一会手机热点腾讯会议,偶尔就会有一个问题,就是同时连着无线和有线的时候,要么无法访问外网要么云桌面就会断开,实在是麻烦。

当时我的想法就是如果能控制不同的程序使用不同的网络就好了,所以我也搜索了一下,但是才疏学浅也没有抱着什么希望所以简单搜了下便放弃了。

直到某天我使用virtualBox创建虚拟机的时候,在网络配置界面发现了有两个网卡可以选择,很明显分别是线网卡和无线网卡,于是我创建两个虚拟机,分别选取不同网卡,发现可在两个虚拟机下同时访问外部网络和云桌面系统。
在我看来虚拟机也是一个程序,它是怎么做到使用指定的网卡呢?

于是一个的名词就来了:路由。

什么是路由?

路由(routing)是指分组从源到目的地时,决定端到端路径的网络范围的进程 。路由工作在OSI参考模型第三层——网络层的数据包转发设备。路由器通过转发数据包来实现网络互连。虽然路由器可以支持多种协议(如TCP/IP、IPX/SPX、AppleTalk等协议),但是在我国绝大多数路由器运行TCP/IP协议。路由器通常连接两个或多个由IP子网或点到点协议标识的逻辑端口,至少拥有1个物理端口。路由器根据收到数据包中的网络层地址以及路由器内部维护的路由表决定输出端口以及下一跳地址,并且重写链路层数据包头实现转发数据包。路由器通过动态维护路由表来反映当前的网络拓扑,并通过网络上其他路由器交换路由和链路信息来维护路由表。以上来自百度百科。

举个通俗的例子就好比快递投递的过程,一个包裹会根据省市区街道小区最终放到你家门口,放在网络世界中,数据也要有他的路线指引,而路由就是这个路标。

路由器查看了数据包的目的协议地址后,确定是否知道如何转发该包,如果路由器不知道如何转发,通常就将之丢弃。如果路由器知道如何转发,就把目的物理地址变成下一跳的物理地址并向之发送。下一跳可能就是最终的目的主机,如果不是,通常为另一个路由器,它将执行同样的步骤。当分组在网络中流动时,它的物理地址在改变,但其协议地址始终不变。

那么路由是怎么匹配转发的呢?一般来说就是通过路由表进行最长匹配原则,路由表中会对ip进行分段划分,每一个ip段都对应的下一跳的网络地址,随着一级级的路由跳转,最终将数据发送到请求地址。同样在你的系统中也有一个路由表,可以理解为你的数据投递过程中的第一站。

如何查看系统路由表,因为我的是ubunu系统,因此下面都是linux系统的操作指令,当然window也是异曲同工。
查看路由表

route -n 
ubuntu:~$ route -n
内核 IP 路由表
目标             网关            子 网掩码        标志   跃点   引用     使用  接口
0.0.0.0         192.168.0.1     0.0.0.0         UG    600    0        0  eth1
0.0.0.0         146.10.0.1      0.0.0.0         UG  20600    0        0  eth2
192.168.146.1   0.0.0.0         255.255.255.0   U     600    0        0  eth1

隐去了真实信息,上面是我自己编写的一个路由表,其中目标ip和子网掩码会计算出一个ip段,如果当前请求地址处于这个ip段,那么数据包将会发到对应的接口,也就是下一跳的地址中,其中192.168.146.1 就是我的虚拟机的ip,当我创建了一个这个虚拟机的时候

所以我现在的目标就是当使用云桌面的时候,让数据包转发至有线网卡中,而其他的请求转发至无线网卡中。比如现在云桌面的地址是147.20.0.111,那么如何在请求这个ip的时候让其跳转到有线网卡eth2中呢?

于是第二个的名词就来了:子网掩码(CIDR)。

什么是子网掩码?

子网掩码(subnet mask)又叫网络掩码、地址掩码、子网络遮罩,它用来指明一个IP地址的哪些位标识的是主机所在的子网,以及哪些位标识的是主机的位掩码。子网掩码不能单独存在,它必须结合IP地址一起使用。

通俗来说就是一种ip匹配规则,再直白点就是ip世界的正则表达式写法,(只是为了方便理解)。
具体如何计算,大家可以自行检索相关资料,在这里我简单说下计算规则。

比如一个ip 1.1.1.1,他的二进制如下:
00000001 00000001 00000001 00000001
下面是子网掩码
255.255.255.0
他的二进制为
11111111 11111111 11111111 00000000 
通过IP地址的二进制格式与子网掩码的二进制格式进行and运算,相等,说明处于同一个子网,可以直接通信。
如果这句话还不明白,可以这么理解:根据子网掩码从左到右,当等于1的时候,表示ip对应的位置不可变,等于0的时候,代表可变1或者0,因此通过上面的计算ip段为
00000001 00000001 00000001 00000000 
00000001 00000001 00000001 11111111
转换为十进制
1.1.1.0
1.1.1.255
这种情况下其中0是网络地址,255为广播地址,因此实际可用ip为1.1.1.1-1.1.1.254。

那么接下来我打算将147.20.0.0-147.20.255.255ip段指向网卡eth2,因此我需要设置ip 146.20.0.0的子网掩码为255.255.0.0,于是执行以下命令

#首先要删除原来网卡自动配置的路由表配置,具体可搜索route del用法
sudo route del -net 0.0.0.0 gw 146.1.224.1 
#接着增加新的路由表配置
sudo route add -net 146.15.0.0/16  gw 146.1.224.1 
#gw 是gateway网关的意思,可通过网卡属性查看网关地址。

在这里使用了146.20.0.0/16的形式,这是子网掩码的另一种表达方式:CIDR;

CIDR(Classless Inter-Domain Routing,无类域间路由选择)它消除了传统的A类、B类和C类地址以及划分子网的概念,因而可以更加有效地分配IPv4的地址空间。它可以将好几个IP网络结合在一起,使用一种无类别的域际路由选择算法,使它们合并成一条路由从而较少路由表中的路由条目减轻Internet路由器的负担。

通俗来说就是子网掩码的另一种形式,但是这种形式更加有效划分网络地址。可以在 https://ip.liangwei.cc/network.html 这个网站计算CIDR值。

到此设置完路由表,打开程序实测云桌面、外部网络同时可用。
现在想来这些其实是大学期间计算机网络很基础的知识,如果不是因为工作中遇到这个问题,估计我没有机会重拾复习。而作为一名软件研发,不能仅停留来业务层面的CURD。

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值