All of lore.kernel.org
 help / color / mirror / Atom feed
From: Pablo Neira Ayuso <pablo@netfilter.org>
To: Phil Oester <kernel@linuxace.com>
Cc: netfilter-devel@vger.kernel.org
Subject: Re: [PATCH] netfilter: ip[6]t_REJECT: tcp-reset using wrong MAC source if bridged
Date: Wed, 3 Jul 2013 01:41:31 +0200	[thread overview]
Message-ID: <20130702234131.GA8412@localhost> (raw)
In-Reply-To: <20130626211627.GA22947@gmail.com>

On Wed, Jun 26, 2013 at 05:16:28PM -0400, Phil Oester wrote:
> As reported by Casper Gripenberg, in a bridged setup, using ip[6]t_REJECT
> with the tcp-reset option sends out reset packets with the src MAC address
> of the local bridge interface, instead of the MAC address of the intended
> destination.  This causes some routers/firewalls to drop the reset packet
> as it appears to be spoofed.  Fix this by bypassing ip[6]_local_out and
> setting the MAC of the sender in the tcp reset packet. 
> 
> This closes netfilter bugzilla #531.
> 
> Phil
> 
> Signed-off-by: Phil Oester <kernel@linuxace.com>

> diff --git a/net/ipv4/netfilter/ipt_REJECT.c b/net/ipv4/netfilter/ipt_REJECT.c
> index 04b18c1..b969131 100644
> --- a/net/ipv4/netfilter/ipt_REJECT.c
> +++ b/net/ipv4/netfilter/ipt_REJECT.c
> @@ -119,7 +119,26 @@ static void send_reset(struct sk_buff *oldskb, int hook)
>  
>  	nf_ct_attach(nskb, oldskb);
>  
> -	ip_local_out(nskb);
> +#ifdef CONFIG_BRIDGE_NETFILTER
> +	/* If we use ip_local_out for bridged traffic, the MAC source on
> +	 * the RST will be ours, instead of the destination's.  This confuses
> +	 * some routers/firewalls, and they drop the packet.  So we need to
> +	 * build the eth header using the original destination's MAC as the
> +	 * source, and send the RST packet directly.
> +	 */
> +	if (oldskb->nf_bridge) {
> +		struct ethhdr *oeth = eth_hdr(oldskb);
> +		nskb->dev = oldskb->nf_bridge->physindev;

This won't work for locally generated traffic, physindev is null in
that case.

> +		niph->tot_len = htons(nskb->len);
> +		ip_send_check(niph);
> +		if (dev_hard_header(nskb, nskb->dev, ntohs(nskb->protocol),
> +				    oeth->h_source, oeth->h_dest, nskb->len) < 0)
> +			goto free_nskb;
> +		dev_queue_xmit(nskb);
> +	} else
> +#endif
> +		ip_local_out(nskb);
> +
>  	return;
>  
>   free_nskb:
> diff --git a/net/ipv6/netfilter/ip6t_REJECT.c b/net/ipv6/netfilter/ip6t_REJECT.c
> index 70f9abc..56eef30 100644
> --- a/net/ipv6/netfilter/ip6t_REJECT.c
> +++ b/net/ipv6/netfilter/ip6t_REJECT.c
> @@ -169,7 +169,25 @@ static void send_reset(struct net *net, struct sk_buff *oldskb)
>  
>  	nf_ct_attach(nskb, oldskb);
>  
> -	ip6_local_out(nskb);
> +#ifdef CONFIG_BRIDGE_NETFILTER
> +	/* If we use ip6_local_out for bridged traffic, the MAC source on
> +	 * the RST will be ours, instead of the destination's.  This confuses
> +	 * some routers/firewalls, and they drop the packet.  So we need to
> +	 * build the eth header using the original destination's MAC as the
> +	 * source, and send the RST packet directly.
> +	 */
> +	if (oldskb->nf_bridge) {
> +		struct ethhdr *oeth = eth_hdr(oldskb);
> +		nskb->dev = oldskb->nf_bridge->physindev;
> +		nskb->protocol = htons(ETH_P_IPV6);
> +		ip6h->payload_len = htons(sizeof(struct tcphdr));
> +		if (dev_hard_header(nskb, nskb->dev, ntohs(nskb->protocol),
> +				    oeth->h_source, oeth->h_dest, nskb->len) < 0)
> +			return;
> +		dev_queue_xmit(nskb);
> +	} else
> +#endif
> +		ip6_local_out(nskb);
>  }
>  
>  static inline void


  reply	other threads:[~2013-07-02 23:41 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-06-26 21:16 [PATCH] netfilter: ip[6]t_REJECT: tcp-reset using wrong MAC source if bridged Phil Oester
2013-07-02 23:41 ` Pablo Neira Ayuso [this message]
2013-07-03 16:59   ` Phil Oester
2013-08-27 22:49 ` Pablo Neira Ayuso

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20130702234131.GA8412@localhost \
    --to=pablo@netfilter.org \
    --cc=kernel@linuxace.com \
    --cc=netfilter-devel@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.