概述
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 地址使用以下三种机制:

应用程序可以通过 bind(2) 系统调用,应用至 sendmsg(2) 调用上,并通过辅助数据对象 IP_PKTINFO ,从而显式指定源 IP 地址。在这种情况下,操作系统内核仅仅检查其源 IP 地址是否正确,否则产生相应的错误。
如果应用程序没有指定源 IP 地址,包含源 IP 的路由表将决定数据包源 IP 地址,通过设置 ip route 命令的 src 参数,从而指定源 IP 地址。如果路由表没有包含 src 属性,则使用主要 IP 地址。
其它情况下内核搜寻绑定定数据包路由接口上的 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

# 原 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

参考
从ip addr add和ifconfig的区别看linux网卡ip地址的结构
转载 ip alias and secondary ip address
有关IP aliasing, Primary address和Secondary address
配置多个ip地址时源ip的选择
.eof.
--------------------- 
作者:xiewen99 
来源:CSDN 
原文:https://blog.csdn.net/xiewen99/article/details/54729112 
版权声明:本文为博主原创文章,转载请附上博文链接!

IP 别名和辅助 IP 地址相关推荐

  1. linux ip别名和辅助ip地址

    转:https://blog.csdn.net/xiewen99/article/details/54729112?utm_source=itdadao&utm_medium=referral ...

  2. Heartbeat VIP/IP 与 别名/辅助IP

    转载自:https://www.jianshu.com/p/d9a0a4d82047 真实IP 真实IP又被称为管理IP,一般是配置在物理网卡上的实际IP,这可以看作你本人的姓名,如:张三在负载均衡及 ...

  3. linux centos7怎么绑定多ip,003 Linux配置多ip绑定的方法 | ip别名(以CentOS7为例 )

    方式一: 缺点:每一个ip不知道对应那个网络名 1)  vi /etc/sysconfig/network-scripts/ifcfg-default # 有可能你的不是: ifcfg-default ...

  4. Linux学习之CentOS(二十九)--Linux网卡高级命令、IP别名及多网卡绑定

    本篇随笔将详细讲解Linux系统的网卡高级命令.IP别名以及Linux下多网卡绑定的知识 一.网卡高级命令 在之前的一篇随笔里Linux学习之CentOS(九)--Linux系统的网络环境配置,详细讲 ...

  5. linux如何加辅助ip,如何在 Ubuntu 系统中添加一个辅助 IP 地址

    Linux 管理员应该意识到这一点,因为这是一项例行任务.很多人想知道为什么我们需要在服务器中添加多个 IP 地址,以及为什么我们需要将它添加到单块网卡中?我说的对吗? 你可能也会有类似的问题:在 L ...

  6. linux 辅助ip地址到文本,技术|如何在 Ubuntu 系统中添加一个辅助 IP 地址

    Linux 管理员应该意识到这一点,因为这是一项例行任务.很多人想知道为什么我们需要在服务器中添加多个 IP 地址,以及为什么我们需要将它添加到单块网卡中?我说的对吗? 你可能也会有类似的问题:在 L ...

  7. ip别名删除第一个,其余别名就自动删除的分析

    上课作业有一个脚本,是批量添加ip别名,批量删除ip别名,脚本如下 [root@loadblance scripts]# cat ip.sh #!/bin/bash function up {for ...

  8. IP别名与多网卡绑定(RHEL5/RHEL6)

    RHEL6的网络管理与RHEL5的有比较大的改变. 虽然在RHEL5.6中均安装有NetworkManager,在RHEL5中2.3.4.5级别中默认是不启用的. 但在RHEL6中,默认是启用的,Ne ...

  9. linux系统子接口配置文件,Linux网卡绑定、子接口-IP别名

    查看网卡线缆状态: mii-tool eth0 查看网卡底层信息: ethtool eth0 ethtool -i eth0   查看网卡驱动信息 ethtool -S eth0  查看网卡状态统计信 ...

最新文章

  1. spring 获取配置文件的值
  2. 图的顺序存储结构及C语言实现
  3. 跳转控制语句 break || continue || goto
  4. 字符统计2_JAVA
  5. opencv阈值化(五)
  6. 累计连续签到设计和实现
  7. python二维列表做参数_python sum函数iterable参数为二维list,start参数为“[]”该如何理解...
  8. sum怎么用python_python sum()函数和.sum(axis=0)函数的使用
  9. PTA最大子列和问题
  10. 呼叫 :邓伦粉丝!手机桌面壁纸来喽
  11. OpenShift 4 - 用内置的Prometheus监控应用
  12. mysql 单表多级查询_mysql单表与多表查询
  13. go token验证_GitHub - goflyfox/gtoken: 基于gf框架的token插件,通过服务端验证方式实现token认证;...
  14. Silverlight 简明教程(3) -- 资源、样式控制、视觉状态以及部署
  15. php从入门到精通分享,PHP从入门到精通学习路线图分享
  16. cad打开a3样板图形_cad a3图框下载-cada3标准图框模板 dwg版 - 河东下载站
  17. python英文分词统计词频_Python 分词并统计词频
  18. c语言延时函数的理解
  19. 如何使用多种方法在 Mac 上截屏?
  20. MacBook Pro输入法的技巧你知多少

热门文章

  1. VS集成Qt环境搭建
  2. 贴片电容COG、NPO 、X7R、X5R、Y5V介质区别
  3. web前端开发基础知识_薪资30K+的web前端怎么做到的?
  4. Hadoop集群搭建(三台Linux服务器)
  5. python word保存图_python实现word内图片的提取
  6. 主成分分析应用之主成分回归
  7. 深入理解23种设计模式(14) -- 访问者模式
  8. 刚刚,华为宣布决定起诉美国政府
  9. 前进的方向 没有方向就是蒙着眼睛的驴子原地踏步 一年经验混十年
  10. 省市县数十万数据集PM2.5面板数据(更新至2020年)