[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATH] tools/hotplug/Linux: Add IPv6 support to vif-common filtering



On Mon, 2013-05-13 at 14:55 +0100, Sylvain Munaut wrote:
> The vif-common.sh hotplug script doesn't support ipv6 iptables
> filtering setup. The attached patch adds basic filtering capability so
> that if an IPv6 is specified, it's added to the 'authorized' source
> list.
> Basically the same behavior as for ipv4.
> 
> I've been using this patch for some time on xen 4.1 and I've just
> forward ported it to xen master (it applied cleanly and didn't see any
> changes that would matter).

Thanks, this looks plausible, at least as far as I am able to tell. Is
there anyone around who could review this from the ipv6/iptables PoV?

WRT the release, we are now frozen for 4.3 and I'd be concerned about
introducing a subtle (or not so subtle) networking regression. George
what do you think?

I notice you use --physdev-out -- I got the impression that this wasn't
supported any more (occasional bug reports about a warning message). TBH
I don't know enough about what it does to say one way or the other.

One minor niggle, you've spelt "explicitly" as "explicitely".

> 
> Cheers,
> 
>     Sylvain

> From c6561a403a2c8b1afaf5f336d2df95aceb362cbc Mon Sep 17 00:00:00 2001
> From: Sylvain Munaut <s.munaut@xxxxxxxxxxxxxxxxxxxx>
> Date: Mon, 13 May 2013 15:52:14 +0200
> Subject: [PATCH] tools/hotplug/Linux: Add IPv6 support to vif-common filtering
> 
> By default DomU are not allow to send router-advertisement
> message. Set the ipv6_allow_ra config option to yet to allow it.
> 
> Signed-off-by: Sylvain Munaut <s.munaut@xxxxxxxxxxxxxxxxxxxx>
> ---
>  tools/hotplug/Linux/vif-common.sh | 103 
> ++++++++++++++++++++++++++++++++++++--
>  1 file changed, 99 insertions(+), 4 deletions(-)
> 
> diff --git a/tools/hotplug/Linux/vif-common.sh 
> b/tools/hotplug/Linux/vif-common.sh
> index 73ee241..d5c51e7 100644
> --- a/tools/hotplug/Linux/vif-common.sh
> +++ b/tools/hotplug/Linux/vif-common.sh
> @@ -121,8 +121,11 @@ fi
>  ip=${ip:-}
>  ip=$(xenstore_read_default "$XENBUS_PATH/ip" "$ip")
>  
> +ipv6_allow_ra=$(xenstore_read_default "$XENBUS_PATH/ipv6_allow_ra" "false")
> +
>  frob_iptable()
>  {
> +  # Add or remove
>    if [ "$command" == "online" ]
>    then
>      local c="-I"
> @@ -130,6 +133,7 @@ frob_iptable()
>      local c="-D"
>    fi
>  
> +  # Main rules
>    iptables "$c" FORWARD -m physdev --physdev-is-bridged --physdev-in "$dev" \
>      "$@" -j ACCEPT 2>/dev/null &&
>    iptables "$c" FORWARD -m physdev --physdev-is-bridged --physdev-out "$dev" 
> \
> @@ -139,6 +143,61 @@ frob_iptable()
>    then
>      log err "iptables setup failed. This may affect guest networking."
>    fi
> +
> +  # Always allow the domain to talk to a DHCP server.
> +  if [ -n "$1" ]
> +  then
> +    iptables "$c" FORWARD -m physdev --physdev-is-bridged --physdev-in 
> "$dev" \
> +      -p udp --sport 68 --dport 67 -j ACCEPT 2>/dev/null
> +  fi
> +
> +  if [ "$command" == "online" -a $? -ne 0 ]
> +  then
> +    log err "iptables setup failed. This may affect guest networking."
> +  fi
> +}
> +
> +frob_ip6table()
> +{
> +  # Add or remove
> +  if [ "$command" == "online" ]
> +  then
> +    local c="-I"
> +  else
> +    local c="-D"
> +  fi
> +
> +  # Main rules
> +  ip6tables "$c" FORWARD -m physdev --physdev-is-bridged --physdev-in "$dev" 
> \
> +    "$@" -j ACCEPT 2>/dev/null &&
> +  ip6tables "$c" FORWARD -m physdev --physdev-is-bridged --physdev-out 
> "$dev" \
> +    -j ACCEPT 2>/dev/null
> +
> +  if [ "$command" == "online" -a $? -ne 0 ]
> +  then
> +    log err "ip6tables setup failed. This may affect guest networking."
> +  fi
> +
> +  # Filter out RA if not explicitely allowed
> +  if [ "$ipv6_allow_ra" != "true" ]
> +  then
> +    ip6tables "$c" FORWARD -m physdev --physdev-is-bridged --physdev-in 
> "$dev" \
> +      -p icmpv6 --icmpv6-type router-advertisement -j DROP 2>/dev/null
> +  fi
> +
> +  if [ "$command" == "online" -a $? -ne 0 ]
> +  then
> +    log err "ip6tables setup failed. This may affect guest networking."
> +  fi
> +}
> +
> +
> +##
> +# Check if the given IP is IPv6 or not
> +#
> +is_ipv6()
> +{
> +        echo "$1" | perl -wane '/:/ && print "yes"'
>  }
>  
>  
> @@ -167,14 +226,17 @@ handle_iptable()
>        local addr
>        for addr in $ip
>        do
> -        frob_iptable -s "$addr"
> +        result=$(is_ipv6 "${addr}")
> +        if [ -z "${result}" ] ; then
> +          frob_iptable -s "$addr"
> +        else
> +          frob_ip6table -s "$addr"
> +        fi
>        done
> -
> -      # Always allow the domain to talk to a DHCP server.
> -      frob_iptable -p udp --sport 68 --dport 67
>    else
>        # No IP addresses have been specified, so allow anything.
>        frob_iptable
> +      frob_ip6table
>    fi
>  
>    release_lock "iptables"
> @@ -213,3 +275,36 @@ dom0_ip()
>    fi
>    echo "$result"
>  }
> +
> +
> +##
> +# ip6_of interface
> +#
> +# Print the first IPv6 address currently in use at the given interface, or 
> nothing if
> +# the interface is not up.
> +#
> +ip6_of()
> +{
> +        ip -6 addr show primary dev "$1" | perl -wane '/scope global/ && 
> /inet6 (([0-9a-f]+:*)+)/ && print $1;'
> +}
> +
> +
> +##
> +# dom0_ip6
> +#
> +# Print the IPv6 address of the interface in dom0 through which we are 
> routing.
> +# This is the IP address on the interface specified as "netdev" as a 
> parameter
> +# to these scripts, or eth0 by default.  This function will call fatal if no
> +# such interface could be found.
> +#
> +dom0_ip6()
> +{
> +  local nd=${netdev:-eth0}
> +  local result=$(ip6_of "$nd")
> +  if [ -z "$result" ]
> +  then
> +        ""
> +  else
> +        echo "$result"
> +  fi
> +}
> -- 
> 1.8.1.5


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.