@@ -75,33 +75,36 @@ def clear_bridge_rules(vif_name):
75
75
do_chain_action (ebtables , "-X" , vif_chain )
76
76
77
77
def create_bridge_rules (vif_name , config ):
78
- vif_chain = get_chain_name (vif_name )
79
- # Forward all traffic on this VIF to a new chain, with default policy DROP.
80
- do_chain_action (ebtables , "-N" , vif_chain )
81
- do_chain_action (ebtables , "-A" , "FORWARD" , ["-i" , vif_name , "-j" , vif_chain ])
82
- do_chain_action (ebtables , "-A" , "FORWARD" , ["-o" , vif_name , "-j" , vif_chain ])
83
- do_chain_action (ebtables , "-P" , vif_chain , ["DROP" ])
84
- # We now need to create rules to allow valid traffic.
85
- mac = config ["mac" ]
86
- # We only fully support IPv4 multitenancy with bridge.
87
- # We allow all IPv6 traffic if any IPv6 addresses are associated with the VIF.
88
- ipv4_allowed = config ["ipv4_allowed" ]
89
- ipv6_allowed = config ["ipv6_allowed" ]
90
- # Accept all traffic going to the VM.
91
- do_chain_action (ebtables , "-A" , vif_chain , ["-o" , vif_name , "-j" , "ACCEPT" ])
92
- # Drop everything not coming from the correct MAC.
93
- do_chain_action (ebtables , "-A" , vif_chain , ["-s" , "!" , mac , "-i" , vif_name , "-j" , "DROP" ])
94
- # Accept DHCP.
95
- do_chain_action (ebtables , "-A" , vif_chain , ["-p" , "IPv4" , "-i" , vif_name , "--ip-protocol" , "UDP" , "--ip-dport" , "67" , "-j" , "ACCEPT" ])
96
- for ipv4 in ipv4_allowed :
97
- # Accept ARP travelling from known IP addresses, also filtering ARP replies by MAC.
98
- do_chain_action (ebtables , "-A" , vif_chain , ["-p" , "ARP" , "-i" , vif_name , "--arp-opcode" , "Request" , "--arp-ip-src" , ipv4 , "-j" , "ACCEPT" ])
99
- do_chain_action (ebtables , "-A" , vif_chain , ["-p" , "ARP" , "-i" , vif_name , "--arp-opcode" , "Reply" , "--arp-ip-src" , ipv4 , "--arp-mac-src" , mac , "-j" , "ACCEPT" ])
100
- # Accept IP travelling from known IP addresses.
101
- do_chain_action (ebtables , "-A" , vif_chain , ["-p" , "IPv4" , "-i" , vif_name , "--ip-src" , ipv4 , "-j" , "ACCEPT" ])
102
- if ipv6_allowed != []:
103
- # Accept all IPv6 traffic.
104
- do_chain_action (ebtables , "-A" , vif_chain , ["-p" , "IPv6" , "-i" , vif_name , "-j" , "ACCEPT" ])
78
+ locking_mode = config ["locking_mode" ]
79
+ if locking_mode == "locked" or locking_mode == "disabled" :
80
+ vif_chain = get_chain_name (vif_name )
81
+ # Forward all traffic on this VIF to a new chain, with default policy DROP.
82
+ do_chain_action (ebtables , "-N" , vif_chain )
83
+ do_chain_action (ebtables , "-A" , "FORWARD" , ["-i" , vif_name , "-j" , vif_chain ])
84
+ do_chain_action (ebtables , "-A" , "FORWARD" , ["-o" , vif_name , "-j" , vif_chain ])
85
+ do_chain_action (ebtables , "-P" , vif_chain , ["DROP" ])
86
+ if locking_mode == "locked" :
87
+ # We now need to create rules to allow valid traffic.
88
+ mac = config ["mac" ]
89
+ # We only fully support IPv4 multitenancy with bridge.
90
+ # We allow all IPv6 traffic if any IPv6 addresses are associated with the VIF.
91
+ ipv4_allowed = config ["ipv4_allowed" ]
92
+ ipv6_allowed = config ["ipv6_allowed" ]
93
+ # Accept all traffic going to the VM.
94
+ do_chain_action (ebtables , "-A" , vif_chain , ["-o" , vif_name , "-j" , "ACCEPT" ])
95
+ # Drop everything not coming from the correct MAC.
96
+ do_chain_action (ebtables , "-A" , vif_chain , ["-s" , "!" , mac , "-i" , vif_name , "-j" , "DROP" ])
97
+ # Accept DHCP.
98
+ do_chain_action (ebtables , "-A" , vif_chain , ["-p" , "IPv4" , "-i" , vif_name , "--ip-protocol" , "UDP" , "--ip-dport" , "67" , "-j" , "ACCEPT" ])
99
+ for ipv4 in ipv4_allowed :
100
+ # Accept ARP travelling from known IP addresses, also filtering ARP replies by MAC.
101
+ do_chain_action (ebtables , "-A" , vif_chain , ["-p" , "ARP" , "-i" , vif_name , "--arp-opcode" , "Request" , "--arp-ip-src" , ipv4 , "-j" , "ACCEPT" ])
102
+ do_chain_action (ebtables , "-A" , vif_chain , ["-p" , "ARP" , "-i" , vif_name , "--arp-opcode" , "Reply" , "--arp-ip-src" , ipv4 , "--arp-mac-src" , mac , "-j" , "ACCEPT" ])
103
+ # Accept IP travelling from known IP addresses.
104
+ do_chain_action (ebtables , "-A" , vif_chain , ["-p" , "IPv4" , "-i" , vif_name , "--ip-src" , ipv4 , "-j" , "ACCEPT" ])
105
+ if ipv6_allowed != []:
106
+ # Accept all IPv6 traffic.
107
+ do_chain_action (ebtables , "-A" , vif_chain , ["-p" , "IPv6" , "-i" , vif_name , "-j" , "ACCEPT" ])
105
108
106
109
def acquire_lock (path ):
107
110
lock_file = open (path , 'w' )
@@ -123,9 +126,7 @@ def handle_bridge(vif_name, domuuid, devid, action):
123
126
clear_bridge_rules (vif_name )
124
127
if action == "filter" :
125
128
config = get_locking_config (domuuid , devid )
126
- locking_mode = config ["locking_mode" ]
127
- if locking_mode == "locked" :
128
- create_bridge_rules (vif_name , config )
129
+ create_bridge_rules (vif_name , config )
129
130
ip_link_set (vif_name , "up" )
130
131
131
132
###############################################################################
@@ -143,53 +144,58 @@ def add_flow(bridge_name, args):
143
144
doexec ([ofctl , "add-flow" , bridge_name , "cookie=1," + args ])
144
145
145
146
def create_vswitch_rules (bridge_name , port , config ):
146
- mac = config ["mac" ]
147
- ipv4_allowed = config ["ipv4_allowed" ]
148
- ipv6_allowed = config ["ipv6_allowed" ]
149
- # Allow DHCP traffic (outgoing UDP on port 67).
150
- add_flow (bridge_name , "in_port=%s,priority=8000,dl_type=0x0800,nw_proto=0x11,"
151
- "tp_dst=67,dl_src=%s,idle_timeout=0,action=normal" % (port , mac ))
152
- # Filter ARP requests.
153
- add_flow (bridge_name , "in_port=%s,priority=7000,dl_type=0x0806,dl_src=%s,arp_sha=%s,"
154
- "nw_src=0.0.0.0,idle_timeout=0,action=normal" % (port , mac , mac ))
155
- for ipv4 in ipv4_allowed :
156
- # Filter ARP responses.
147
+ locking_mode = config ["locking_mode" ]
148
+ if locking_mode == "locked" :
149
+ mac = config ["mac" ]
150
+ ipv4_allowed = config ["ipv4_allowed" ]
151
+ ipv6_allowed = config ["ipv6_allowed" ]
152
+ # Allow DHCP traffic (outgoing UDP on port 67).
153
+ add_flow (bridge_name , "in_port=%s,priority=8000,dl_type=0x0800,nw_proto=0x11,"
154
+ "tp_dst=67,dl_src=%s,idle_timeout=0,action=normal" % (port , mac ))
155
+ # Filter ARP requests.
157
156
add_flow (bridge_name , "in_port=%s,priority=7000,dl_type=0x0806,dl_src=%s,arp_sha=%s,"
158
- "nw_src=%s,idle_timeout=0,action=normal" % (port , mac , mac , ipv4 ))
159
- # Allow traffic from specified ipv4 addresses.
160
- add_flow (bridge_name , "in_port=%s,priority=6000,dl_type=0x0800,nw_src=%s,"
161
- "dl_src=%s,idle_timeout=0,action=normal" % (port , ipv4 , mac ))
162
- for ipv6 in ipv6_allowed :
163
- # Neighbour solicitation.
164
- add_flow (bridge_name , "in_port=%s,priority=8000,dl_src=%s,icmp6,ipv6_src=%s,"
165
- "icmp_type=135,nd_sll=%s,idle_timeout=0,action=normal" % (port , mac , ipv6 , mac ))
166
- # Neighbour advertisement.
167
- add_flow (bridge_name , "in_port=%s,priority=8000,dl_src=%s,icmp6,ipv6_src=%s,"
168
- "icmp_type=136,nd_target=%s,idle_timeout=0,action=normal" % (port , mac , ipv6 , ipv6 ))
169
- # Allow traffic from specified ipv6 addresses.
170
- add_flow (bridge_name , "in_port=%s,priority=5000,dl_src=%s,ipv6_src=%s,icmp6,action=normal" % (port , mac , ipv6 ))
171
- add_flow (bridge_name , "in_port=%s,priority=5000,dl_src=%s,ipv6_src=%s,tcp6,action=normal" % (port , mac , ipv6 ))
172
- add_flow (bridge_name , "in_port=%s,priority=5000,dl_src=%s,ipv6_src=%s,udp6,action=normal" % (port , mac , ipv6 ))
173
- # Drop all other neighbour discovery.
174
- add_flow (bridge_name , "in_port=%s,priority=7000,icmp6,icmp_type=135,action=drop" % port )
175
- add_flow (bridge_name , "in_port=%s,priority=7000,icmp6,icmp_type=136,action=drop" % port )
176
- # Drop other specific ICMPv6 types.
177
- # Router advertisement.
178
- add_flow (bridge_name , "in_port=%s,priority=6000,icmp6,icmp_type=134,action=drop" % port )
179
- # Redirect gateway.
180
- add_flow (bridge_name , "in_port=%s,priority=6000,icmp6,icmp_type=137,action=drop" % port )
181
- # Mobile prefix solicitation.
182
- add_flow (bridge_name , "in_port=%s,priority=6000,icmp6,icmp_type=146,action=drop" % port )
183
- # Mobile prefix advertisement.
184
- add_flow (bridge_name , "in_port=%s,priority=6000,icmp6,icmp_type=147,action=drop" % port )
185
- # Multicast router advertisement.
186
- add_flow (bridge_name , "in_port=%s,priority=6000,icmp6,icmp_type=151,action=drop" % port )
187
- # Multicast router solicitation.
188
- add_flow (bridge_name , "in_port=%s,priority=6000,icmp6,icmp_type=152,action=drop" % port )
189
- # Multicast router termination.
190
- add_flow (bridge_name , "in_port=%s,priority=6000,icmp6,icmp_type=153,action=drop" % port )
191
- # Drop everything else.
192
- add_flow (bridge_name , "in_port=%s,priority=4000,idle_timeout=0,action=drop" % port )
157
+ "nw_src=0.0.0.0,idle_timeout=0,action=normal" % (port , mac , mac ))
158
+ for ipv4 in ipv4_allowed :
159
+ # Filter ARP responses.
160
+ add_flow (bridge_name , "in_port=%s,priority=7000,dl_type=0x0806,dl_src=%s,arp_sha=%s,"
161
+ "nw_src=%s,idle_timeout=0,action=normal" % (port , mac , mac , ipv4 ))
162
+ # Allow traffic from specified ipv4 addresses.
163
+ add_flow (bridge_name , "in_port=%s,priority=6000,dl_type=0x0800,nw_src=%s,"
164
+ "dl_src=%s,idle_timeout=0,action=normal" % (port , ipv4 , mac ))
165
+ for ipv6 in ipv6_allowed :
166
+ # Neighbour solicitation.
167
+ add_flow (bridge_name , "in_port=%s,priority=8000,dl_src=%s,icmp6,ipv6_src=%s,"
168
+ "icmp_type=135,nd_sll=%s,idle_timeout=0,action=normal" % (port , mac , ipv6 , mac ))
169
+ # Neighbour advertisement.
170
+ add_flow (bridge_name , "in_port=%s,priority=8000,dl_src=%s,icmp6,ipv6_src=%s,"
171
+ "icmp_type=136,nd_target=%s,idle_timeout=0,action=normal" % (port , mac , ipv6 , ipv6 ))
172
+ # Allow traffic from specified ipv6 addresses.
173
+ add_flow (bridge_name , "in_port=%s,priority=5000,dl_src=%s,ipv6_src=%s,icmp6,action=normal" % (port , mac , ipv6 ))
174
+ add_flow (bridge_name , "in_port=%s,priority=5000,dl_src=%s,ipv6_src=%s,tcp6,action=normal" % (port , mac , ipv6 ))
175
+ add_flow (bridge_name , "in_port=%s,priority=5000,dl_src=%s,ipv6_src=%s,udp6,action=normal" % (port , mac , ipv6 ))
176
+ # Drop all other neighbour discovery.
177
+ add_flow (bridge_name , "in_port=%s,priority=7000,icmp6,icmp_type=135,action=drop" % port )
178
+ add_flow (bridge_name , "in_port=%s,priority=7000,icmp6,icmp_type=136,action=drop" % port )
179
+ # Drop other specific ICMPv6 types.
180
+ # Router advertisement.
181
+ add_flow (bridge_name , "in_port=%s,priority=6000,icmp6,icmp_type=134,action=drop" % port )
182
+ # Redirect gateway.
183
+ add_flow (bridge_name , "in_port=%s,priority=6000,icmp6,icmp_type=137,action=drop" % port )
184
+ # Mobile prefix solicitation.
185
+ add_flow (bridge_name , "in_port=%s,priority=6000,icmp6,icmp_type=146,action=drop" % port )
186
+ # Mobile prefix advertisement.
187
+ add_flow (bridge_name , "in_port=%s,priority=6000,icmp6,icmp_type=147,action=drop" % port )
188
+ # Multicast router advertisement.
189
+ add_flow (bridge_name , "in_port=%s,priority=6000,icmp6,icmp_type=151,action=drop" % port )
190
+ # Multicast router solicitation.
191
+ add_flow (bridge_name , "in_port=%s,priority=6000,icmp6,icmp_type=152,action=drop" % port )
192
+ # Multicast router termination.
193
+ add_flow (bridge_name , "in_port=%s,priority=6000,icmp6,icmp_type=153,action=drop" % port )
194
+ # Drop everything else.
195
+ add_flow (bridge_name , "in_port=%s,priority=4000,idle_timeout=0,action=drop" % port )
196
+ elif locking_mode == "disabled" :
197
+ # Drop everything coming in on this port.
198
+ add_flow (bridge_name , "in_port=%s,priority=4000,idle_timeout=0,action=drop" % port )
193
199
194
200
def get_bridge_name_vswitch (vif_name ):
195
201
'''return bridge vif belong to'''
@@ -208,9 +214,7 @@ def handle_vswitch(vif_name, domuuid, devid, action):
208
214
clear_vswitch_rules (bridge_name , port )
209
215
if action == "filter" :
210
216
config = get_locking_config (domuuid , devid )
211
- locking_mode = config ["locking_mode" ]
212
- if locking_mode == "locked" :
213
- create_vswitch_rules (bridge_name , port , config )
217
+ create_vswitch_rules (bridge_name , port , config )
214
218
ip_link_set (vif_name , "up" )
215
219
216
220
###############################################################################
0 commit comments