|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 2/5] hotplug/linux: Improve iptables logic
On Tue, 2014-05-20 at 16:56 +0200, Sylvain Munaut wrote:
> The main goal of this is to pave the way for IPv6 support, but it
> also improves the rules by preventing duplicate incoming packets
> rules to be added.
>
> frob_iptables now takes a list of address to handle as parameter
> and creates the rules as needed. Any 'common' rule is no longer
> repeated.
>
> Here below is a comparaison of the rules before / after.
"comparison"
> <*> For the case where 'ip' is empty or not given at all:
>
> Previous:
>
> ACCEPT all 0.0.0.0/0 0.0.0.0/0 PHYSDEV match --physdev-out
> vif87.0 --physdev-is-bridged
> ACCEPT all 0.0.0.0/0 0.0.0.0/0 PHYSDEV match --physdev-in
> vif87.0 --physdev-is-bridged
>
> New:
>
> ACCEPT all 0.0.0.0/0 0.0.0.0/0 PHYSDEV match --physdev-out
> vif88.0 --physdev-is-bridged
> ACCEPT all 0.0.0.0/0 0.0.0.0/0 PHYSDEV match --physdev-in
> vif88.0 --physdev-is-bridged
>
i.e. no change?
> <*> For the case where 'ip' is set to "192.168.0.254 192.168.0.141"
> (as an example) :
>
> Previous:
>
> ACCEPT all 0.0.0.0/0 0.0.0.0/0 PHYSDEV match --physdev-out
> vif86.0 --physdev-is-bridged
> ACCEPT udp 0.0.0.0/0 0.0.0.0/0 PHYSDEV match --physdev-in
> vif86.0 --physdev-is-bridged udp spt:68 dpt:67
> ACCEPT all 0.0.0.0/0 0.0.0.0/0 PHYSDEV match --physdev-out
> vif86.0 --physdev-is-bridged
> ACCEPT all 192.168.0.141 0.0.0.0/0 PHYSDEV match --physdev-in
> vif86.0 --physdev-is-bridged
> ACCEPT all 0.0.0.0/0 0.0.0.0/0 PHYSDEV match --physdev-out
> vif86.0 --physdev-is-bridged
> ACCEPT all 192.168.0.254 0.0.0.0/0 PHYSDEV match --physdev-in
> vif86.0 --physdev-is-bridged
>
> New:
>
> ACCEPT udp 0.0.0.0/0 0.0.0.0/0 PHYSDEV match --physdev-in
> vif89.0 --physdev-is-bridged udp spt:68 dpt:67
> ACCEPT all 0.0.0.0/0 0.0.0.0/0 PHYSDEV match --physdev-out
> vif89.0 --physdev-is-bridged
> ACCEPT all 192.168.0.254 0.0.0.0/0 PHYSDEV match --physdev-in
> vif89.0 --physdev-is-bridged
> ACCEPT all 192.168.0.141 0.0.0.0/0 PHYSDEV match --physdev-in
> vif89.0 --physdev-is-bridged
>
> Signed-off-by: Sylvain Munaut <s.munaut@xxxxxxxxxxxxxxxxxxxx>
Looks good to me:
Acked-by: Ian Campbell <ian.campbell@xxxxxxxxxx>
I'm going to give it a day or two for others to comment before I apply.
When I do apply I'll fix the typo, insert the answer to that question
and unwrap the example lines as I go.
Thanks!
> ---
> tools/hotplug/Linux/vif-common.sh | 64
> ++++++++++++++++++++++++++++---------
> 1 file changed, 49 insertions(+), 15 deletions(-)
>
> diff --git a/tools/hotplug/Linux/vif-common.sh
> b/tools/hotplug/Linux/vif-common.sh
> index 28ddae5..b098630 100644
> --- a/tools/hotplug/Linux/vif-common.sh
> +++ b/tools/hotplug/Linux/vif-common.sh
> @@ -123,6 +123,10 @@ ip=$(xenstore_read_default "$XENBUS_PATH/ip" "$ip")
>
> frob_iptable()
> {
> + local has_err="no"
> + local has_any="no"
> +
> + # Add or remove
> if [ "$command" == "online" -o "$command" == "add" ]
> then
> local c="-I"
> @@ -130,16 +134,40 @@ frob_iptable()
> local c="-D"
> fi
>
> - iptables "$c" FORWARD -m physdev --physdev-is-bridged --physdev-in "$dev" \
> - "$@" -j ACCEPT 2>/dev/null &&
> + # Add rules for each address
> + local addr
> +
> + for addr in $@; do
> + if [ "$addr" = "any" ]; then
> + addr="0.0.0.0/0"
> + has_any="yes"
> + fi
> +
> + iptables "$c" FORWARD -m physdev --physdev-is-bridged --physdev-in
> "$dev" \
> + -s "$addr" -j ACCEPT 2>/dev/null || has_err="yes"
> + done
> +
> + # Always Allow all packets _to_ the domain
> iptables "$c" FORWARD -m physdev --physdev-is-bridged --physdev-out "$dev"
> \
> - -j ACCEPT 2>/dev/null
> + -j ACCEPT 2>/dev/null || has_err="yes"
>
> - if [ \( "$command" == "online" -o "$command" == "add" \) -a $? -ne 0 ]
> + # If 'any' isn't allowed, we needs to allow a few more things
> + if [ "$has_any" != "yes" ]
> + then
> +
> + # Always allow the domain to talk to a DHCP server.
> + iptables "$c" FORWARD -m physdev --physdev-is-bridged --physdev-in
> "$dev" \
> + -p udp --sport 68 --dport 67 -j ACCEPT 2>/dev/null || has_err="yes"
> +
> + fi
> +
> + # Error handling
> + if [ \( "$command" == "online" -o "$command" == "add" \) -a "$has_err" ==
> "yes" ]
> then
> log err "iptables setup failed. This may affect guest networking."
> fi
> }
> +}
>
>
> ##
> @@ -160,21 +188,27 @@ handle_iptable()
> return
> fi
>
> - claim_lock "iptables"
> + # Scan through the addresses
> + local ipv4_addrs
>
> if [ "$ip" != "" ]
> then
> - local addr
> - for addr in $ip
> - do
> - frob_iptable -s "$addr"
> - done
> -
> - # Always allow the domain to talk to a DHCP server.
> - frob_iptable -p udp --sport 68 --dport 67
> + local addr
> + for addr in $ip
> + do
> + ipv4_addrs="$addr $ipv4_addrs"
> + done
> else
> - # No IP addresses have been specified, so allow anything.
> - frob_iptable
> + # No IP addresses have been specified, so allow anything.
> + ipv4_addrs="any"
> + fi
> +
> + # Actually add the rules
> + claim_lock "iptables"
> +
> + if [ "$ipv4_addrs" != "" ]
> + then
> + frob_iptable $ipv4_addrs
> fi
>
> release_lock "iptables"
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |