Openstack Neutron - VM 作为同一租户内两个网络之间的路由器
Openstack Neutron - VM as a router between two networks within the same tenant
我有以下设置:
VM1---NET1---VM2---NET2---VM3
VM2可以ping通VM1和VM3。但是,当从VM1 ping VM3时,数据包由VM2转发但从未到达VM3(即它们被NET2丢弃,因为tcpdump显示数据包是从VM2的NET2接口发出的)。
从 VM3 ping VM1 时相同。数据包到达 VM2,然后 VM2 将它们转发给 V1,但它们永远不会到达 VM1。
看来NET2不允许带有NET1的srcIP的数据包通过。同理NET1用NET2的srcIP过滤数据包。
这就是我们在热模板中创建每个网络的方式。
net1:
type: OS::Neutron::Net
properties:
name: net1_name
net1_subnet:
type: OS::Neutron::Subnet
properties:
network_id: { get_resource: net1 }
cidr: { get_param: net1_cidr }
有没有办法让数据包通过充当路由器的VM2从NET1流向NET2?
谢谢!
==========更新====
看来我找到了解决办法:将VM1和VM3的IP添加到VM2的端口(Neutron:Port)的"allowed_address_pairs"。
VM2_left_port:
type: OS::Neutron::Port
properties:
allowed_address_pairs: [{"ip_address": { get_param: VM3_IP}}]
network: ...
fixed_ips: ...
VM2_right_port:
type: OS::Neutron::Port
properties:
allowed_address_pairs: [{"ip_address": { get_param: VM1_IP }}]
network: ...
fixed_ips: ...
问题是在 to 网络之间允许路由(使用 VM2 作为路由器)是否是正确的方法。
我认为允许 VM2 中两个网络接口之间的相互通信。
echo 1 > /proc/sys/net/ipv4/ip_forward
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
sudo iptables -A FORWARD -i eth0 -o eth1 -m state --state
RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT
所以问题实际上是 Openstack 的 "port_security" 功能阻止了从一个子网到另一个子网的流量。为了允许数据包在子网之间流动,可以使用以下选项替代我在问题 ("allowed_address_pairs") 中提出的方法。
VM2_left_port:
type: OS::Neutron::Port
properties:
security_groups: []
port_security_enabled: False
network: ...
fixed_ips: ...
VM2_right_port:
type: OS::Neutron::Port
properties:
security_groups: []
port_security_enabled: False
network: ...
fixed_ips: ...
我有以下设置:
VM1---NET1---VM2---NET2---VM3
VM2可以ping通VM1和VM3。但是,当从VM1 ping VM3时,数据包由VM2转发但从未到达VM3(即它们被NET2丢弃,因为tcpdump显示数据包是从VM2的NET2接口发出的)。
从 VM3 ping VM1 时相同。数据包到达 VM2,然后 VM2 将它们转发给 V1,但它们永远不会到达 VM1。
看来NET2不允许带有NET1的srcIP的数据包通过。同理NET1用NET2的srcIP过滤数据包。
这就是我们在热模板中创建每个网络的方式。
net1:
type: OS::Neutron::Net
properties:
name: net1_name
net1_subnet:
type: OS::Neutron::Subnet
properties:
network_id: { get_resource: net1 }
cidr: { get_param: net1_cidr }
有没有办法让数据包通过充当路由器的VM2从NET1流向NET2?
谢谢!
==========更新====
看来我找到了解决办法:将VM1和VM3的IP添加到VM2的端口(Neutron:Port)的"allowed_address_pairs"。
VM2_left_port:
type: OS::Neutron::Port
properties:
allowed_address_pairs: [{"ip_address": { get_param: VM3_IP}}]
network: ...
fixed_ips: ...
VM2_right_port:
type: OS::Neutron::Port
properties:
allowed_address_pairs: [{"ip_address": { get_param: VM1_IP }}]
network: ...
fixed_ips: ...
问题是在 to 网络之间允许路由(使用 VM2 作为路由器)是否是正确的方法。
我认为允许 VM2 中两个网络接口之间的相互通信。
echo 1 > /proc/sys/net/ipv4/ip_forward
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
sudo iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT
所以问题实际上是 Openstack 的 "port_security" 功能阻止了从一个子网到另一个子网的流量。为了允许数据包在子网之间流动,可以使用以下选项替代我在问题 ("allowed_address_pairs") 中提出的方法。
VM2_left_port:
type: OS::Neutron::Port
properties:
security_groups: []
port_security_enabled: False
network: ...
fixed_ips: ...
VM2_right_port:
type: OS::Neutron::Port
properties:
security_groups: []
port_security_enabled: False
network: ...
fixed_ips: ...