更流畅

2017-01-25 12:05             838人阅读             评论(0)             收藏              举报        

    
      
             分类:        
云计算(3)                                             

 
 

概述

IP 别名(IP Alias),辅助ip地址(Secondary IP Address)

IP alias 是由 ifconfig 程序来创建和维护的,而 secondary IP address 则是由 ip 程序来创建和维护的。ip addr add 创建的 secondary IP address 不能在 ifconfig -a 中看到,反过来,ifconfig 创建的 ethX:Y 却能在 ip addr show 中看到。实际上 ifconfig 只是取到第一个匹配的 IP 地址,而 ip addr show 却是完全取。

multi-homing, IP aliasing, Primary address 与 Secondary address 概念辨析

host address: A unique address assigned to a communications device in a computer. If a computer has multiple communications devices (e.g., Ethernet cards or modems), each of these devices will have its own unique address. This means that a host (computer or router) can be multi-homed, i.e., have multiple IP addresses. This can also be artificially created by assigning different IP addresses to the same device (called IP aliasing).

Linux 中为同一个物理网卡增加多个 IP 地址,以前通过 ifconfig 命令来创建和维护 IP alias,而在新的 IPROUTE2 中通过 ip address 命令来创建和维护 Primary address 与 Secondary address。 * 在每一个接口上可以配置多个 Primary 地址和多个 Secondary 地址。 * 对一个特定的网络掩码(例子中的网络掩码为/24),只能有一个 Primary 地址。

在路由代码中对许多事件和条件作出响应依赖于 IP 地址为 Primary 地址还是 Secondary 地址。下面给一些例子: * Primary addresses contribute to the entropy of the CPU that happens to run the code that applies the configuration. * 当删除一个 Primary 地址时,所有相关的 Secondary 地址也被删除。但通过 /proc 可以配置一个选项(net.ipv4.conf.*.promote_secondaries),在当前 Primary 地址被删除时可以将 Secondary 地址提升为 Primary 地址。 * 当主机为本地生成的流量选择源 IP 地址时,只考虑 Primary 地址。

原理

在 Linux 中,一个网卡可以有多个 IP,那么这多个 IP 有什么关系呢?其实这些 IP 组成了一个吊链结构,所谓吊链结构就是一些节点链接 成一条链,然后每个节点带有自己的一条链,如下图所示:

每个节点代表的 IP 地址标识一个网段,这个节点的 IP 就是这个网段的 Primary 地址,它下面所带的 IP 就是这个网段的 Secondary 地址,也就是说一个网卡可以带有各个节点所带链表长度之和个 IP 地址,而且这些 IP 不是线形的,而是上述的吊链结构。

配置多个 IP 地址时源 IP 的选择

如果一个主机绑定有多个 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 没有处于同一子网,则使用第二种算法。

默认情况下,如果 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
  • 1

Keepalived virtual_ipaddress 是否要配子网掩码

测试结果,添加 10.11.10.19/32 的类型是 Primary,添加 10.11.10.19/23 的类型是 Secondary。但是都没有影响到 Route 源地址。见后。

因此 Keepalived virtual_ipaddress 可不用配子网掩码。配置不带子网掩码的 IP 地址更简单。

测试:

IP Type Route
10.11.10.19/32 Primary None
10.11.10.19/23 Secondary None
10.11.10.19/24 Primary 10.11.10.0/24 dev eth0  proto kernel  scope link  src 10.11.10.19
# 原 IP 地址是 10.11.10.23/23
# ip -4 -o a s
33: eth0 inet 10.11.10.23/23 brd 10.11.10.1 scope global eth0
# ip route
10.11.10.0/23 dev eth0 proto kernel scope link src 10.11.10.23
169.254.0.0/16 dev eth0 scope link metric 1033 # 添加 IP 地址 10.11.10.19/32
# ip addr add 10.11.10.19 dev eth0
# ip -4 -o a s
33: eth0 inet 10.11.10.23/23 brd 10.11.10.1 scope global eth0
33: eth0 inet 10.11.10.19/32 scope global eth0
# ip route
10.11.10.0/23 dev eth0 proto kernel scope link src 10.11.10.23
# ip addr del 10.11.10.19/32 dev eth0 # 添加 IP 地址 10.11.10.19/24
# ip addr add 10.11.10.19/24 dev eth0
# ip -4 -o a s
33: eth0 inet 10.11.10.23/23 brd 10.11.10.1 scope global eth0
33: eth0 inet 10.11.10.19/24 scope global eth0
# ip route
10.11.10.0/24 dev eth0 proto kernel scope link src 10.11.10.19
10.11.10.0/23 dev eth0 proto kernel scope link src 10.11.10.23
# ip addr del 10.11.10.19/24 dev eth0 # 添加 IP 地址 10.11.10.19/23
# ip addr add 10.11.10.19/23 dev eth0
# ip -4 -o a s
33: eth0 inet 10.11.10.23/23 brd 10.11.10.1 scope global eth0
33: eth0 inet 10.11.10.19/23 scope global secondary eth0
# ip route
10.11.10.0/23 dev eth0 proto kernel scope link src 10.11.10.23
# ip addr del 10.11.10.19/23 dev eth0

.eof.

ip辅助和别名的区别的更多相关文章

  1. Oracle、MySQL和Sqlserver的事务管理、分页和别名的区别

    1.在mysql中事务默认是自动提交的,只有设置autocommit为0的时候,才用自己commit(commit--rollback回滚) 2.但是在oracle中必须自己commit;不然就只能结 ...

  2. IP TCP HTTP Socket的区别

    网络由下往上分为 物理层.数据链路层.网络层.传输层.会话层.表示层和应用层. 通过初步的了解,我知道IP协议对应于网络层,TCP协议对应于传输层,而HTTP协议对应于应用层, 三者从本质上来说没有可 ...

  3. [ZT]DAS\NAS\IP SAN\FC SAN之区别

    DAS:服务器直接后挂存储设备,最经济的一种结构. NAS:网络上直接挂接的存储设备,其实就是处于以太网上的一台利用NFS.CIFS等网络文件系统的文件共享服务器. SAN是网络上的磁盘,NAS是一个 ...

  4. Hadoop SSH+IP、SSH+别名 免密登录配置

    1.为什么要进行 SSH 无密码验证配置? Hadoop运行过程中需要管理远端Hadoop守护进程,在Hadoop启动以后,NameNode是通过SSH(Secure Shell)来启动和停止各个Da ...

  5. TCP/IP和UDP之间的区别(转载)

    在分析两者之间的区别之前,我们先搞清楚这两者的关系, TCP/IP协议簇  是一种网络控制协议,简单点说就是一种网络协议,我们网络中的计算机就是通过这套协议簇来进行数据通信的.这套协议簇里面包含了很多 ...

  6. 网址,域名,IP,主机名的区别

    域名 通常 Internet 主机域名的一般结构为:主机名.三级域名.二级域名.顶级域名(又称为一级域名).   二级域名及其以上级别的域名,统称为子域名,有多少个点就是几级域名   顶级域名分为两类 ...

  7. 数据库别名AS区别

    Oracle之别名小结 MySQL表别名.字段别名注意事项 字段别名:可加 as  ,也可以不加,可以加单|双引号,也可以不加: 表别名:可加 as ,也可以不加,但是一定不能加单|双引号! Orac ...

  8. Hadoop中ssh+IP、ssh+别名免秘钥登录配置

    1.为什么要进行 SSH 无密码验证配置? Hadoop运行过程中需要管理远端Hadoop守护进程,在Hadoop启动以后,NameNode是通过SSH(Secure Shell)来启动和停止各个Da ...

  9. Sqlserver 远程连接的 TCP/IP 和 Named Pipes的区别

    TCP/IP:  TCP/IP是 Internet 上广泛使用的通用协议.它与互连网络中硬件结构和操作系统各异的计算机进行通信.TCP/IP包括路由网络流量的标准,并能够提供高级安全功能.它是目前在商 ...

随机推荐

  1. Linux内核中锁机制之完成量、互斥量

    在上一篇博文中笔者分析了关于信号量.读写信号量的使用及源码实现,接下来本篇博文将讨论有关完成量和互斥量的使用和一些经典问题. 八.完成量 下面讨论完成量的内容,首先需明确完成量表示为一个执行单元需要等 ...

  2. powerdesigner学习笔记【转载】

    转自:http://blog.itpub.net/11968859/viewspace-620440/ 谢谢! 1.做CDM模型的时候,因为开始定义ITEM的时候,没有注意把NAME和CODE全定义成 ...

  3. Windows 7 64bit上安装Oracle Database 12c [INS-30131] 错误的解决方法

    Windows 7 64bit上安装Oracle Database 12c,出现以下错误: 解决方法: 第一步:控制面板>所有控制面板项>管理工具>服务>SERVER  启动 ...

  4. Android:不让 EditText 在 Activity 中自动弹出键盘

    通过属性 android:windowSoftInputMode 可以做到隐藏键盘的. android:windowSoftInputMode 属性有: stateUnspecified,stateU ...

  5. webBench&ad网站并发测试工具

    webBench 测试工具使用,网站上线前压力测试工具. ad测试工具

  6. 《Android源代码设计模式解析与实战》读书笔记(二十)

    第二十章.适配器模式 适配器模式是结构型设计模式之中的一个,它在我们的开发中使用率极高,比方ListView.GridView以及RecyclerView都须要使用Adapter. 1.定义 适配器模 ...

  7. css margin塌陷问题

    一.同级块级元素塌陷 html <h2> 同级块级元素塌陷 </h2> <div class="block1"> block1 </div ...

  8. Python 2.7.9 Demo - 019.01.CRUD oracle by cx_Oracle

    select #coding=utf-8 #!/usr/bin/python import cx_Oracle; conn = None; cursor = None; try: conn = cx_ ...

  9. 关于Parse字符串为时间一次被坑经历

    在Java代码中发现一个bug,就是本来更新为时间的内容更新为一些奇怪的内容,比如20819这种形式,本来更新的时间都是近期不会超过一年, 为什么会出现这种情况,非常奇怪,遂调试下代码,跟踪发现要匹配 ...

  10. Solr学习之四-Solr配置说明之二

    上一篇的配置说明主要是说明solrconfig.xml配置中的查询部分配置,在solr的功能中另外一个重要的功能是建索引,这是提供快速查询的核心. 按照Solr学习之一所述关于搜索引擎的原理中说明了建 ...