使用虚拟ip最多的场景可能是双机,往往结合着keepalived使用。其实没有双机软件也可以使用虚拟ip,下面介绍两种方法ip addr和ifconfig进行增删查虚拟ip。
ip addr
增加虚拟ip:
ip addr add ip/netmask dev 网口名称,比如ip addr add 192.168.88.0/24 dev eth0
查看虚拟ip:
ip addr show device_name或ip addr | grep eth0
ip addr =ip a= ip add list 查看网卡的ip和mac等,即使网卡处于down状态,也能显示出网卡状态,但是ifconfig查看就看不到。
删除虚拟ip:
ip addr del ip/netmask dev 网口名称,比如ip addr del 192.168.88.0/24 dev eth0
清空指定网卡的所有ip:
ip addr flush dev 接口
ip addr 操作时的注意事项:
说明:网卡配置的ip一般为Primary ip,虚拟ip一般为Secondary ip,当删除Primary ip时Secondary ip也有可能同时被删除。
先查看ipv4或ipv6相应网卡开启提升参数promote_secondaries为1,当Primary ip被删除后,它的第1个Secondary ip将继承为Primary ip。
# cat /etc/sysctl.conf | grep promote_secondaries
net.ipv4.conf.eth0.promote_secondaries=1
默认不开启,查不到结果则表明未开启。
Secondary ip和Primary ip标注如下
[root@localhost ~]# ip addr show eth0
2: eth0: mtu 1500 qdisc pfifo_fast qlen 1000
link/ether 00:19:b9:ef:44:8b brd ff:ff:ff:ff:ff:ff
# Primary ip
inet 172.16.0.230/24 brd 172.16.0.255 scope global eth0
inet 10.1.1.230/24 scope global eth0
# Secondary ip
inet 10.1.1.231/24 scope global secondary eth0
在linux中在一个网卡上配置的同一个网段的ip有Primary IP和Secondary address之分,如果不是同一个网段的ip总有一个是Primary IP,一条链上的吊链结构中上面的那条主链中的IP是Primary IP,Secondary address是主链结点的子链结点中的IP,一 旦主链上一个节点被删除了,那么它的子链也将不复存在,随之被删除。
可以通过调整一个参数来实现,当一个primary ip被删除时,如果它有secondary ip的话,那么它的第1个secondary地址(长子)成为primary地址,这样就显得很合理了,要不然在删除 primary地址的时候,如果有程序用secondary地址,要么延迟删除,要么程序崩溃。
开启的方法(主机重启后仍然生效的)
echo "net.ipv4.conf.eth0.promote_secondaries=1" >>/etc/sysctl.conf
ifconfig
ifconfig eth1:1 192.168.5.10/24 up:起别名
ifconfig eth0:1 192.168.8.5 netmask 255.255.255.0 up
ifconfig eth1:1 192.168.5.10/24 down : 删别名
ifconfig eth0:1 192.168.8.5 netmask 255.255.255.0 down
ifconfig eth1 up :启用eth1网卡
ifconfig eth1 down : 禁用eth1网卡,这种禁用是从数据链路层断掉,但是网络层ip还在,有时候能ping 通,大概率是缓存表没有更新
ifdown eth0 : 禁用网卡,删除了网络层ip
ip addr和ifconfig的区别以及虚拟ip存在的意义摘自大神的帖子
二者本质上没有什么区别,只是表述方式不同。如果你非常理解网络协议的原理以及网络的分层架构那么我想你就不会有这个问题,实际上每一个网卡设备都有一个mac地址,但是却可以有多个网络层地址,比如IP地址,然而这个事实无法很好地像用户提供操作接口,所以就引出了ip别名(IP aliases)和辅助ip(secondary IP addresses)的概念。其实很容易理解这个事实,按照分层的思想,下层总是为上层服务,也就是为上层提供舞台,上层利用下层的服务,而不必让下层知道自己的情况,如果一个拥有合理mac地址的网卡没有配置网络层地址(比如IP地址)这件事合理的话,那么为这个设备配置多个IP地址也是合理的,好比一个ip可以对应多个应用层端口一样,也就是说,下层对上层总是一对多的关系,在分层架构中这种关系是合理的。
比如一台机器上运行着一个代理服务器或者负载均衡服务,代理服务器或者负载均衡服务和主服务器要监听相同的端口,那么就可以用secondary ip来解决,只要需要在同一网段监听同一个端口的应用都是吊链中子链存在的原因,因此可以说,主链对外部或者说对下面链路层虚拟了多块网卡, 而子链向上层虚拟了多台机器,配置了吊链结构的linux主机如果说只有一块网卡,那么外部会认为它有多块网卡,对于内部,应用层会认为彼此在不同的主机 上,这就是效果。
添加地址可以通过2个用户空间程序搞定,一个是ifconfig,另一个是ip addr add,ifconfig是基于ioctl进行添加地址的,而ip是基于netlink进行添加地址的,不管哪一种方式都可以达到目的。但为何用ip addr add添加的ip地址用ifconfig看不到,而ifconfig设置的地址ip addr show却是可以看到?这个问题先放一放。
可靠性方面
ip addr增加的虚拟ip在物理主机或虚拟机重启后失效。
方法1:把命令加到/etc/rc.local里面
ip addr add 192.168.26.74/32 dev eth1
方法2:高可用双机倒换后进行虚拟ip的增加
方法3:在/etc/sysconfig/network-scripts添加网卡名字,比如ifcfg-eth0:0,DEVICE=eth0:1 ---->子接口名
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.109.108
NETMASK=255.255.255.0
参考资料
网友评论