OpenStack: 让虚拟机自己管理DHCP
由于项目需要,我需要把一个装在ATCA中的集群系统移植到OpenStack上。
在这个集群系统中,有两台主备互用的管理机,其他的机器均为计算节点,安装的时候从管理机自动安装。
自动安装使用的是netboot。
netboot需要在管理机上运行DHCP服务,然而,nova和quantum默认都会在security group中禁用虚拟机自己管理DHCP。
用iptables-save可以看到有很多类似下面的内容
-A quantum-linuxbri-o1ea744af-8 -p udp -m udp --sport 67 --dport 68 -j DROP
搜索一下python代码可以发现
# find /usr/lib/python2.7/dist-packages/ -name "*.py"|xargs grep "sport 67"
/usr/lib/python2.7/dist-packages/nova/virt/firewall.py: ipv4_rules.append('-s %s -p udp --sport 67 --dport 68 '
/usr/lib/python2.7/dist-packages/quantum/tests/unit/test_security_groups_rpc.py:-A %(bn)s-i_port1 -j DROP -p udp --dport 68 --sport 67 -s 10.0.0.2
/usr/lib/python2.7/dist-packages/quantum/tests/unit/test_security_groups_rpc.py:-A %(bn)s-o_port1 -p udp --sport 67 --dport 68 -j DROP
/usr/lib/python2.7/dist-packages/quantum/tests/unit/test_security_groups_rpc.py:-A %(bn)s-i_port1 -j DROP -p udp --dport 68 --sport 67 -s 10.0.0.2
/usr/lib/python2.7/dist-packages/quantum/tests/unit/test_security_groups_rpc.py:-A %(bn)s-o_port1 -p udp --sport 67 --dport 68 -j DROP
/usr/lib/python2.7/dist-packages/quantum/tests/unit/test_security_groups_rpc.py:-A %(bn)s-i_port1 -j DROP -p udp --dport 68 --sport 67 -s 10.0.0.2
/usr/lib/python2.7/dist-packages/quantum/tests/unit/test_security_groups_rpc.py:-A %(bn)s-o_port1 -p udp --sport 67 --dport 68 -j DROP
/usr/lib/python2.7/dist-packages/quantum/tests/unit/test_security_groups_rpc.py:-A %(bn)s-i_port2 -j DROP -p udp --dport 68 --sport 67 -s 10.0.0.2
/usr/lib/python2.7/dist-packages/quantum/tests/unit/test_security_groups_rpc.py:-A %(bn)s-o_port2 -p udp --sport 67 --dport 68 -j DROP
/usr/lib/python2.7/dist-packages/quantum/tests/unit/test_security_groups_rpc.py:-A %(bn)s-i_port1 -j DROP -p udp --dport 68 --sport 67 -s 10.0.0.2
/usr/lib/python2.7/dist-packages/quantum/tests/unit/test_security_groups_rpc.py:-A %(bn)s-o_port1 -p udp --sport 67 --dport 68 -j DROP
/usr/lib/python2.7/dist-packages/quantum/tests/unit/test_security_groups_rpc.py:-A %(bn)s-i_port2 -j DROP -p udp --dport 68 --sport 67 -s 10.0.0.2
/usr/lib/python2.7/dist-packages/quantum/tests/unit/test_security_groups_rpc.py:-A %(bn)s-o_port2 -p udp --sport 67 --dport 68 -j DROP
/usr/lib/python2.7/dist-packages/quantum/tests/unit/test_security_groups_rpc.py:-A %(bn)s-i_port1 -j DROP -p udp --dport 68 --sport 67 -s 10.0.0.2
/usr/lib/python2.7/dist-packages/quantum/tests/unit/test_security_groups_rpc.py:-A %(bn)s-o_port1 -p udp --sport 67 --dport 68 -j DROP
/usr/lib/python2.7/dist-packages/quantum/tests/unit/test_security_groups_rpc.py:-A %(bn)s-i_port2 -j DROP -p udp --dport 68 --sport 67 -s 10.0.0.2
/usr/lib/python2.7/dist-packages/quantum/tests/unit/test_security_groups_rpc.py:-A %(bn)s-o_port2 -p udp --sport 67 --dport 68 -j DROP
/usr/lib/python2.7/dist-packages/quantum/tests/unit/test_iptables_firewall.py: '-p udp --sport 67 --dport 68 -j DROP'),
/usr/lib/python2.7/dist-packages/quantum/tests/unit/test_iptables_firewall.py: '-p udp --sport 67 --dport 68 -j DROP'))
/usr/lib/python2.7/dist-packages/quantum/tests/unit/test_iptables_firewall.py: '-p udp --sport 67 --dport 68 -j DROP'),
/usr/lib/python2.7/dist-packages/quantum/tests/unit/test_iptables_firewall.py: 'ofake_dev', '-p udp --sport 67 --dport 68 -j DROP'),
/usr/lib/python2.7/dist-packages/quantum/tests/unit/test_iptables_firewall.py: '-p udp --sport 67 --dport 68 -j DROP'),
/usr/lib/python2.7/dist-packages/quantum/agent/linux/iptables_firewall.py: DROP ['-p udp --sport 67 --dport 68 -j DROP']
可以看到DHCP使用的端口67和68都被iptables禁用掉了。
那么解决办法也很简单了,
可以在安装前把上述文件中的代码中的DROP改成ACCEPT
或者手动删除iptables中的规则
我是直接运行了'iptables -F'把所有的规则都flush掉了。虽然这是很不安全的做法,但至少暂时解决了问题。