[ https://issues.apache.org/jira/browse/CLOUDSTACK-74?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Rohit Yadav resolved CLOUDSTACK-74. ----------------------------------- Resolution: Fixed As per Wido on IRC: >From bdec29b3dcf916ee8260b3011928a70f513ce145 Mon Sep 17 00:00:00 2001 From: Wido den Hollander <w...@widodh.nl> Date: Tue, 19 Jun 2012 12:20:22 +0200 Subject: [PATCH] Create iptable rules for all bridges assigned to a system VM > CloudStack distributes incorrect IPtables rules to its KVM hosts > ---------------------------------------------------------------- > > Key: CLOUDSTACK-74 > URL: https://issues.apache.org/jira/browse/CLOUDSTACK-74 > Project: CloudStack > Issue Type: Bug > Components: Install and Setup, KVM, Network Controller > Affects Versions: pre-4.0.0 > Reporter: Vladimir Ostrovsky > > Some strange issue with IPtables rules created by CloudStack 3.0.4 on KVM > hosts: > I have a Basic zone of 3 KVM hosts: > • 1st host runs Console Proxy, v-2-VM > • 2nd host is unused > • 3rd host runs Secondary Storage VM, s-1-VM > Each host has two network interfaces: > • eth0 (bridge cloudbr0), connected to isolated private network (used to > communicate with CloudStack management server, with Primary & Secondary > storages and so on). > • eth1 (bridge cloudbr1), connected to public / external network (goes to > Internet, used by customers to communicate with VMs in the Basic zone and > with Console Proxy, used by SSVM to upload / download templates). > The problem: > • Console Proxy doesn’t have communication with private network (with > CloudStack, in first place). > • SSVM doesn’t have communication with external network (for example, > Internet). > Why it happens: > On 1st host, the IPtables rules of FORWARD chain look like this: > Chain FORWARD (policy DROP 4690 packets, 242K bytes) > pkts bytes target prot opt in out source destination > 996 34620 BF-cloudbr1 all -- * cloudbr1 0.0.0.0/0 0.0.0.0/0 PHYSDEV match > --physdev-is-bridged > 0 0 BF-cloudbr1 all -- cloudbr1 * 0.0.0.0/0 0.0.0.0/0 PHYSDEV match > --physdev-is-bridged > 0 0 DROP all -- * cloudbr1 0.0.0.0/0 0.0.0.0/0 > 0 0 DROP all -- cloudbr1 * 0.0.0.0/0 0.0.0.0/0 > 0 0 ACCEPT all -- * virbr0 0.0.0.0/0 192.168.122.0/24 state > RELATED,ESTABLISHED > 0 0 ACCEPT all -- virbr0 * 192.168.122.0/24 0.0.0.0/0 > 0 0 ACCEPT all -- virbr0 virbr0 0.0.0.0/0 0.0.0.0/0 > 0 0 REJECT all -- * virbr0 0.0.0.0/0 0.0.0.0/0 reject-with > icmp-port-unreachable > 0 0 REJECT all -- virbr0 * 0.0.0.0/0 0.0.0.0/0 reject-with > icmp-port-unreachable > So we see that there are rules for traffic passing via cloudbr1 (public > interface), but no rules for cloudbr0 (private interface), and the default is > DROP. > On 3rd host, however, it’s exactly vice versa: > Chain FORWARD (policy DROP 887 packets, 28760 bytes) > pkts bytes target prot opt in out source destination > 597K 4206M BF-cloudbr0 all -- * cloudbr0 0.0.0.0/0 0.0.0.0/0 PHYSDEV match > --physdev-is-bridged > 0 0 BF-cloudbr0 all -- cloudbr0 * 0.0.0.0/0 0.0.0.0/0 PHYSDEV match > --physdev-is-bridged > 0 0 DROP all -- * cloudbr0 0.0.0.0/0 0.0.0.0/0 > 0 0 DROP all -- cloudbr0 * 0.0.0.0/0 0.0.0.0/0 > 0 0 ACCEPT all -- * virbr0 0.0.0.0/0 192.168.122.0/24 state > RELATED,ESTABLISHED > 0 0 ACCEPT all -- virbr0 * 192.168.122.0/24 0.0.0.0/0 > 0 0 ACCEPT all -- virbr0 virbr0 0.0.0.0/0 0.0.0.0/0 > 0 0 REJECT all -- * virbr0 0.0.0.0/0 0.0.0.0/0 reject-with > icmp-port-unreachable > 0 0 REJECT all -- virbr0 * 0.0.0.0/0 0.0.0.0/0 reject-with > icmp-port-unreachable > And on 2nd host, there are no rules for both interfaces: > Chain FORWARD (policy DROP 0 packets, 0 bytes) > pkts bytes target prot opt in out source destination > 0 0 ACCEPT all -- * virbr0 0.0.0.0/0 192.168.122.0/24 state > RELATED,ESTABLISHED > 0 0 ACCEPT all -- virbr0 * 192.168.122.0/24 0.0.0.0/0 > 0 0 ACCEPT all -- virbr0 virbr0 0.0.0.0/0 0.0.0.0/0 > 0 0 REJECT all -- * virbr0 0.0.0.0/0 0.0.0.0/0 reject-with > icmp-port-unreachable > 0 0 REJECT all -- virbr0 * 0.0.0.0/0 0.0.0.0/0 reject-with > icmp-port-unreachable > After I migrated the SSVM to the 1st host, the rules changed to: > Chain FORWARD (policy DROP 0 packets, 0 bytes) > pkts bytes target prot opt in out source destination > 98 15967 BF-cloudbr0 all -- * cloudbr0 0.0.0.0/0 0.0.0.0/0 PHYSDEV match > --physdev-is-bridged > 6 192 BF-cloudbr0 all -- cloudbr0 * 0.0.0.0/0 0.0.0.0/0 PHYSDEV match > --physdev-is-bridged > 6 192 DROP all -- * cloudbr0 0.0.0.0/0 0.0.0.0/0 > 0 0 DROP all -- cloudbr0 * 0.0.0.0/0 0.0.0.0/0 > 1107 38228 BF-cloudbr1 all -- * cloudbr1 0.0.0.0/0 0.0.0.0/0 PHYSDEV match > --physdev-is-bridged > 3 96 BF-cloudbr1 all -- cloudbr1 * 0.0.0.0/0 0.0.0.0/0 PHYSDEV match > --physdev-is-bridged > 3 96 DROP all -- * cloudbr1 0.0.0.0/0 0.0.0.0/0 > 0 0 DROP all -- cloudbr1 * 0.0.0.0/0 0.0.0.0/0 > 0 0 ACCEPT all -- * virbr0 0.0.0.0/0 192.168.122.0/24 state > RELATED,ESTABLISHED > 0 0 ACCEPT all -- virbr0 * 192.168.122.0/24 0.0.0.0/0 > 0 0 ACCEPT all -- virbr0 virbr0 0.0.0.0/0 0.0.0.0/0 > 0 0 REJECT all -- * virbr0 0.0.0.0/0 0.0.0.0/0 reject-with > icmp-port-unreachable > 0 0 REJECT all -- virbr0 * 0.0.0.0/0 0.0.0.0/0 reject-with > icmp-port-unreachable > It seems like the logic that CloudStack implements is this: > • Console Proxy doesn’t need access to private network – so only rules > for cloudbr1 are installed > • SSVM doesn’t need access to public network– so only rules for cloudbr0 > are installed > But it’s totally incorrect: > • Both need to communicate with CloudStack management server via private > network (to TCP port 8250). > • Both need to communicate with external networks: SSVM to > upload/download templates, Console Proxy – to provide VM consoles to users. > Regards, > Vladimir. > P.S. Link to the bug report on the old site: > http://bugs.cloudstack.org/browse/CS-16205 -- This message is automatically generated by JIRA. If you think it was sent incorrectly, please contact your JIRA administrators For more information on JIRA, see: http://www.atlassian.com/software/jira