LinuxVS/DR+heartbeat+ldirectory 实现高可用负载均衡服务

系统环境CentOS 5.4

# uname -r

2.6.18-128.el5

IP分配:

client eth0 10.10.10.10

ldrictory eth1 10.10.10.1

eth0 192.168.77.222

realserver1 eth0 192.168.77.221

realserver2 eth0 192.168.77.225

LVS简介

开发者:

章文嵩(博士) 个人主页:http://zh.linuxvirtualserver.org

三种模式

VS/NAT VS/DR VS/TUN

十种算法:

Fixed echeduling(rr wrr dh sh)===========静态调度方法

1. 轮叫 Round-robin (RR)

调度器通过"轮叫"调度算法将外部请求按顺序轮流分配到集群中的真实服务器上,它均等地对待每一台服务器,

而不管服务器上实际的连接数和系统负载。

2. 加权轮叫 Weithted round-robin (WRR)

调度器通过"加权轮叫"调度算法根据真实服务器的不同处理能力来调度访问请求。这样可以保证处理能力强的服务器处理更

多的访问流量。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值

3. 目标地址散列 Destination hashing (DH)

"目标地址散列"调度算法根据请求的目标IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器

是可用的且未超载,将请求发送到该服务器,否则返回空。

4. 源地址散列 Source hash (SH)

"源地址散列"调度算法根据请求的源IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可

用的且未超载,将请求发送到该服务器,否则返回空。

Dynamic Scheduling (lc wlc sed nq lblc lblcr)======================动态调度方法

其算法是:活动链接数x256+非活动链接数 将client请求分给数值小的服务器。

1. 最少链接 Least-connect (LC)

调度器通过"最少连接"调度算法动态地将网络请求调度到已建立的链接数最少的服务器上。如果集群系统的真实服务器具有相近

的系统性能,采用"最小连接"调度算法可以较好地均衡负载。

2. 加权最少链接 Weighted least-connection (WLC) (Default)

在集群系统中的服务器性能差异较大的情况下,调度器采用"加权最少链接"调度算法优化负载均衡性能,具有较高权值的服务器

将承受较大比例的活动连接负载。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。

3. 最短期望连接Shortest Expected delay(SED)

对wlc的改进,在wlc算法的基础上给权重值加一,主要用来针对某个服务器活动链接数值为0情况

4. 从不排队Never Quene(NQ)

基于SED算法的改进,不排队

5. 基于局部性的最少链接locality-based least-connection (LBLC)

基于局部的最少连接

6. 带复制的基于局部性最少链接 Locality-Based Least Connectionswith Replication (LBLCR)

三种IP负载均衡技术的优缺点比较:

杂项 VS/NAT VS/TUN VS/DR

服务器操作系统 任意 支持隧道 多数(支持Non-arp )

服务器网络 私有网络 局域网/广域网 局域网

服务器数目(100M网络) 10-20 100 多(100)

服务器网关 负载均衡器 自己的路由 自己的路由

效率 一般 高 最高

查看ip_vs模块:

检测系统是否已经加载lvs模块,默认在2.6.*以上的版本中已经加载了lvs模块。

可以用modprobe -l命令查看,如果没有的话需对内核打补丁,或者升级内核到2.6.18以上

# modprobe -l | grep ip_vs

/lib/modules/2.6.18-128.el5/kernel/net/ipv4/ipvs/ip_vs.ko

/lib/modules/2.6.18-128.el5/kernel/net/ipv4/ipvs/ip_vs_dh.ko

/lib/modules/2.6.18-128.el5/kernel/net/ipv4/ipvs/ip_vs_ftp.ko

/lib/modules/2.6.18-128.el5/kernel/net/ipv4/ipvs/ip_vs_lblc.ko

/lib/modules/2.6.18-128.el5/kernel/net/ipv4/ipvs/ip_vs_lblcr.ko

/lib/modules/2.6.18-128.el5/kernel/net/ipv4/ipvs/ip_vs_lc.ko

/lib/modules/2.6.18-128.el5/kernel/net/ipv4/ipvs/ip_vs_nq.ko

/lib/modules/2.6.18-128.el5/kernel/net/ipv4/ipvs/ip_vs_rr.ko

/lib/modules/2.6.18-128.el5/kernel/net/ipv4/ipvs/ip_vs_sed.ko

/lib/modules/2.6.18-128.el5/kernel/net/ipv4/ipvs/ip_vs_sh.ko

/lib/modules/2.6.18-128.el5/kernel/net/ipv4/ipvs/ip_vs_wlc.ko

/lib/modules/2.6.18-128.el5/kernel/net/ipv4/ipvs/ip_vs_wrr.ko

我们额外还需要下载ipvs管理工具ipvsadm

http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.25.tar.gz

安装ipvsadm

## ln -sv /usr/src/kernels/2.6.18-128.el5-i686/ /usr/src/linux =====一定要做,不然报错,

详细请看README

# tar -zxvf ipvsadm-1.25.tar.gz

# make && make install

NAT模式:

架构图:

clip_image002

directory配置:

[root@node1 ~]# service iptables stop ========================保险期间realserver,ldirectory防火墙均需关闭,

因为iptables和ipvsadm公用netfilter,会冲突

Flushing firewall rules: [ OK ]

Setting chains to policy ACCEPT: mangle [ OK ]

Unloading iptables modules: [ OK ]

# echo 1 > /proc/sys/net/ipv4/ip_forward

# ipvsadm -C

# ipvsadm -A -t 10.10.10.1:80 -s wrr

# ipvsadm -a -t 10.10.10.1:80 -r 192.168.77.221:80 -w 1 -m

# ipvsadm -a -t 10.10.10.1:80 -r 192.168.77.225:80 -w 3 -m -m表示nat模式一定要加,默认是DR模式

# ipvsadm -L -n

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

-> RemoteAddress:Port Forward Weight ActiveConn InActConn

TCP 10.10.10.1:80 wrr

-> 192.168.77.225:80 Masq 3 0 0

-> 192.168.77.221:80 Masq 1 0 0 Masq 会是route

realserver配置:

1.安装web服务,保证web正常访问

2.realserver需将网关指向directory即可

测试:

在client上 http://10.10.10.1 测试

DR模式:

这里我们将HA和HL放到一块来做,即:VS/DR+heartbeat高可用负载均衡的实现

架构图:

clip_image004

开始之前我们需要提到几个概念和注意的问题:

1.arp隐藏

2.为什么网上所有的VS/DR配置文档中,rip vip dip都是在一个网段中(我暂时没有找到,那位找到的请一定给我个网址,ths)

++++++++++++++++++++++++++++++++++++++++++++++++++++

1.arp隐藏的原理

在LVS的DR模式下,有一个必须要处理的问题就是real server上的ARP响应问题。其实,这个问题不只是LVS,其他的L4 Switch方案比如Foundry的ServerIron,也需要设置real server上的ARP响应。因为这是这种方案的结构决定的。

根据LVS官方说明,在LVS 的DR模式下,前端的director接收到用户请求以后,director根据后端real server的负载情况,动态地选择一台real server,不修改也不封装IP报文,而是将数据帧的MAC地址改为选出的real server的MAC地址,再将修改后的数据帧在与服务器组的局域网上发送。因为数据帧的MAC地址是选出的real server,所以被选出来的那台real server肯定可以收到这个数据帧,从中可以获得该IP报文。当服务器发现报文的目标地址VIP是在本地的网络设备上,服务器处理这个报文,然后根据路由表将响应报文直接返回给客户,客户认为得到正常的服务,而不会知道是哪一台服务器处理的。

VS/DR负载调度器也只处于从客户到服务器的半连接中,按照半连接的TCP有限状态机进行状态迁移。

从上边的LVS DR工作原理可以看到一个客户端计算机发送一个ARP广播到LVS-DR集群,因为Director和集群节点(真实服务器1)都是连接到相同的网络上的,它们都会接收到ARP广播“是谁的VIP1?”,这个时候我们希望的是只有前端的director来对用户进行响应,其他real server不应该响应用户直接的ARP包。(参考下边两幅引用51cto网站的图)

因此必须对real server进行一定的处理,使其不响应VIP接口上的ARP请求。在2.6系列的内核中,采用的方式是设置arp_announce和arp_ignore这两个内核参数。

arp_ignore=1,系统只回答目的IP为是本地IP的包。也就是对广播包不做响应。

arp_announce=2,系统忽略IP包的源地址(source address),而根据目标主机(target host),选择本地地址。

而且凡是能收到对VIP ARP广播报文的网口,都需要设置。设置的方法是修改/etc/sysctl.conf文件

永久的:

net.ipv4.ip_forward = 1

net.ipv4.conf.lo.arp_ignore = 1

net.ipv4.conf.lo.arp_announce = 2

net.ipv4.conf.all.arp_ignore = 1

net.ipv4.conf.all.arp_announce = 2

临时:

echo 1 > /proc/sys/net/ipv4/cconf/lo/arp_ignore

echo 2 > /proc/sys/net/ipv4/cconf/lo/arp_announce

echo 1 > /proc/sys/net/ipv4/cconf/all/arp_ignore

echo 2 > /proc/sys/net/ipv4/cconf/lall/arp_announce

参数的具体含义:

arp_announce : INTEGER

默认为0

对网络接口上本地IP地址发出的ARP回应作出相应级别的限制:

确定不同程度的限制,宣布对来自本地源IP地址发出Arp请求的接口

0 - (默认) 在任意网络接口上的任何本地地址

1 -尽量避免不在该网络接口子网段的本地地址. 当发起ARP请求的源IP地址是被设置应该经由路由达到此网络接口的时候很有用.此时会检查来访IP是否为所有接口上的子网段内ip之一.如果改来访IP 不属于各个网络接口上的子网段内,那么将采用级别2的方式来进行处理.

2 - 对查询目标使用最适当的本地地址.在此模式下将忽略这个IP数据包的源地址并尝试选择与能与该地址通信的本地地址.首要是选择所有的网络接口的子网中外出访问子网中包含该目标IP地址的本地地址. 如果没有合适的地址被发现,将选择当前的发送网络接口或其他的有可能接受到该ARP回应的网络接口来进行发送

all/ 和{interface}/ 下两者同时比较,取较大一个值生效.

提高约束级别有益于从指定的目标接受应答,而降低级别可以给予更多的arp查询者以反馈信息(关于arp代理这一段我普遍翻译地不好,去啃一下tcp/ip bible的卷一,然后再翻译吧)

arp_ignore : INTEGER

默认为0

定义对目标地址为本地IP的ARP询问不同的应答模式

0 - (默认值): 回应任何网络接口上对任何本地IP地址的arp查询请求(比如eth0=192.168.0.1/24,eth1=10.1.1.1/24,那么即使 eth0收到来自10.1.1.2这样地址发起的对10.1.1.1 的arp查询也会回应--而原本这个请求该是出现在eth1上,也该有eth1回应的)

1 - 只回答目标IP地址是来访网络接口本地地址的ARP查询请求(比如eth0=192.168.0.1/24,eth1=10.1.1.1/24,那么即使 eth0收到来自10.1.1.2这样地址发起的对192.168.0.1的查询会回答,而对10.1.1.1 的arp查询不会回应)

2 -只回答目标IP地址是来访网络接口本地地址的ARP查询请求,且来访IP必须在该网络接口的子网段内(比如 eth0=192.168.0.1/24,eth1=10.1.1.1/24,eth1收到来自10.1.1.2这样地址发起的对192.168.0.1 的查询不会回答,而对192.168.0.2发起的对192.168.0.1的arp查询会回应)

3 - 不回应该网络界面的arp请求,而只对设置的唯一和连接地址做出回应(do not reply for local addresses configured with scope host,only resolutions for global and link addresses are replied 翻译地似乎不好,这个我的去问问人)

4-7 - 保留未使用

8 -不回应所有(本地地址)的arp查询

all/ 和{interface}/ 下两者同时比较,取较大一个值生效.

2.rip vip dip都是在一个网段中,其实没有必要,因为linux内核默认是不转发源IP是自己的包,我们需要打forward_shared补丁包,

遗憾的是我没有坚持下来,呵呵,带日后有时间了再杀他一回。呵呵

参考文章:

http://www.cnblogs.com/ljkeke/archive/2009/02/17/1392693.html

可以在调度器上使用DR方式,真实服务器使用私有地址并在逻辑设备上配置虚拟IP地址,用调度器作网关访问公网。

但是,linux内核发行版基本上不支持 share_forward和rp_filter选项,它不会转发源IP是自已的包,所以要打

forward_shared补丁和使用那两个选项来实现包的转发。

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

directory配置: 两台配置基本一样

安装heartbeat

http://www.ultramonkey.org/download/heartbeat/2.1.3/heartbeat-2.1.3.tar.gz

http://hg.linux-ha.org/heartbeat-STABLE_3_0/archive/STABLE-3.0.3.tar.bz2 这个貌似很新,但是我一直没有下载成功过

http://down.51cto.com/download.php?do=attachment&aid=107685&k=c8469a3d5830e56e6cd13060a0ed7816&t=1281434320

我用的是第三个链接(解压缩后是八个包),因为第一个是源代码包,中间编译过程会因为系统的不同出现不同的需求和错误,

很是麻烦。如果链接失败的话,可以给我留言,我邮件给诸位

# ls

heartbeat-2.1.4-9.el5.i386.rpm heartbeat-pils-2.1.4-10.el5.i386.rpm

heartbeat-devel-2.1.4-9.el5.i386.rpm heartbeat-stonith-2.1.4-10.el5.i386.rpm

heartbeat-gui-2.1.4-9.el5.i386.rpm libnet-1.1.4-3.el5.i386.rpm

heartbeat-ldirectord-2.1.4-9.el5.i386.rpm perl-MailTools-1.77-1.el5.noarch.rpm

# yum localinstall ./*.rpm

# rpm -qa | grep heartbeat

heartbeat-2.1.4-9.el5

heartbeat-devel-2.1.4-9.el5

heartbeat-ldirectord-2.1.4-9.el5

heartbeat-pils-2.1.4-10.el5

heartbeat-gui-2.1.4-9.el5

heartbeat-stonith-2.1.4-10.el5

# pwd

/etc/ha.d ==================主目录

# ls

apphbd.cf COPYING.LGPL GettingStarted.txt hb_report.html README startstop

authkeys DirectoryMap.txt ha.cf hb_report.txt Requirements.html

AUTHORS faqntips.html HardwareGuide.html heartbeat_api.html Requirements.txt

ChangeLog faqntips.txt HardwareGuide.txt heartbeat_api.txt rsync.html

COPYING GettingStarted.html haresources logd.cf rsync.txt

# cp /usr/share/doc/heartbeat-2.1.4/authkeys ha.cf haresources /etc/ha.d/

# service heartbeat start

#echo -ne "auth1\n1 sha1" >> authkeys

#dd if=/dev/urandom bs=512 count=1 | openssl md5 >> authkeys

1+0 records in

1+0 records out

512 bytes (512 B) copied, 0.000372942 seconds, 1.4 MB/s

我们可以看到里面新增了两行

#vim /etc/ha.d/authkeys

auth1

1 sha1 9e43d13a84f2b9ea486516d709e748b5

# vim ha.cf =============开启如下行,具体含义如下

debugfile /var/log/ha-debug

logfacility local0

keepalive 2

deadtime 30

warntime 10

initdead 120

udpport 694

bcast eth1

auto_failback on

node node1.example.com

node node2.example.com

# vim haresources ===========声明主节点和虚拟ip地址

node1.example.com 192.168.77.250 httpd

#chmod 600 Authkeys

配置ha.cf

这个配置文件告诉heartbeat 使用的是什么介质和如何配置它们。ha.cf 包含你将到的所有的选项,内容如下:

serial /dev/ttyS0

使用串口heartbeat - 如果你不使用串口heartbeat, 你必须选择其它的介质,比如以太网bcast (ethernet) heartbeat。如果你使用其它串口heartbeat,修改/dev/ttyS0 为其它的串口设备。

watchdog /dev/watchdog

可选项:watchdog功能提供 了一种方法能让系统在出现故障无法提供"heartbeat"时,仍然具有最小的功能,能在出现故障1分钟后重启该机器。这个功能可以帮助服务器在确实停 止心跳后能够重新恢复心跳。如果你想使用该特性,你必须在内核中装入"softdog" 内核模块用来生成实际的设备文件。想要达到这个目的, 首先输入 "insmod softdog" 加载模块。然后,输入"grep misc /proc/devices" 注意显示的数字 (should be 10).然后, 输入"cat /proc/misc | grep watchdog" 注意输出显示出的数字(should be 130)。现在你可以生成设备文件使用如下命令:"mknod /dev/watchdog c 10 130" 。

bcast eth1

指定使用的广播heartbeat 的网络接口eth1(修改为eth0, eth2, 或你所使用的接口)

keepalive 2

设置心跳间隔时间为2两秒。

warntime 10

在日志中发出最后心跳"late heartbeat" 前的警告时间设定。

deadtime 30

在30秒后明确该节点的死亡。

initdead 120

在一些配置中,节点重启后需要花一些时间启动网络。这个时间与"deadtime"不同,要单独对待。 至少是标准死亡时间的两倍。

hopfudge 1

可选项: 用于环状拓扑结构,在集群中总共跳跃节点的数量。

baud 19200

串口波特率的设定(bps).

udpport 694

bcast和ucast通讯使用的端口号694 。这是缺省值,官方IANA 使用标准端口号。

nice_failback on

可选项:对那些熟悉Tru64 Unix, 心跳活动就像是"favored member"模式。主节点获取所有资源直到它宕机,同时备份节点启用。一旦主节点重新开始工作, 它将从备份节点重新获取所有资源。这个选项用来防止主节点失效后重新又获得集群资源。

node linuxha1.linux-ha.org

强制选项:通过`uname -n`命令显示出的集群中的机器名。

node linuxha2.linux-ha.org

强制选项:通过`uname -n`命令显示出的集群中的机器名。

respawnuseridcmd

可选项:列出可以被spawned 和监控的命令。例如:To spawn ccm 后台进程,可以增加如下内容:

respawn hacluster /usr/lib/heartbeat/ccm

通知heartbeat 重新以可信任userid身份运行(在我们的例子中是hacluster) 同时监视该进程的"健康"状况,如果进程死掉,重启它。例如ipfail, 内容如下:

respawn hacluster /usr/lib/heartbeat/ipfail

NOTE: 如果进程以退出代码100死掉, 这个进程将不会respawned。

pingping1.linux-ha.orgping2.linux-ha.org ....

可选项:指定ping 的节点。 这些节点不是集群中的节点。它们用来检测网络的连接性,以便运行一些像ipfail的模块。

2.6.5.2. 配置 haresources

一旦你配置好了ha.cf文件,下面就需要设置haresources文件,这个文件指定集群所提供的服务以及谁是缺省的主节点。注意,该配置文件在所有节点应该是相同的。

在我们的例子中,我们的HA集群提供的是负载均衡服务(LVS)和服务监控服务(Ldirectord)。这里集群的IP(虚拟)地址是必须配置的,不要在haresources文件以外的地方配置该IP地址。所以我们应该添加如下一行:

linuxha1 IPaddr::192.168.7.110/24/192.168.7.255 ipvsadm ldirectord::www ldirectord::mail

::前的表示服务脚本名称(IPaddr),你可以在目录/etc/ha.d/resource.d下找到一个脚本名叫 Ipaddr,后面的表示输入的参数。

Heartbeat 会在下面的路径搜索同名的启动脚本:

/etc/ha.d/resource.d

/etc/rc.d/init.d

这里的服务脚本的使用是符合Init标准语法,所以你可以在这里通过Heartbeat方便地运行、停止/etc/rc.d/init.d下标准的服务后台进程。

2.6.5.3. 配置 Authkeys

配置加密认证算法,有三种算法:CRC, md5,sha1。你会问我们应该用哪种呢?

如果你的heartbeat 运行在一个安全的网络,例如CAT5交叉线,你可以用CRC,从资源开销上来说,这是最节省开销的。如果网络是不可靠的,而且你也不是一个网络安全痴狂者 或者你十分关心CPU资源的最小开销,就用md5,最后如果你关心的是安全而不是CPU资源的开销,那么建议你使用sha1,你将会得到最佳的安全度,很难被黑客所破解。

格式如下:auth <number><number> <authmethod> [<authkey>]

例: /etc/ha.d/authkeys

使用sha1

auth 1

1 sha1 key-for-sha1-any-text-you-want

使用md5

auth 1

1 sha1 key-for-md5-any-text-you-want

使用CRC

auth 2

2 crc

设置调度算法:

# ipvsadm -C

# ipvsadm -A -t 192.168.77.250:80 -s wrr

# ipvsadm -a -t 192.168.77.250:80 -r 192.168.77.221:80 -w 1 -g

# ipvsadm -a -t 192.168.77.250:80 -r 192.168.77.225:80 -w 3 -g

# ipvsadm -L -n

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

-&gt; RemoteAddress:Port Forward Weight ActiveConn InActConn

TCP 192.168.77.250:80 wrr

-&gt; 192.168.77.225:80 Route 3 0 0

-&gt; 192.168.77.221:80 Route 1 0 0

这里需要注意的是:

1.一定确保每个ldirectoty的hosts文件中都有其他directory的名称解析,(或者建DNS服务一也可,强烈的不建议哈)

不然ldirectory会找不到其他的ldriectory调度器

2.Nat模式需要开启ip_forward=1路由功能,而在DR模式中是不需要开启IP_forward功能的,除非是因为有特别要求

# hostname

node1.example.com 另外一台为node2.example.com

# cat /etc/hosts ====================两台directory hosts文件中需声明,并作相应配置

192.168.0.1 node1.example.com node1

192.168.77.222 node1.example.com node1

192.168.0.2 node2.example.com node2

192.168.77.220 node2.example.com node2

realserver配置:

#service httpd stop ============证实web服务是由heartbeat控制的,而非realserver自身了

# echo 1 &gt; /proc/sys/net/ipv4/cconf/lo/arp_ignore

# echo 2 &gt; /proc/sys/net/ipv4/cconf/lo/arp_announce

# echo 1 &gt; /proc/sys/net/ipv4/cconf/all/arp_ignore

# echo 2 &gt; /proc/sys/net/ipv4/cconf/lall/arp_announce

# ifconfig lo:0 192.168.77.250 broadcast 192.168.77.250 netmask 255.255.255.255 up

# route -n

Kernel IP routing table

Destination Gateway Genmask Flags Metric Ref Use Iface

192.168.77.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0

169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0

0.0.0.0 192.168.77.222 0.0.0.0 UG 0 0 0 eth0

# route add -host 192.168.77.250 dev lo:0

# route -n

Kernel IP routing table

Destination Gateway Genmask Flags Metric Ref Use Iface

192.168.77.250 0.0.0.0 255.255.255.255 UH 0 0 0 lo

192.168.77.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0

169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0

0.0.0.0 192.168.77.222 0.0.0.0 UG 0 0 0 eth0

测试:

1.在client测试 http://192.168.77.250 会轮显两台realserver的web内容(建议将两台web的内容设置不一样,以便于区别)

2.关掉master directory,网页依然可以正常访问,在辅助directory上执行

#ipvsadm -L -n

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

-&gt; RemoteAddress:Port Forward Weight ActiveConn InActConn

TCP 192.168.77.250:80 wrr

-&gt; 192.168.77.225:80 Route 3 0 0

-&gt; 192.168.77.221:80 Route 1 0 0

# ifconfig

eth0 Link encap:Ethernet HWaddr 00:0C:29:FF:42:84

inet addr:192.168.77.220 Bcast:192.168.77.255 Mask:255.255.255.0

inet6 addr: fe80::20c:29ff:feff:4284/64 Scope:Link

UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1

RX packets:140116 errors:0 dropped:0 overruns:0 frame:0

TX packets:23633 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:1000

RX bytes:18547910 (17.6 MiB) TX bytes:2062186 (1.9 MiB)

Interrupt:67 Base address:0x2000

eth0:0 Link encap:Ethernet HWaddr 00:0C:29:FF:42:84

inet addr:192.168.77.250 Bcast:192.168.77.255 Mask:255.255.255.0

UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1

Interrupt:67 Base address:0x2000

eth1 Link encap:Ethernet HWaddr 00:0C:29:FF:42:8E

inet addr:192.168.7.220 Bcast:192.168.7.255 Mask:255.255.255.0

UP BROADCAST MULTICAST MTU:1500 Metric:1

RX packets:70991 errors:0 dropped:0 overruns:0 frame:0

TX packets:10549 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:1000

RX bytes:10854575 (10.3 MiB) TX bytes:2693378 (2.5 MiB)

Interrupt:75 Base address:0x2080

我们会发现虚拟IP地址192.168.77.250:80会自动添加过来