如果一个主机绑定有多个 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
经过实验,测试也通过,显然修改路由表的方式要更好一些。
相关推荐
在现代信息技术领域,授时(Timing...综上所述,提高授时输出可靠性的时源选择和切换方法是一个复杂而关键的任务,涉及到多方面的技术和策略。通过深入理解这些知识点,可以为设计高效、可靠的授时系统提供坚实的基础。
这种系统的关键在于能够从多个时间源获取时间信息,并通过优化算法进行自动选择和校准,确保设备间的时间一致性。 1. **时间同步的重要性**: 在现代信息技术中,时间同步是不可或缺的一环。精确的时间同步能够...
在智能多时源自动优化方面,文档可能会详细讲解如何选择和评估多个时源,比如GPS、NTP服务器、原子钟等。这涉及到时源的稳定性和精度评估,以及如何通过算法动态调整权重,使得整个系统能够自动适应环境变化,提供最...
`arp_announce`则影响系统发送ARP请求时源IP地址的选择,不同级别的设置会影响网络通信的行为和效率。 此外,对于日志管理,keepalived的默认日志位于`/var/log/messages`,但可以通过修改`/etc/sysconfig/...
1. **网络设置**:包括TCP/IP地址和端口配置。 2. **组态数据标识**:如工程描述、时标、管理机地址等基本信息。 3. **装置总表**:包含9798装置连接的所有智能装置的详细信息,如地址、映射地址、型号、版本等。 4....
你可以指定协议栈的每一层(如IP、TCP、UDP等)的字段值,包括源地址、目标地址、端口号等关键信息,甚至可以设置一些特定的协议选项,以模拟特定的网络行为。 2. **接口选择**:该工具支持选择不同的网络接口进行...
同步工作流程中,任务管理中心和任务执行中心需正常运行,而当有多个源服务器或目标服务器时,可通过多对一或多对多的方式扩展同步功能。 配置方法部分介绍了用户界面的操作,包括任务管理、数据源服务器管理和编辑...
默认情况下,第一次同步时源数据库的数据会覆盖目标数据库。 2. **避免冲突的触发器**:某些数据库中的触发器可能包含 ALTER 语句,这与任何类型的复制都有冲突。需要确保移除或修改这些触发器,以免影响同步过程。 ...
本项目聚焦于一个具体的实例——“EDA电子时钟的设计”,它使用VHDL语言实现,精度可达毫秒级,这在很多实时应用中具有重要意义。下面将详细介绍这个设计过程以及涉及到的关键技术。 首先,VHDL是一种广泛应用的...
* 如果原镜像文件是“按文件”备份的,且在备份时源分区没有锁定,还原分区完成后,程序将自动对还原后的数据做必要的检查及更正。 四、结语 镜像文件还原分区是一种非常实用的恢复方法,可以快速恢复分区数据。...
在单点局部故障中,通常只需要一台保护装置的数据就能分析出故障情况,但多点系统故障则需要多个设备的时间数据进行综合分析。 文章由陈旭波、王雨峰和徐双凯等人撰写,他们来自许继电气股份有限公司,具有丰富的...
1. 初始化:设置一个数组dist,用于存储从源节点到各个节点的当前最短距离,初始时源节点的距离为0,其他所有节点的距离为无穷大。同时,创建一个visited数组,记录已访问过的节点。 2. 选择一个未访问且距离最小的...
综上所述,2007年上半年软件设计师考试涵盖了计算机科学与技术的多个方面,既包括了基础知识的选择题,也包括了要求综合应用所学知识的应用分析题。这些题目不仅考察了考生的基础理论知识,还考察了他们的问题解决...
·独立的多任务模式,可以同时对多个不同的文件夹进行不同的备份与同步操作 ·支持单向同步、双向同步、增量备份、完全备份等各种类型的文件同步与备份方式 ·具有多种任务自动触发模式,能实时、定时、间隙、...
创建一个优先队列(通常使用最小堆实现),将所有节点按距离排序,初始时源节点的距离为0,因此它位于队列顶部。 2. 迭代过程:每次从优先队列中取出当前距离最小的节点,然后检查其相邻的所有节点。如果通过当前...
尽管如此,开关电源也存在一些缺点,如输出纹波和噪声较高、瞬态响应慢、设计复杂(需要更多的外部组件和设计变量)。 **优点与缺点** 开关电源的主要优点是高效率,这意味着在电源转换过程中能量损失较小,这有助...
9、支持多频率备份选择,能按月、按周、按日、按时、间隔或手动地启动任务。 10、智能的增量备份恢复功能,能够恢复出与每次执行时源目录完全一样的目录结构和文件。 11、异地容灾备份功能:文件一旦备份,可以在...
- Dijkstra算法:维护一个优先队列,初始时源节点距离为0,其他节点距离为无穷大。每次从队列中取出距离最小的节点,更新其相邻节点的距离,然后将更新后的节点加入队列。 3. **单机调度问题(Single Machine ...