热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

解除openstack中instance对IP的限制

最近公司的几个关键业务跑在openstack中的虚拟机中,想把几个虚拟机做成负载均衡和高可用集群。对于负载均衡,G版本已经集成了haproxy插件,对haproxy的配置做了一层封装,可以很方便的通过quantum去创建一个负载均衡池,为相同或者不同宿主机上的虚拟机提

  最近公司的几个关键业务跑在openstack中的虚拟机中,想把几个虚拟机做成负载均衡和高可用集群。

  对于负载均衡,G版本已经集成了haproxy插件,对haproxy的配置做了一层封装,可以很方便的通过quantum去创建一个负载均衡池,为相同或者不同宿主机上的虚拟机提供负载均衡的能力。

  在这个模式下,haproxy是运行在宿主机上的。

  遗憾的是,目前还不能通过openstack做到haproxy的高可用。

  想要做高可用,只能在虚拟机中去飘VIP了

  但是创建了虚拟机之后,在这个虚拟机实例中只能使用指定的IP。

  这就导致想在虚拟机中部署高可用去飘VIP是不可行的。

  可以理解,在公有云环境下,是不可能让用户在虚拟机中随意去配置额外地址的。

  但我们是私有云环境,这个规则对私有云环境下很是麻烦。

  在openstack中创建虚拟机,通过nova boot的--nic选项指定网卡和IP地址:

  --nic net-id=${NETWORK_ID},v4-fixed-ip=${Host_IP}

  之前一直以为是iptables规则导致的。于是去看了一遍宿主机中的iptables规则

  root@node1:~# iptables -vnL

  Chain INPUT (policy ACCEPT 3556K packets, 744M bytes)

  pkts bytes target prot opt in out source destination

  1778K 372M nova-compute-INPUT all -- * * 0.0.0.0/0 0.0.0.0/0

  Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)

  pkts bytes target prot opt in out source destination

  150 13488 nova-filter-top all -- * * 0.0.0.0/0 0.0.0.0/0

  6 1392 nova-compute-FORWARD all -- * * 0.0.0.0/0 0.0.0.0/0

  Chain OUTPUT (policy ACCEPT 4208K packets, 567M bytes)

  pkts bytes target prot opt in out source destination

  4202K 567M nova-filter-top all -- * * 0.0.0.0/0 0.0.0.0/0

  2106K 284M nova-compute-OUTPUT all -- * * 0.0.0.0/0 0.0.0.0/0

  Chain nova-compute-FORWARD (1 references)

  pkts bytes target prot opt in out source destination

  4 1312 ACCEPT udp -- * * 0.0.0.0 255.255.255.255 udp spt:68 dpt:67

  2 80 ACCEPT all -- brq3eefcd79-07 * 0.0.0.0/0 0.0.0.0/0

  0 0 ACCEPT all -- * brq3eefcd79-07 0.0.0.0/0 0.0.0.0/0

  Chain nova-compute-INPUT (1 references)

  pkts bytes target prot opt in out source destination

  2 656 ACCEPT udp -- * * 0.0.0.0 255.255.255.255 udp spt:68 dpt:67

  Chain nova-compute-OUTPUT (1 references)

  pkts bytes target prot opt in out source destination

  Chain nova-compute-inst-15 (1 references)

  pkts bytes target prot opt in out source destination

  0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0 state INVALID

  0 0 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED

  0 0 nova-compute-provider all -- * * 0.0.0.0/0 0.0.0.0/0

  0 0 ACCEPT udp -- * * 10.16.0.102 0.0.0.0/0 udp spt:67 dpt:68

  0 0 ACCEPT all -- * * 10.16.0.0/24 0.0.0.0/0

  0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 multiport dports 1:65535

  0 0 ACCEPT udp -- * * 0.0.0.0/0 0.0.0.0/0 multiport dports 1:65535

  0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0

  0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 icmptype 8 code 8

  0 0 nova-compute-sg-fallback all -- * * 0.0.0.0/0 0.0.0.0/0

  Chain nova-compute-inst-17 (1 references)

  pkts bytes target prot opt in out source destination

  0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0 state INVALID

  0 0 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED

  0 0 nova-compute-provider all -- * * 0.0.0.0/0 0.0.0.0/0

  0 0 ACCEPT udp -- * * 10.16.0.102 0.0.0.0/0 udp spt:67 dpt:68

  0 0 ACCEPT all -- * * 10.16.0.0/24 0.0.0.0/0

  0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 multiport dports 1:65535

  0 0 ACCEPT udp -- * * 0.0.0.0/0 0.0.0.0/0 multiport dports 1:65535

  0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0

  0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 icmptype 8 code 8

  0 0 nova-compute-sg-fallback all -- * * 0.0.0.0/0 0.0.0.0/0

  Chain nova-compute-local (1 references)

  pkts bytes target prot opt in out source destination

  0 0 nova-compute-inst-15 all -- * * 0.0.0.0/0 10.16.0.111

  0 0 nova-compute-inst-17 all -- * * 0.0.0.0/0 10.16.0.131

  Chain nova-compute-provider (2 references)

  pkts bytes target prot opt in out source destination

  Chain nova-compute-sg-fallback (2 references)

  pkts bytes target prot opt in out source destination

  0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0

  Chain nova-filter-top (2 references)

  pkts bytes target prot opt in out source destination

  2106K 284M nova-compute-local all -- * * 0.0.0.0/0 0.0.0.0/0


  分析一下这些openstack自动生成的规则,可以看到input,forword和output链默认都是accept状态。分析每条链对数据包的跳转和过滤,如果在虚拟机中配置新的地址,是不会被过滤的。

  经过一番折腾,最终发现限制IP的原因是ebtables在起作用

  root@node1:~# ebtables -t nat -L

  Bridge table: nat

  Bridge chain: PREROUTING, entries: 2, policy: ACCEPT

  -i tap0678bf1d-41 -j libvirt-I-tap0678bf1d-41

  -i tap496fa038-9e -j libvirt-I-tap496fa038-9e

  Bridge chain: OUTPUT, entries: 0, policy: ACCEPT

  Bridge chain: POSTROUTING, entries: 0, policy: ACCEPT

  Bridge chain: libvirt-I-tap0678bf1d-41, entries: 4, policy: ACCEPT

  -j I-tap0678bf1d-41-mac

  -p IPv4 -j I-tap0678bf1d-41-ipv4-ip

  -p ARP -j I-tap0678bf1d-41-arp-mac

  -p ARP -j I-tap0678bf1d-41-arp-ip

  Bridge chain: I-tap0678bf1d-41-mac, entries: 2, policy: ACCEPT

  -s fa:16:3e:a6:5f:70 -j RETURN

  -j DROP

  Bridge chain: I-tap0678bf1d-41-ipv4-ip, entries: 3, policy: ACCEPT

  -p IPv4 --ip-src 0.0.0.0 --ip-proto udp -j RETURN

  -p IPv4 --ip-src 10.16.0.131 -j RETURN

  -j DROP

  Bridge chain: I-tap0678bf1d-41-arp-mac, entries: 2, policy: ACCEPT

  -p ARP --arp-mac-src fa:16:3e:a6:5f:70 -j RETURN

  -j DROP

  Bridge chain: I-tap0678bf1d-41-arp-ip, entries: 2, policy: ACCEPT

  -p ARP --arp-ip-src 10.16.0.131 -j RETURN

  -j DROP

  Bridge chain: libvirt-I-tap496fa038-9e, entries: 4, policy: ACCEPT

  -j I-tap496fa038-9e-mac

  -p IPv4 -j I-tap496fa038-9e-ipv4-ip

  -p ARP -j I-tap496fa038-9e-arp-mac

  -p ARP -j I-tap496fa038-9e-arp-ip

  Bridge chain: I-tap496fa038-9e-mac, entries: 2, policy: ACCEPT

  -s fa:16:3e:58:1:ac -j RETURN

  -j DROP

  Bridge chain: I-tap496fa038-9e-ipv4-ip, entries: 3, policy: ACCEPT

  -p IPv4 --ip-src 0.0.0.0 --ip-proto udp -j RETURN

  -p IPv4 --ip-src 10.16.0.111 -j RETURN

  -j DROP

  Bridge chain: I-tap496fa038-9e-arp-mac, entries: 2, policy: ACCEPT

  -p ARP --arp-mac-src fa:16:3e:58:1:ac -j RETURN

  -j DROP

  Bridge chain: I-tap496fa038-9e-arp-ip, entries: 2, policy: ACCEPT

  -p ARP --arp-ip-src 10.16.0.111 -j RETURN

  -j DROP

  ebtables是linux专门做二层数据链路层过滤的。

  在通过nova创建虚拟机后,会生成libvirt的一个xml配置文件

  路径在:/etc/libvirt/nwfilter/nova-base.xml

  里面定义了以下规则,这些规则限制了在虚拟机上的地址,在二层上就做了过滤

  

  12ec8693-253a-7db0-7cd3-f8cc0a1e1b02

  

  

  

  

  

  然后为每个虚拟机创建一个xml文件,每个虚拟机的xml配置中包含了nova-base.xml中的配置

  打开其中一个虚拟机的xml配置,可以看到,这个配置文件中只放行了指定IP在二层上可以通过,所以其它手动配置的地址是不可用的。

  cat /etc/libvirt/nwfilter/nova-instance-instance-0000000f-fa163e5801ac.xml

  

  972d18be-2db0-4bf2-2853-a0a61beac036

  

  

  

  

  

  

  

  libvirt可以通过在这些xml配置的规则,去生成ebtables规则,最终是ebtables做出限制。

  如何破解?

  修改nova-base.xml文件

  注释掉以下三行

  

  

  

  然后重启libvirt进程,libvirt会重新读取xml中的配置,生成新的ebtables规则。

  修改后,我通过新建虚拟机,重启nova-computer进程,或者直接重启宿主机,这个base文件都不会发生变化了。

  还有就是修改nova源码(未测试)

  源码位置在

  /usr/lib/python2.7/dist-packages/nova/virt/libvirt/firewall.py

  第198行(G版本中)

  

  去掉no-mac-spoofing,no-ip-spoofing,no-arp-spoofing这三行,以后生成nova-base.xml文件就可以不包含这3个选项了。


推荐阅读
  • 基于KVM的SRIOV直通配置及性能测试
    SRIOV介绍、VF直通配置,以及包转发率性能测试小慢哥的原创文章,欢迎转载目录?1.SRIOV介绍?2.环境说明?3.开启SRIOV?4.生成VF?5.VF ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • CentOS7源码编译安装MySQL5.6
    2019独角兽企业重金招聘Python工程师标准一、先在cmake官网下个最新的cmake源码包cmake官网:https:www.cmake.org如此时最新 ... [详细]
  • 在哈佛大学商学院举行的Cyberposium大会上,专家们深入探讨了开源软件的崛起及其对企业市场的影响。会议指出,开源软件不仅为企业提供了新的增长机会,还促进了软件质量的提升和创新。 ... [详细]
  • 在Ubuntu 16.04 LTS上配置Qt Creator开发环境
    本文详细介绍了如何在Ubuntu 16.04 LTS系统中安装和配置Qt Creator,涵盖了从下载到安装的全过程,并提供了常见问题的解决方案。 ... [详细]
  • Python自动化处理:从Word文档提取内容并生成带水印的PDF
    本文介绍如何利用Python实现从特定网站下载Word文档,去除水印并添加自定义水印,最终将文档转换为PDF格式。该方法适用于批量处理和自动化需求。 ... [详细]
  • 本文深入探讨了Linux系统中网卡绑定(bonding)的七种工作模式。网卡绑定技术通过将多个物理网卡组合成一个逻辑网卡,实现网络冗余、带宽聚合和负载均衡,在生产环境中广泛应用。文章详细介绍了每种模式的特点、适用场景及配置方法。 ... [详细]
  • 掌握远程执行Linux脚本和命令的技巧
    本文将详细介绍如何利用Python的Paramiko库实现远程执行Linux脚本和命令,帮助读者快速掌握这一实用技能。通过具体的示例和详尽的解释,让初学者也能轻松上手。 ... [详细]
  • 本文介绍如何在现有网络中部署基于Linux系统的透明防火墙(网桥模式),以实现灵活的时间段控制、流量限制等功能。通过详细的步骤和配置说明,确保内部网络的安全性和稳定性。 ... [详细]
  • 作者:守望者1028链接:https:www.nowcoder.comdiscuss55353来源:牛客网面试高频题:校招过程中参考过牛客诸位大佬的面经,但是具体哪一块是参考谁的我 ... [详细]
  • 采用IKE方式建立IPsec安全隧道
    一、【组网和实验环境】按如上的接口ip先作配置,再作ipsec的相关配置,配置文本见文章最后本文实验采用的交换机是H3C模拟器,下载地址如 ... [详细]
  • NFS(Network File System)即网络文件系统,是一种分布式文件系统协议,主要用于Unix和类Unix系统之间的文件共享。本文详细介绍NFS的配置文件/etc/exports和相关服务配置,帮助读者理解如何在Linux环境中配置NFS客户端。 ... [详细]
  • 本文将详细介绍如何在ThinkPHP6框架中实现多数据库的部署,包括读写分离的策略,以及如何通过负载均衡和MySQL同步技术优化数据库性能。 ... [详细]
  • 本文将详细探讨 Linux 系统中的 netstat 命令,该命令用于查看网络状态和连接情况。通过了解 IP 地址和端口的基本概念,我们将更好地理解如何利用 netstat 命令来监控和管理网络服务。 ... [详细]
author-avatar
有你真好cc_693
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有