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

这篇具有很好参考价值的文章主要介绍了多网卡之指定程序访问特定网卡。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

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

直到某天我使用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。文章来源地址https://www.toymoban.com/news/detail-401980.html

到了这里,关于多网卡之指定程序访问特定网卡的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Linux Shell如果ping失败就重启网卡(详解)

    直接上脚本 -------------------------------------------------------------------------- #vi  /tmp/ping_check.sh #!/bin/bash IP=\\\"1.1.1.1\\\" PacketLoss=`ping -c 4 -w 4 1.1.1.1 | grep \\\'packet loss\\\' | awk -F \\\'packet loss\\\' \\\'{print $1}\\\' | awk \\\'{print $NF}\\\'|sed \\\'s/%//g\\\'` if  [$Packetloss -eq 100] then echo \\\"ping failed `date`\\\" /tmp/ping_check_failed.log systemc

    2024年02月12日
    浏览(35)
  • 配置特定 IP 地址走指定网关

    公司有两个日常上网用的路由器,分别接不同的两条网线,虽然都是电信的,但是一条偶尔会抽风,我的 VPS 会连不上,也就是挂在上面的 SS 无法使用。恰好这根线是公司接台式机的,也就是说平时上班偶尔会无法科学上网。 这对我来说几乎是无法忍的,面对不能科学上网的

    2024年02月02日
    浏览(42)
  • 筛选特定内容:Python中筛选DataFrame指定数据列包含特定内容的所有数据行

    筛选特定内容:Python中筛选DataFrame指定数据列包含特定内容的所有数据行 在数据处理和分析中,经常需要对数据进行筛选以便找到我们需要的信息。而在Python中,使用Pandas库中的DataFrame对象可以方便地对数据进行处理和分析。 下面我们来看如何使用contains()函数,筛选DataFr

    2024年02月14日
    浏览(37)
  • 1024程序员狂欢节有好礼 | 前沿技术、人工智能、集成电路科学与芯片技术、新一代信息与通信技术、网络空间安全技术

    🌹欢迎来到 爱书不爱输的程序猿 的博客, 本博客致力于知识分享,与更多的人进行学习交流 🚩🚩🚩 点击直达福利 一年一度的1024程序员狂欢节又到啦!成为更卓越的自己,坚持阅读和学习,别给自己留遗憾,行动起来吧! 那么,都有哪些好书值得入手呢?小编为大家整理

    2024年02月08日
    浏览(76)
  • CentOS 7系统开放指定或特定端口号命令

    在 CentOS 7 中,可以通过以下步骤来开放指定端口号: 1、使用 root 或具有管理员权限的用户登录到 CentOS 7 服务器。 2、使用防火墙管理工具 firewalld 进行端口开放。 firewalld 是 CentOS 7 默认的防火墙管理工具。 3、检查当前防火墙的状态,确保 firewalld 服务已经运行并且正常工作

    2024年02月16日
    浏览(97)
  • git commit指定要提交的特定目录、文件

    在 Git 中, git commit 命令用于将更改保存到本地仓库。默认情况下,它会将所有已修改的文件添加到提交中。然而,你可以使用不同的选项来指定要提交的目录或文件。 要指定要提交的特定目录,可以在 git commit 命令后面加上路径。例如,假设你有一个名为 my_directory 的目录

    2024年02月14日
    浏览(45)
  • 在 CentOS 7 中打开放指定或特定端口号

    在 CentOS 7 中,可以通过以下步骤来开放指定端口号: 使用 root 或具有管理员权限的用户登录到 CentOS 7 服务器。 使用防火墙管理工具 firewalld 进行端口开放。 firewalld 是 CentOS 7 默认的防火墙管理工具。 检查当前防火墙的状态,确保 firewalld 服务已经运行并且正常工作。可以使

    2024年02月15日
    浏览(61)
  • git合并指定commit——git合并某个特定的提交commit到指定的分支上

    git合并指定commit——git合并某个特定的提交commit到指定的分支上 1、应用场景: 在A分支上提交了一个commit,B分支也同样需要这个commit的代码,为了避免人工复制代码,可以用git的一些操作替代 2、操作步骤 1、在当前A分支(deploy/t),通过 git log 先找到A分支的commit代号( 简

    2023年04月08日
    浏览(71)
  • SQL server设置用户只能访问特定数据库、访问特定表或视图

    在实际业务场景我们可能需要开放单独用户给第三方使用,并且不想让第三方看到与业务不相关的表或视图,我们需要在数据库中设置一切权限来实现此功能: 1.创建用户名 选择默认数据库 服务器角色默认为public 用户映射选择指定数据库 打开需要开放权限的数据库,这里我

    2023年04月09日
    浏览(74)
  • Linux只允许特定IP访问特定端口

    目录 1、查看/开启/关闭防火墙 2、查看/开放/关闭端口 3、给指定的IP开放/关闭指定的端口 4、规则的持久化位置 5、其它命令 查看服务器的防火墙状态可使用如下命令: 开启和关闭防火墙命令如下:  当我们开启了linux的防火墙后,对该服务器的网络访问将受到控制。 可通过

    2024年02月12日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包