节省公网ip keepalived 另类用法

 

用过keepalived 的朋友都知道在设置keepalived 的virtual ipaddress 地址时(以下简称vip)我们通常使用vip 相同网段的三个地址,问题来了如果有多个项目(vip)将会占用多个公网ip 地址,不过在使用keepalived 的过程中我们发现,即使用不同网段的ip 地址也能够"跑"vip ,举个例子比如我用内网地址 10.0.100.81 与 10.0.100.82 来跑公网 vip 192.168.57.75 ,这样我们就可以节省两个公网ip 地址了,不过要想实现这一"妙招" 是需要几个前提条件的。

 

前提条件

1 公网ip与内网ip在同一个广播域内(内外网络连接在同一个交换机内)

2 配置 keepalived vip 添加子网掩码(如 192.168.57.75/24 )

3 需要手动为vip 添加默认路由

 

解释

1 公网ip与内网ip在同一个广播域内

 
  
  1. ip add 
  2.  
  3. 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN  
  4.  
  5.     link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 
  6.  
  7.     inet 127.0.0.1/8 scope host lo 
  8.  
  9.     inet6 ::1/128 scope host  
  10.  
  11.        valid_lft forever preferred_lft forever 
  12.  
  13. 2: eth0: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast state DOWN qlen 1000 
  14.  
  15.     link/ether 00:50:56:ad:20:0d brd ff:ff:ff:ff:ff:ff 
  16.  
  17. 3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 
  18.  
  19.     link/ether 00:50:56:ad:20:0e brd ff:ff:ff:ff:ff:ff 
  20.  
  21.     inet 10.0.100.81/24 brd 10.0.100.255 scope global eth1 
  22.  
  23.     inet6 fe80::250:56ff:fead:200e/64 scope link  
  24.  
  25.        valid_lft forever preferred_lft forever 
  26.  
  27. 4: sit0: <NOARP> mtu 1480 qdisc noop state DOWN  
  28.  
  29.     link/sit 0.0.0.0 brd 0.0.0.0 
  30.  
  31.  
  32.  
  33. eth0 为公网 ip地址为none 
  34.  
  35. eth1 为内网 ip地址为 10.0.100.81 
  36.  
  37.  
  38.  
  39. //我在eth1 网卡可以抓到 eth0 网络的arp 包 
  40.  
  41. tcpdump -i eth1 -vvn arp 
  42.  
  43. tcpdump: listening on eth1, link-type EN10MB (Ethernet), capture size 65535 bytes 
  44.  
  45. 09:38:59.900475 ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 192.168.57.1 tell 192.168.57.71, length 28 
  46.  
  47. 09:38:59.901161 ARP, Ethernet (len 6), IPv4 (len 4), Reply 192.168.57.1 is-at c0:62:6b:8d:c1:cc, length 46 

 

2 配置 keepalived vip 请添加子网掩码(如 192.168.57.75/24 ) 

 
  
  1. //keepalived 配置文件 
  2.  
  3. tail -n 5 /usr/local/keepalived/keepalived.conf  
  4.  
  5. virtual_ipaddress { 
  6.  
  7. 192.168.57.75/24 dev eth1 scope global 
  8.  
  9.  
  10. //启动keepalvied 后的路由表 
  11.  
  12. ip route 
  13.  
  14. 10.0.100.0/24 dev eth1  proto kernel  scope link  src 10.0.100.81  
  15.  
  16. 192.168.57.0/24 dev eth1  proto kernel  scope link  src 192.168.57.75  
  17.  
  18. 169.254.0.0/16 dev eth1  scope link  metric 1003  

 

3 需要手动为vip 添加默认路由

 
  
  1. //因为是虚拟ip 所以没有默认网关,下面是没有启动keepalived 的路由表 
  2.  
  3. ip route                 
  4.  
  5. 10.0.100.0/24 dev eth1  proto kernel  scope link  src 10.0.100.81  
  6.  
  7. 169.254.0.0/16 dev eth1  scope link  metric 1003  
  8.  
  9.  
  10. //添加默认网关 
  11.  
  12. route add default gateway 192.168.57.1 
  13.  
  14.  
  15. //启动keepalvied并添加默认网关后的路由表 
  16.  
  17. ip route 
  18.  
  19. 10.0.100.0/24 dev eth1  proto kernel  scope link  src 10.0.100.81  
  20.  
  21. 192.168.57.0/24 dev eth1  proto kernel  scope link  src 192.168.57.75  
  22.  
  23. 169.254.0.0/16 dev eth1  scope link  metric 1003  
  24.  
  25. default via 192.168.57.1 dev eth1  

 

测试

//ping 通 vip

//haproxy url

 

结束

需要注意的是这个keepalived技巧并不适合大网络的环境,因为较大的网络从网络安全与网络开销(大量广播包)角度讲,最基本的也会隔离出两个广播域一个外网一个内网,否则问题大大的,这样就违背了第一个前提条件了

更多欢迎到此讨论:

37275208