前提条件
同一个子网中得两个云主机vm1(eth0:192.168.1.2),vm2(eth0:192.168.1.3)
其中vm1还存在另外一张eth1(192.168.1.4)连接外网得网卡,vm2需要通过vm1来连接上网
vm2配置变更如下
设置vm2得网关为vm1得eth1
- route add default gw 192.168.1.4 dev eth1 #临时修改
- 在/etc/sysconfig/network中添加如下配置(永久生效):
NETWORKING=yes
GATEWAY=192.168.1.4
vm1作为网关设备得配置如下:
1. /etc/sysctl.conf中添加允许地址转发
net.ipv4.ip_forward = 1
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.default.rp_filter = 0
2. 使用sysctl -p 使得上述配置生效
3. 配置iptables规则
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE(是正常机器作为nat得配置,eth1作为外网得出口)
4. 因为openstack中防火墙(位于tap和qvb之间)规则要求严格,如果ip/mac不匹配,则会drop掉。
之前vm1使用了snat(IP伪装),使得eth1出得ip地址为外部地址,和mac地址不匹配,所以会被drop掉。
为解决这种情况,openstack需启用port-security功能,对网卡设置为allowed-address-pair(允许此port对应得mac支持其他ip)
neutron port-update <port-id> --allowed-address-pair ip_address=0.0.0.0/0
5. 如果需要开启dns解析,因为是vm2发送dns消息给vm1,对于vm1来说dns消息是ingress。对于ingress消息,安全组规则都需要添加对应允许规则才能通过
neutron security-group-rule-create <自定义name> --direction ingress --protocol 17 --remote-ip-prefix 192.168.1.3/32