服务器做VIP后,数据包出去用哪个IP,取决于你用的是LVS的哪种转发模式:DR模式下默认走真实服务器的内网IP,除非你额外配置了路由策略;NAT模式下则强制走VIP。大多数人在这个环节栽跟头,是因为把VIP绑到了错误的网卡上,或者忽略了Linux的弱主机模型下的路由规则,下面我用实际场景拆开讲清楚,你看完就能自己排查。
服务器VIP地址有什么用,先分清它和真实IP的角色
很多朋友第一次接触VIP(虚拟IP)是在配置LVS或Keepalived的时候,VIP的全称是Virtual IP,它不是一个物理网卡上的固定地址,而是一个可以漂移的逻辑地址。对外,客户端只认VIP;对内,真实服务器还保留着自己的内网IP,两者不是替代关系,而是分工关系。
业内专家指出,在LVS集群架构里,VIP承担两个任务:一是作为统一的入口接收请求,二是配合负载均衡算法把流量分发到后端,真实IP则负责后端服务器之间的通信、数据同步、回源等内部动作,搞清楚这个分工,你就能理解为什么“出去用哪个IP”没有统一答案,而是看数据包从哪里出发、要去哪里。
服务器配置VIP后无法访问,先查源IP策略
如果你遇到“VIP配置好了,但后端服务器访问外网或者回包给客户端时出问题”,九成是源IP选错了,这里的核心在于RTABLES(策略路由)和IP地址归属,Linux系统在发送数据包时,会先查路由表,再根据路由表决定源IP,默认情况下,如果目标地址不在本地子网,系统会选主网卡上的IP作为源地址,而不是你绑在lo(回环接口)上的VIP。
实战场景:LVS DR模式下的源IP行为
DR模式是LVS最常用的模式,性能也最好,它有一个特点:请求进来时,Director(调度器)只改写目标MAC地址,不改写IP头,也就是说,客户端发的数据包,源IP是客户端自己的,目标IP是VIP,到了真实服务器后,真实服务器要回的包,目标IP是客户端,源IP必须是VIP因为客户端只认VIP。

但问题来了:真实服务器上,VIP通常绑在lo:0这个接口上,Linux在选源IP时,如果目标IP(客户端)和自己的VIP不在同一网段,系统会优先选eth0上的真实IP作为源地址,这就导致回包源IP变成了真实内网IP,客户端收到后直接丢弃(因为连接是发给VIP的)。解决办法是在真实服务器上加一条路由,强制去往客户端的流量源IP用VIP。
具体操作分两步:
- 在真实服务器上确认VIP绑定情况,执行
ip addr show lo,看到类似inet 192.168.10.100/32 scope global lo:0就说明绑定成功。 - 添加策略路由,
ip route add table 100 via 192.168.10.1 dev eth0 src 192.168.10.100,然后ip rule add from 192.168.10.100 lookup 100,这样从VIP发出的包,走独立路由表,源地址固定为VIP。
LVS DR模式源IP是什么,得看路由表
很多教程只告诉你“DR模式回包要走VIP”,但没告诉你“为什么有时候不走”,我见过的生产环境故障里,相当一部分是因为宝塔面板或云平台自带的防火墙策略把从VIP发出的包拦了,你在云服务器上配VIP时,还要检查云平台的安全组是否放行VIP对应IP的流量。
想确认服务器实际出去用的哪个IP,用这3条命令
与其猜,不如直接抓包看,下面这3条命令能帮你快速定位源IP问题。
ip route get <目标IP>:比如ip route get 8.8.8.8,输出里会明确显示src字段,那就是出去的源IP。tcpdump -i eth0 host <VIP> -nn:抓eth0口的包,看回包头里的源IP到底是VIP还是真实IP。curl --interface <VIP> http://目标地址:强制指定源IP发包,测试连通性。

如果ip route get显示的src是真实IP,而你又希望用VIP出去,那就需要按上文加策略路由,反过来,如果你希望用真实IP出去(比如后端服务器要访问数据库,数据库白名单只放行了内网IP),那就保持默认即可。
Keepalived场景下,VIP漂移后从哪里出去
Keepalived做高可用时,VIP会在两台机器之间漂移,很多人问:VIP漂到备机后,备机出去访问外部服务,源IP是VIP还是备机的真实IP?
答案是:默认是备机的真实IP,除非你手动指定,Keepalived本身只负责VIP的添加和漂移,不干预系统路由策略,备机抢到VIP后,VIP绑在eth0:0或lo:0上,但出站流量依然走主路由表,源IP选eth0的物理IP。
一个容易踩的坑:VIP和真实IP的区别是什么
这两个IP的区别不仅是功能,还有可达性,VIP是给外部客户端用的,真实IP是给内部管理用的,如果你把真实IP暴露到公网,相当于把服务器后门敞开了;反过来,如果你要求所有对外通信都用VIP,那就要确保所有后端服务器都配置了对应的策略路由,否则回包源IP不一致,连接必然中断。
在配置时建议这样做:
- 管理SSH连接永远走真实IP,不要走VIP,避免VIP切换时断连。
- 业务流量走VIP,通过iptables或路由表保证源IP一致性。
- 所有机器的时间同步、日志上报等内部流量,走真实IP,降低VIP故障影响面。
NAT模式下服务器出去用哪个IP,规则完全不同
如果你的LVS跑的是NAT模式,那答案就变了,NAT模式下,Director既做入站调度,也做出站转发,真实服务器根本不需要配置VIP,它收到的请求目标IP是Director的内网IP,回包也是先回给Director,再由Director改写源IP为VIP后发给客户端。

所以在NAT模式下,真实服务器出去的网络流量,源IP是它自己的内网IP,和VIP完全无关,只有Director对外通信时,才用VIP,这个模式和DR模式的最大区别在于:NAT模式下回包要绕行Director,Director压力大;DR模式下回包直接回给客户端,Director只负责入站,从性能看,DR模式明显优于NAT模式,但NAT模式对后端服务器的要求更低,不需要改路由。
Q&A:服务器做VIP后出去用哪个IP?三个高频问题一次说清
VIP绑定在lo上会不会导致本机ping不通VIP?
不会,lo是回环接口,绑在lo上的IP在本地是通的,但要注意,因为lo的回环特性,外部设备无法直接访问这个IP,必须通过ARP绑定或负载均衡设备转发,所以在DR模式下,真实服务器的lo:0绑VIP,但必须设置arp_ignore=1和arp_announce=2,禁止对外响应VIP的ARP请求,否则会抢答。
同一台服务器上既有VIP又有真实IP,优先级怎么定?
路由表决定优先级,系统会先匹配路由前缀,前缀相同的情况下,优先生成的路由规则优先级更高,如果你想强制VIP作为某个网段的源IP,就加一条更具体的路由规则,比如ip route add 192.168.20.0/24 dev eth0 src 192.168.10.100,这样去往该网段的包就会用VIP作源地址。
配置了VIP之后,服务器的出站网速变慢,是怎么回事?
大概率是策略路由导致数据包走了非最优路径,比如你强制所有流量源IP为VIP,但VIP所在的网段和出口网关不在同一个二层域,数据包就会先经过一个额外的路由跳点,增加延迟,检查方法是执行traceroute看路径是否变长,再对比删除策略路由前后的ping延迟,在多数情况下,让内网流量走真实IP、外网流量走VIP,是延迟最低的配置方式。
图片来源于AI模型,如侵权请联系管理员。作者:酷小编,如若转载,请注明出处:https://www.kufanyun.com/ask/672150.html


评论列表(3条)
这篇文章的内容非常有价值,我从中学习到了很多新的知识和观点。作者的写作风格简洁明了,却又不失深度,让人读起来很舒服。特别是目标部分,给了我很多新的思路。感谢分享这么好的内容!
@风风3534:读了这篇文章,我深有感触。作者对目标的理解非常深刻,论述也很有逻辑性。内容既有理论深度,又有实践指导意义,确实是一篇值得细细品味的好文章。希望作者能继续创作更多优秀的作品!
这篇文章的内容非常有价值,我从中学习到了很多新的知识和观点。作者的写作风格简洁明了,却又不失深度,让人读起来很舒服。特别是目标部分,给了我很多新的思路。感谢分享这么好的内容!