@@ -167,6 +167,21 @@ def ipv6_link_local_addr(mac=None):
167167 return IPAddress ('fe80::' + ':' .join (re .findall (r'.{4}' , eui64 )))
168168
169169
170+ def split_ips_by_family (ips ):
171+ if type (ips ) is str :
172+ ips = [ip for ip in ips .split (';' ) if ip != '' ]
173+
174+ ip4s = []
175+ ip6s = []
176+ for ip in ips :
177+ version = IPNetwork (ip ).version
178+ if version == 4 :
179+ ip4s .append (ip )
180+ elif version == 6 :
181+ ip6s .append (ip )
182+ return ip4s , ip6s
183+
184+
170185def destroy_network_rules_for_vm (vm_name , vif = None ):
171186 vmchain = iptables_chain_name (vm_name )
172187 vmchain_egress = egress_chain_name (vm_name )
@@ -405,10 +420,17 @@ def network_rules_vmSecondaryIp(vm_name, ip_secondary, action):
405420 domid = getvmId (vm_name )
406421
407422 vmchain = vm_name
408- add_to_ipset (vmchain , [ip_secondary ], action )
423+ vmchain6 = vmchain + '-6'
424+
425+ ip4s , ip6s = split_ips_by_family (ip_secondary )
426+
427+ add_to_ipset (vmchain , ip4s , action )
428+
429+ #add ebtables rules for the secondary ips
430+ ebtables_rules_vmip (vm_name , ip4s , action )
409431
410- #add ebtables rules for the secondary ip
411- ebtables_rules_vmip ( vm_name , [ ip_secondary ] , action )
432+ #add ipv6 addresses to ipv6 ipset
433+ add_to_ipset ( vmchain6 , ip6s , action )
412434
413435 return True
414436
@@ -460,6 +482,8 @@ def default_network_rules(vm_name, vm_id, vm_ip, vm_ip6, vm_mac, vif, brname, se
460482
461483 action = "-A"
462484 vmipsetName = ipset_chain_name (vm_name )
485+ vmipsetName6 = vmipsetName + '-6'
486+
463487 #create ipset and add vm ips to that ip set
464488 if not create_ipset_forvm (vmipsetName ):
465489 logging .debug (" failed to create ipset for rule " + str (tokens ))
@@ -474,13 +498,19 @@ def default_network_rules(vm_name, vm_id, vm_ip, vm_ip6, vm_mac, vif, brname, se
474498 secIpSet = "1"
475499 ips = sec_ips .split (';' )
476500 ips .pop ()
477- if ips [0 ] == "0" :
501+
502+ if len (ips ) == 0 or ips [0 ] == "0" :
478503 secIpSet = "0"
504+ ip4s = []
505+ ip6s = []
479506
480507 if secIpSet == "1" :
481- logging .debug ("Adding ipset for secondary ips" )
482- add_to_ipset (vmipsetName , ips , action )
483- if not write_secip_log_for_vm (vm_name , sec_ips , vm_id ):
508+ logging .debug ("Adding ipset for secondary ipv4 addresses" )
509+ ip4s , ip6s = split_ips_by_family (ips )
510+
511+ add_to_ipset (vmipsetName , ip4s , action )
512+
513+ if write_secip_log_for_vm (vm_name , sec_ips , vm_id ) == False :
484514 logging .debug ("Failed to log default network rules, ignoring" )
485515
486516 try :
@@ -505,15 +535,13 @@ def default_network_rules(vm_name, vm_id, vm_ip, vm_ip6, vm_mac, vif, brname, se
505535
506536 default_ebtables_rules (vm_name , vm_ip , vm_mac , vif )
507537 #default ebtables rules for vm secondary ips
508- ebtables_rules_vmip (vm_name , ips , "-I" )
538+ ebtables_rules_vmip (vm_name , ip4s , "-I" )
509539
510540 if vm_ip :
511541 if not write_rule_log_for_vm (vmName , vm_id , vm_ip , domID , '_initial_' , '-1' ):
512542 logging .debug ("Failed to log default network rules, ignoring" )
513543
514- vm_ip6_set_name = vm_name + '-6'
515-
516- if not create_ipset_forvm (vm_ip6_set_name , family = 'inet6' , type = 'hash:net' ):
544+ if not create_ipset_forvm (vmipsetName6 , family = 'inet6' , type = 'hash:net' ):
517545 logging .debug (" failed to create ivp6 ipset for rule " + str (tokens ))
518546 return False
519547
@@ -525,7 +553,10 @@ def default_network_rules(vm_name, vm_id, vm_ip, vm_ip6, vm_mac, vif, brname, se
525553 except AddrFormatError :
526554 pass
527555
528- add_to_ipset (vm_ip6_set_name , vm_ip6_addr , action )
556+ add_to_ipset (vmipsetName6 , vm_ip6_addr , action )
557+ if secIpSet == "1" :
558+ logging .debug ("Adding ipset for secondary ipv6 addresses" )
559+ add_to_ipset (vmipsetName6 , ip6s , action )
529560
530561 try :
531562 execute ('ip6tables -A ' + brfw + '-OUT' + ' -m physdev --physdev-is-bridged --physdev-out ' + vif + ' -j ' + vmchain_default )
@@ -540,20 +571,20 @@ def default_network_rules(vm_name, vm_id, vm_ip, vm_ip6, vm_mac, vif, brname, se
540571 # Allow neighbor solicitations and advertisements
541572 execute ('ip6tables -A ' + vmchain_default + ' -m physdev --physdev-is-bridged --physdev-in ' + vif + ' -p icmpv6 --icmpv6-type neighbor-solicitation -m hl --hl-eq 255 -j RETURN' )
542573 execute ('ip6tables -A ' + vmchain_default + ' -m physdev --physdev-is-bridged --physdev-out ' + vif + ' -p icmpv6 --icmpv6-type neighbor-solicitation -m hl --hl-eq 255 -j ACCEPT' )
543- execute ('ip6tables -A ' + vmchain_default + ' -m physdev --physdev-is-bridged --physdev-in ' + vif + ' -p icmpv6 --icmpv6-type neighbor-advertisement -m set --match-set ' + vm_ip6_set_name + ' src -m hl --hl-eq 255 -j RETURN' )
574+ execute ('ip6tables -A ' + vmchain_default + ' -m physdev --physdev-is-bridged --physdev-in ' + vif + ' -p icmpv6 --icmpv6-type neighbor-advertisement -m set --match-set ' + vmipsetName6 + ' src -m hl --hl-eq 255 -j RETURN' )
544575 execute ('ip6tables -A ' + vmchain_default + ' -m physdev --physdev-is-bridged --physdev-out ' + vif + ' -p icmpv6 --icmpv6-type neighbor-advertisement -m hl --hl-eq 255 -j ACCEPT' )
545576
546577 # Packets to allow as per RFC4890
547- execute ('ip6tables -A ' + vmchain_default + ' -m physdev --physdev-is-bridged --physdev-in ' + vif + ' -p icmpv6 --icmpv6-type packet-too-big -m set --match-set ' + vm_ip6_set_name + ' src -j RETURN' )
578+ execute ('ip6tables -A ' + vmchain_default + ' -m physdev --physdev-is-bridged --physdev-in ' + vif + ' -p icmpv6 --icmpv6-type packet-too-big -m set --match-set ' + vmipsetName6 + ' src -j RETURN' )
548579 execute ('ip6tables -A ' + vmchain_default + ' -m physdev --physdev-is-bridged --physdev-out ' + vif + ' -p icmpv6 --icmpv6-type packet-too-big -j ACCEPT' )
549580
550- execute ('ip6tables -A ' + vmchain_default + ' -m physdev --physdev-is-bridged --physdev-in ' + vif + ' -p icmpv6 --icmpv6-type destination-unreachable -m set --match-set ' + vm_ip6_set_name + ' src -j RETURN' )
581+ execute ('ip6tables -A ' + vmchain_default + ' -m physdev --physdev-is-bridged --physdev-in ' + vif + ' -p icmpv6 --icmpv6-type destination-unreachable -m set --match-set ' + vmipsetName6 + ' src -j RETURN' )
551582 execute ('ip6tables -A ' + vmchain_default + ' -m physdev --physdev-is-bridged --physdev-out ' + vif + ' -p icmpv6 --icmpv6-type destination-unreachable -j ACCEPT' )
552583
553- execute ('ip6tables -A ' + vmchain_default + ' -m physdev --physdev-is-bridged --physdev-in ' + vif + ' -p icmpv6 --icmpv6-type time-exceeded -m set --match-set ' + vm_ip6_set_name + ' src -j RETURN' )
584+ execute ('ip6tables -A ' + vmchain_default + ' -m physdev --physdev-is-bridged --physdev-in ' + vif + ' -p icmpv6 --icmpv6-type time-exceeded -m set --match-set ' + vmipsetName6 + ' src -j RETURN' )
554585 execute ('ip6tables -A ' + vmchain_default + ' -m physdev --physdev-is-bridged --physdev-out ' + vif + ' -p icmpv6 --icmpv6-type time-exceeded -j ACCEPT' )
555586
556- execute ('ip6tables -A ' + vmchain_default + ' -m physdev --physdev-is-bridged --physdev-in ' + vif + ' -p icmpv6 --icmpv6-type parameter-problem -m set --match-set ' + vm_ip6_set_name + ' src -j RETURN' )
587+ execute ('ip6tables -A ' + vmchain_default + ' -m physdev --physdev-is-bridged --physdev-in ' + vif + ' -p icmpv6 --icmpv6-type parameter-problem -m set --match-set ' + vmipsetName6 + ' src -j RETURN' )
557588 execute ('ip6tables -A ' + vmchain_default + ' -m physdev --physdev-is-bridged --physdev-out ' + vif + ' -p icmpv6 --icmpv6-type parameter-problem -j ACCEPT' )
558589
559590 # MLDv2 discovery packets
@@ -565,14 +596,14 @@ def default_network_rules(vm_name, vm_id, vm_ip, vm_ip6, vm_mac, vif, brname, se
565596 execute ('ip6tables -A ' + vmchain_default + ' -m physdev --physdev-is-bridged --physdev-in ' + vif + ' -p udp --sport 547 ! --dst fe80::/64 -j DROP' )
566597
567598 # Always allow outbound DNS over UDP and TCP
568- execute ('ip6tables -A ' + vmchain_default + ' -m physdev --physdev-is-bridged --physdev-in ' + vif + ' -p udp --dport 53 -m set --match-set ' + vm_ip6_set_name + ' src -j RETURN' )
569- execute ('ip6tables -A ' + vmchain_default + ' -m physdev --physdev-is-bridged --physdev-in ' + vif + ' -p tcp --dport 53 -m set --match-set ' + vm_ip6_set_name + ' src -j RETURN' )
599+ execute ('ip6tables -A ' + vmchain_default + ' -m physdev --physdev-is-bridged --physdev-in ' + vif + ' -p udp --dport 53 -m set --match-set ' + vmipsetName6 + ' src -j RETURN' )
600+ execute ('ip6tables -A ' + vmchain_default + ' -m physdev --physdev-is-bridged --physdev-in ' + vif + ' -p tcp --dport 53 -m set --match-set ' + vmipsetName6 + ' src -j RETURN' )
570601
571602 # Prevent source address spoofing
572- execute ('ip6tables -A ' + vmchain_default + ' -m physdev --physdev-is-bridged --physdev-in ' + vif + ' -m set ! --match-set ' + vm_ip6_set_name + ' src -j DROP' )
603+ execute ('ip6tables -A ' + vmchain_default + ' -m physdev --physdev-is-bridged --physdev-in ' + vif + ' -m set ! --match-set ' + vmipsetName6 + ' src -j DROP' )
573604
574605 # Send proper traffic to the egress chain of the Instance
575- execute ('ip6tables -A ' + vmchain_default + ' -m physdev --physdev-is-bridged --physdev-in ' + vif + ' -m set --match-set ' + vm_ip6_set_name + ' src -j ' + vmchain_egress )
606+ execute ('ip6tables -A ' + vmchain_default + ' -m physdev --physdev-is-bridged --physdev-in ' + vif + ' -m set --match-set ' + vmipsetName6 + ' src -j ' + vmchain_egress )
576607
577608 execute ('ip6tables -A ' + vmchain_default + ' -m physdev --physdev-is-bridged --physdev-out ' + vif + ' -j ' + vmchain )
578609
0 commit comments