更流畅

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. [iOS]过渡动画之高级模仿 airbnb

    注意:我为过渡动画写了两篇文章:第一篇:[iOS]过渡动画之简单模仿系统,主要分析系统简单的动画实现原理,以及讲解坐标系.绝对坐标系.相对坐标系,坐标系转换等知识,为第二篇储备理论基础.最后实现 Ma ...

  2. Linux中断 - tasklet

    一.前言 对于中断处理而言,linux将其分成了两个部分,一个叫做中断handler(top half),属于不那么紧急需要处理的事情被推迟执行,我们称之deferable task,或者叫做bott ...

  3. Python3 列表 clear() 方法

    描述 Python3 列表 clear() 方法用于清空列表,类似于 del a[:]. 语法 clear() 方法语法: L.clear() 参数 无. 返回值 该方法没有返回值. 实例 以下实例展 ...

  4. WeUI中的Css详解

      WeUI是微信Web服务开发的UI套件, 目前包含12个模块 (Button, Cell, Toast, Dialog, Progress, Msg, Article, ActionSheet, ...

  5. struts2每次访问都会创建一个新的session

    1.第一次 项目在测试过程中,突然发现登陆之后再去访问其他菜单时都会提示未登录: 查看日志之后发现是因为很多次请求时都会自动创建一个新的session,这就费解了, 因为之前也没改动什么session ...

  6. jeecg 定时任务配置用法

    方式一: 1.定时任务配置文件 src/main/resources/spring-mvc-timeTask.xml 2.新定义一个定时任务举例 a.配置定时任务,配置文件spring-mvc-tim ...

  7. python 异步编程

    Python 3.5 协程究竟是个啥 Yushneng · Mar 10th, 2016 原文链接 : How the heck does async/await work in Python 3.5 ...

  8. Spring Boot(一):初步认识

    简介 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置 ...

  9. C 多级指针

    C多级指针 *p                      -----> &p1 *(*p)                   ----->*(&p1) = &p ...

  10. [Python]南邮OJ代码备份爬虫

    之前看过Python学习的经验,说以project为导向学习. 自己分析了一下,一般接触Python的都有一定的其它语言基础,对于程序设计的基本逻辑,语法都有一个大概的了解.而Python这样的脚本语 ...