我的知乎专栏:云计算实战技能
背景
最近接到一些通用需求,期望单机版Openstack下,有一个虚机能做网关,负责管理VPC里的其他虚机,并且这个虚机能从外面访问,基于此需求,用一台物理机搭建了AllinOne的Openstack环境,VPC网络,虚机采用本地盘方式。
openstack部署过程略
有几个注意的配置
1. 本地盘glance-api配置
[glance_store]
default_store = file
2. 创建全通安全组,创建网络,上传qcow2的镜像
创建网络
neutron net-create vpc2
neutron subnet-create --name vpc2-subnet --gateway 30.0.0.1 --allocation-pool start=30.0.0.2,end=30.0.0.254 --enable-dhcp vpc2 30.0.0.0/24
创建网关虚机,占用.1的地址
nova boot --flavor 1u_1048M_400g --image=34753dbc-e038-4f28-8259-2d409eef523e --nic net-name=vpc2,v4-fixed-ip=30.0.0.1 --security-groups fb828b5c-59ba-44a6-9218-b4b823fb4a9d test1
对网关虚机进行额外配置
- 在宿主机上创建br0,设置IP
brctl add br0
ip link set dev br0 up
ifconfig br0 30.0.0.1/24
- 在宿主机上给网关虚机加一个网卡
virsh attach-interface 1 --type bridge --source br0 --model virtio --persistent
- 如果要卸载,执行下面命令
virsh detach-interface 1 --type bridge --mac 52:54:00:f2:fe:fa --persistent
- 在虚机内配置ip地址
ifconfig eth1 30.0.0.10/24
- 出-在宿主机上添加规则,使得虚机能往外出流量
iptables -t nat -A POSTROUTING -s 30.0.0.0/24 ! -o br0 -j MASQUERADE
- 入-端口映射,使得从外面可以直接访问虚机,将宿主机2000端口映射到虚机的22端口
iptables -t nat -A PREROUTING -m tcp -p tcp --dport 2000 -j DNAT --to-destination 30.0.0.10:22
- 另外,注意转发是否开启
sysctl -w net.ipv4.ip_forward=1
- 还有,iptables里的forward策略,在我的环境里,forward的policy是drop,所以要加上这两条
iptables -A FORWARD -p all -i br0 -j ACCEPT
iptables -A FORWARD -p all -i eth1 -j ACCEPT
- 要使其他虚机能通过网关vm出外网,需要在网关vm里 sysctl -w net.ipv4.ip_forward=1
然后添加 iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
- 同时放行allow-address-pair
neutron port-update fcc858e1-d61b-4840-8519-499d9e2c6244 --allowed-address-pair ip_address=0.0.0.0/0
创建普通虚机
nova boot --flavor 1u_1048M_400g --image=34753dbc-e038-4f28-8259-2d409eef523e --nic net-name=vpc2 --security-groups fb828b5c-59ba-44a6-9218-b4b823fb4a9d test2
在虚机内看到
从外部访问网关虚机
ssh root@<host ip> -p 2000
普通虚机可经过网关虚机出外网