如果一个主机绑定有多个 IP地址,那么在被动响应和主动发起连接两种方式中,源 IP 地址的选择机制肯定是有所差异的。
主机在接收外部数据包,并发送响应数据包时,响应源地址显然就是客户端请求的地址,这是非常容易理解的,如客户端向主机的1.1.2.3:80 发起请求,那么主机响应数据包的源 IP 地址一定是 1.1.2.3 。
那么当主机对外主动发起请求时,数据包的源IP 地址如何选择?这个问题我们可能一般很少深入了解, 为了弄清楚这个问题,我发了不少时间,广泛查阅各种资料,目前得出的结论如下:
当一个主机创建IP 数据包时,必须选择正确的源IP地址,这是至关重要的,因为只有源地址正确,才能让接收者正确响应。如果源地址错误,则无法得到对端主机的任何回应。
Linux 2.2 选择源 IP 地址使用以下三种机制:
1. 应用程序可以通过bind(2) 系统调用,应用至 sendmsg(2) 调用上,并通过辅助数据对象 IP_PKTINFO ,从而显式指定源 IP 地址。在这种情况下,操作系统内核仅仅检查其源 IP 地址是否正确,否则产生相应的错误。
2. 如果应用程序没有指定源IP 地址,包含源 IP 的路由表将决定数据包源 IP 地址,通过设置 ip route 命令的 src 参数,从而指定源 IP 地址。如果路由表没有包含 src 属性,则使用主要 IP 地址。
3. 其它情况下内核搜寻绑定定数据包路由接口上的IP 地址, IPv6 选择第一个可用的 IP 地址。 IPv4 情况下,尽量选择与目标 IP 处于同一子网的源 IP ,如果目标 IP 与自己的所有 ip 没有处于同一子网,则使用第二种算法。
相应的参照文章:
http://linux-ip.net/gl/ip-cref/node155.html
http://serverfault.com/questions/12285/when-ip-aliasing-how-does-the-os-determine-which-ip-address-will-be-used-as-sour
默认情况下,如果Linux 的网卡有多个 IP 且位于不同的子网之中,如果数据包目标地址为某个子网中的 IP, 那么对应的与目标同子网的 IP 将会被使用。如果 eth0 有两个 IP 192.168.1.12/24, 10.1.1.1/8 ,那么到 10.0.0.0 子网的数据包的源地址将使用 10.1.1.1 。 当然可以使用 ip route 的 src 属性指定源址。
如果绑定的几个IP 处于同一个子网内,那么主要 IP 地址将被使用(如 eth0 接口上的 IP ) , 也可以使用 iptables 修改数据包的源地址实现之,如:
iptables -t nat -I POSTROUTING -o eth0 -d 1.2.3.4/0 -s 192.168.100.1 -j SNAT --to-source 192.168.100.2
原理分析及处理办法我们已经分析完毕,接下来使用实际的例子展示
Linux 主机绑定有以下几个 IP (网关为 192.168.0.1 )
eth0 192.168.0.250/24, eth0: 1 192.168.0.22/24, eth0:2 192.168.0.23/24
另外,绑定多个IP 可使用 ip addr add 命令,不产生子接口。
在上述案例中192.168.0.250 将成为默认主要 IP 。
目标:当此主机对外发起新连接时,源IP 地址使用 192.168.0.22, 不使用默认的 192.168.0.250 。
方法:修改路由表的源IP 属性
一. 查看系统的 ip 地址及路由表详细信息 ( 加粗字体是输入的内容 )
[root@localhost ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet 192.168.100.250/32 scope global lo
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
link/ether f4:6d:04:76:ca:98 brd ff:ff:ff:ff:ff:ff
inet 192.168.0.250/24 brd 192.168.0.255 scope global eth0
inet 172.16.25.1/24 scope global eth0
inet 192.168.0.22/24 scope global secondary eth0
inet 192.168.0.23/24 scope global secondary eth0
请注意 192.168.0.250 是 global 状态,而其它地址是 secondary 状态。
[root@localhost ~]# ip route
192.168.0.0/24 dev eth0 proto kernel scope link src 192.168.0.250
172.16.25.0/24 dev eth0 proto kernel scope link src 172.16.25.1
169.254.0.0/16 dev eth0 scope link
default via 192.168.0.1 dev eth0
注意以上输出,会发现到同一子网的路由的源IP 地址会使用主要 IP 地址。而到默认网关的路由没有指定源 IP (实际上会用与网关同一子网的主要 IP )。
修改路由表,让系统使用指定IP(192.168.0.22) 作为源址:
[root@localhost ~]# ip route change default dev eth0 src 192.168.0.22
[root@localhost ~]# ip route change to 192.168.0.0/24 dev eth0 src 192.168.0.22
[root@localhost ~]# ip route
192.168.0.0/24 dev eth0 scope link src 192.168.0.22
172.16.25.0/24 dev eth0 proto kernel scope link src 172.16.25.1
169.254.0.0/16 dev eth0 scope link
default dev eth0 scope link src 192.168.0.22
通过最后的输出,我们发现修改生效,然后使用其它主机实际测试一下。如果有任何疑惑,请联系zhangxugg@163.com 。
另外还有一种方式,使用iptables 修改源 IP 地址:
iptables -t nat -I POSTROUTING -o eth0 -d 0.0.0.0 /0 -s 192.168.0. 250 -j SNAT --to-source 192.168. 0.22
经过实验,测试也通过,显然修改路由表的方式要更好一些。
相关推荐
- **虚遥测、虚遥信、步位置等信息的合成**:能够将多个来源的信息合并成单一信号。 - **SCD文件导入**:支持读取SCD文件中的IED信息和URI信息。 - **CID或ICD文件转换**:可将CID或ICD文件转换为TXT测点文件。 - **...
这使得用户可以在多个网络环境下进行测试,以验证不同网络条件下的应用行为。 3. **发包速率控制**:xcap允许用户精确控制发送数据包的速率,这对于模拟真实网络环境或者进行压力测试非常有用。你可以设置每秒发送...
(1)CCANDISK适用于硬盘和软盘,可以一次指定多个磁盘或选用[/ALL]参数指定所有的磁盘; (2)可自动检测出磁盘中所发生的交叉连接、丢失簇和目录结构等逻辑上的错误,并加以修复。 (八)DEFRAG——重整磁盘...
wdaaaaaaaaaafwawfw
scratch少儿编程逻辑思维游戏源码-十字鸭子.zip
Android移动应用开发_ViewFlow自定义控件CircleFlowIndicator指示器网络图片加载缓存自动循环滚动手势滑动交互_横向循环平滑滚动广告条Banne
前端开发_基于jQuery和EasyUI框架_企业级Web应用UI组件库与后台管理系统模板_提供GPL开源版本和商业授权版本的双重授权模式_适用于快速构建响应式管理后台和复杂数据可
《C++编程实例100篇》是一本深入实践、极具价值的编程教程,它针对C++编程语言提供了丰富的实例,旨在帮助读者更好地理解和掌握C++的各项特性与编程技巧。这本书的经典之处在于它将理论与实践相结合,通过100个精心设计的编程实例,覆盖了C++的各个核心领域,包括基础语法、面向对象编程、模板、异常处理、STL(标准模板库)等。 我们来探讨C++的基础语法。C++是C语言的增强版,它保留了C语言的高效性和灵活性,并引入了类、对象和继承等面向对象编程概念。基础语法包括变量声明、数据类型、运算符、控制结构(如if语句、for循环、while循环)、函数的定义和调用等。在实例中,你可能会遇到如何编写简单的程序,如计算两个数的和,或者实现一个简单的猜数字游戏。 C++的面向对象编程是其一大特色。通过类和对象,你可以构建复杂的软件系统。类是对象的蓝图,它定义了对象的属性和行为。实例化一个类,就是创建一个具体的对象。继承允许你创建新的类,这些类从现有的类派生,共享其属性和方法,同时可以添加新的功能。多态性是面向对象的另一个关键特性,它使得不同类型的对象可以对同一消息作出不同的响应。这些概念在实例中会以各种形式展现,例如设计一个图形界面的类层次,或实现一个简单的模拟游戏。 接下来是模板,C++的模板功能让代码更加通用,可以处理不同类型的数据。模板分为函数模板和类模板,前者可以创建泛型函数,后者可以创建泛型类。通过模板,你可以编写出高效且灵活的代码,比如实现一个通用的排序算法。 异常处理是C++中用于处理程序运行时错误的机制。当程序出现异常情况时,可以抛出一个异常,然后在适当的点捕获并处理这个异常。这使得代码能够优雅地处理错误,而不是让程序崩溃。实例中可能会有涉及文件操作或网络通信时可能出现的异常处理示例。
scratch少儿编程逻辑思维游戏源码-忍者无限跑者.zip
少儿编程scratch项目源代码文件案例素材-战斗机游戏.zip
手工DIY行业_微信小程序云开发_手工坊预约管理系统_基于腾讯云开发技术的手工DIY行业线上线下结合解决方案_包含手工项目展示预约管理签到核销数据统计等完整功能_支持后台时段设置人
内容概要:本文档汇总了FFmpeg工具的多个实用命令示例,涵盖音频和视频处理的各个方面。包括但不限于:音频采样率转换、音频格式转为raw、查询音频文件时长与音量检测、调整音频音量大小、改变音频播放速度、视频逆序播放(针对无音频视频)、精准视频片段截取、音频片段截取、视频与音频合并处理、调整视频宽高比等。每个命令都提供了具体的参数设置方法; 适合人群:音视频编辑爱好者、多媒体处理领域的初学者或有一定经验的技术人员; 使用场景及目标:①在音频处理方面,可以完成从格式转换到音质调整的任务;②在视频处理上,能够实现基本的剪辑操作如切割、翻转、合并等;③为用户提供了一站式的解决方案,帮助用户快速掌握FFmpeg命令行工具的基本用法,提高工作效率; 阅读建议:本指南以命令实例为主,建议读者结合实际需求选择相应的命令进行尝试,在实践中理解各个参数的作用并灵活运用。
一、毕业设计的技术背景和设计依据 计算机硬盘驱动器作为一种存储数据信息的设备,在目前的计算机系统中起着不可替代的作用,读写的快慢对整个计算机系统的性能无疑占有重要地位。硬盘式电子计算机磁记录机构中最为精密的一类微机电系统设备,它对振动的敏感性是由其结构决定的,而其控制尚未很好的解决,针对硬盘展开建模及控制有着重要的实际应用价值。 二、毕业设计的任务 现代硬盘一般有 1 - 5 个盘片,以常见的 3.5 英寸硬盘为例,盘片直径约为 95mm,厚度约为 0.635mm。磁头数量通常与盘片数量相关,每面盘片有一个磁头,比如一个 3 盘片的硬盘就有 6 个磁头。缓存大小可能为 32MB、64MB 或 128MB 等,如某普通硬盘缓存为 64MB,电机功率一般在 2 - 5W,像转速为 7200RPM(转每分钟)的电机功率约 3W。数据写入时,磁头在电机带动下,以平均寻道速度约 10 - 15m/s 定位磁道。以一块顺序写入数据的硬盘为例,当写入连续大文件,如 1GB 的视频文件时,在 SATA3.0 接口下,理论传输带宽为 6Gb/s(约 750MB/s),实际可达 500 - 600MB/s。读取时,磁头感应盘片磁场变化,如读取小文件(1MB 大小),若磁头寻道距离平均为 1000 个磁道,每次寻道时间约 8 - 12ms,读取速度会因寻道而下降到 10 - 20MB/s。 本设计选取硬盘驱动器作为研究对象,假设电机扭矩为 0.3N・m,盘片转动惯量为 0.003kg・m²,轴承摩擦力矩为 0.03N・m。在稳定旋转阶段,转速波动范围设为额定转速的 ±0.5%,即 ±36RPM。首先通过对该系统分析建立了其物理模型,然后针对以音圈电机作为伺服机构的硬盘磁头定位伺服系统的性能要求,对音圈电机的控制设计采用三种控制器方案,即极点配置法、PID控制方法、线性二次型调节器方法,分别比较分
scratch少儿编程逻辑思维游戏源码-猫猫冲刺.zip
大数据处理_全文搜索引擎_ElasticSearch中文发行版_基于最新稳定版ElasticSearch预集成中文分词插件及常用配置的开箱即用解决方案_专为中文开发者优化的免配置高
离散数学_逻辑演算系统_真值表生成器_主范式计算器_最简范式求解器_王浩算法实现_等值演算工具_命题逻辑分析平台_基于Web的交互式逻辑运算系统_用于离散数学教学与研究的综合性逻辑
商业智能_SpringBoot_MQ_AIGC_React_智能数据分析_可视化图表_自动分析_数据集处理_用户诉求解析_数据降本增效_基于人工智能的商业智能分析平台_通过自然语言
少儿编程scratch项目源代码文件案例素材-爪猫小车.zip
少儿编程scratch项目源代码文件案例素材-拽猫挥剑.zip
kuishou68_neteaseMusic_32152_1745866029873