DHCP

实例获取不到IP地址

  1. 首先排查是否是安全组的问题导致dhcp报文传递不过去,查看安全组是否打开UDP协议。
  2. 排查是否是由系统内部防火墙导致dhcp报文传递不出去,禁用防火墙后问题是否依然存在。
  3. 排查是否是系统内部服务导致dhcp没有发送discover报文,在系统内使用dhclient命令可以获取到IP。
  4. 排查dhclient没有启动的原因,发现dhclient应该由NetworkManager启动。NetworkManager之所以没有启动dhclient是因为系统内/etc/sysconfig/network-scripts/ifcfg-enp1s0的配置文件,NetworkManager会忽略/etc/sysconfig/network-scripts/下的网络设备导致会出现device not managed错误导致dhclient不启动,进而云主机拿不到IP地址。
  5. 解决方法,将/etc/sysconfig/network-scripts/ifcfg-enp1s0删除。

端口转发

基于浮动IP的端口转发

浮动IP端口转发使用户能够将TCP/UDP流量,从Port通过iptables的NAT功能,转发给浮动IP。

部署

在运行neutron-server的所有节点(网络节点)上,修改/etc/neutron/neutron.conf文件。

1
2
[DEFAULT]
service_plugins = router,segments,port_forwarding

在运行neutron-l3-agent的所有节点上,修改/etc/neutron/l3_agent.ini。

1
2
[agent]
extensions = port_forwarding

重启neutron-server和neutron-l3-agent服务。

1
systemctl restart neutron-server neutron-l3-agent

验证。

1
openstack extension list --network | grep floating-ip-port-forwarding

操作

创建端口转发

1
2
3
4
5
6
7
openstack floating ip port forwarding create \
--internal-ip-address 10.100.0.1 \
--internal-protocol-port 8080
--external-protocol-port 9000
--port 36bcd62a-0860-4e22-bf8a-81f5052eff60 \
--protocol tcp \
825cc4f8-9a1c-4e46-b380-501ba0f9b08d

36bcd62a-0860-4e22-bf8a-81f5052eff60和825cc4f8-9a1c-4e46-b380-501ba0f9b08d分别是Port和浮动IP的ID。

原理

TODO

HA

多个vip

使用kvm部署多台机器,使用keepalived和haproxy作为集群高可用。发现vIP在多个节点上同时出现,怀疑keepalived配置出问题。

在多个节点上利用tcpdump抓包,vrrp包都能被抓到,但是似乎节点之间收不到vrrp包。

1
2
3
4
5
6
tcpdump -i any vrrp -n
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked v1), capture size 262144 bytes
11:30:09.452941 IP 10.12.21.128 > 224.0.0.18: VRRPv2, Advertisement, vrid 51, prio 10, authtype simple, intvl 1s, length 20
11:30:10.453144 IP 10.12.21.128 > 224.0.0.18: VRRPv2, Advertisement, vrid 51, prio 10, authtype simple, intvl 1s, length 20
11:30:11.453369 IP 10.12.21.128 > 224.0.0.18: VRRPv2, Advertisement, vrid 51, prio 10, authtype simple, intvl 1s, length 20

确保SElinux处于关闭状态。

1
2
3
4
cat /etc/selinux/config

SELINUX=disabled
SELINUXTYPE=targeted

检查防火墙是否关闭。

1
2
3
systemtcl status firewalld
systemctl stop firewalld
systemctl disable firewalld

查看iptables规则。

1
2
3
4
5
iptables -S

-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT

防火墙一切正常,怀疑是KVM虚拟机的网络问题导致VRRP不能被传输。KVM使用nat网络进行传输时没有问题,在使用macvtap网络会出现上述问题。

查看官方文档,kvm在使用macvtap驱动时,参数trustGuestRxFilters默认否,可能会修改从虚拟机出来的流量的MAC地址,导致网络不可达。

编辑虚拟机配置文件。

1
2
3
4
5
6
7
8
...
<interface type='direct' trustGuestRxFilters='yes'>
<mac address='52:54:00:a9:f7:5b'/>
<source dev='ens9f0' mode='bridge'/>
<model type='virtio'/>
<address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
</interface>
...

最后如果问题还是复现,将每台虚拟机对应的macvtap网卡设置成混杂模式,问题解决。

1
2
3
4
5
6
7
8
9
10
ifconfig macvtap5 promisc

ifconfig macvtap5
macvtap5: flags=4419<UP,BROADCAST,RUNNING,PROMISC,MULTICAST> mtu 1500
inet6 fe80::5054:ff:fea9:f75b prefixlen 64 scopeid 0x20<link>
ether 52:54:00:a9:f7:5b txqueuelen 500 (Ethernet)
RX packets 27827 bytes 2287340 (2.1 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 16236 bytes 1122923 (1.0 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

MTU

mtu和网络类型相关。不同网络类型有不同的计算方式。
网络的类型可能的类型有:flat和vlan等。首先:neutron中的配置项global_physnet_mtu定义全局的物理网络的mtu大小,默认是1500。同时,ml2的配置项physical_network_mtus可以为每个物理网络配置不同的mtu。[文档](https://docs.openstack.org/neutron/latest/admin/config-mtu.html)。flat、vlan下mtu取配置项的最小值;gre下先减去20字节的ip头(ipv6是40字节),再减去22字节的gre头;vxlan下先减去20字节的ip头(ipv6是40字节),再减去30字节的vxlan头。

对于实例的mtu(也就是tap设备),在neutron中以port的形式存在,port的mtu应该等于port所在网络的mtu的大小。

单网卡部署

OpenvSwtich

单网卡部署neutron-openvswitch-agent时,需要事先添加ovs网桥。

1
2
3
4
5
6
7
ovs-vsctl add-br br-ex
ovs-vsctl add-port br-ex ens0
ovs-vsctl show
ip link set br-ex up
ip addr flush ens0
ip addr add 192.168.0.2/24 dev br-ex
ip route add default via 192.168.0.1 dev br-ex

Linux Bridge

单网卡部署neutron-linuxbridge-agent时,需要事先添加linux bridge网桥。

1
2
3
4
5
6
7
brctl addbr br-ex
brctl addif br-ex ens0
brctl show
ip link set br-ex up
ip addr flush ens0
ip addr add 192.168.0.2/24 dev br-ex
ip route add default via 192.168.0.1 dev br-ex