netfilter.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* IPv6 forwarding to TAP-interface with ip6tables fails
@ 2009-12-19 11:20 Mike Kazantsev
  2009-12-19 14:09 ` Pascal Hambourg
  0 siblings, 1 reply; 5+ messages in thread
From: Mike Kazantsev @ 2009-12-19 11:20 UTC (permalink / raw)
  To: netfilter

[-- Attachment #1: Type: text/plain, Size: 4451 bytes --]

Hello, list.


I wonder if the following problem is a bug in netfilter or I'm just
doing something wrong, but it wasn't always like that.
Problem started probably with some kernel update on router machine,
since I can't trace any network layout updates since the point where it
still worked, and complete downgrade is quite a bad solution.


What I'm trying to do is to connect with ssh and/or ping6 from
2001:470:1f0b:11de::13 to 2001:470:1f0b:11de::21.
And it works at first (and worked fine before), but stops after some
time, which doesn't seem constant or relative to amount of data being
forwarded.

"tcpdump -i lan" shows a lot of tcp retransmission packets or icmp6 (in
case of ping6), but "tcpdump -i vde" shows none of them (while showing
all of them while the connection is still working).

I've tried setting -j LOG to FORWARD chain of ip6tables and it always
(both while the connection works and not) shows lines like this:
  Dec 19 14:09:48 kern.warn<4> kernel[-]@damnation: IN=lan OUT=vde
    SRC=2001:0470:1f0b:11de:0000:0000:0000:0013
    DST=2001:0470:1f0b:11de:0000:0000:0000:0021
    LEN=104 TC=0 HOPLIMIT=63 FLOWLBL=0 PROTO=ICMPv6
    TYPE=128 CODE=0 ID=29524 SEQ=8 

So, I assume the packet is lost somewhere in netfilter, but I've no
idea how to tell why it's getting discarded like that.

Strangely enough (for me), when I type "ping6 2001:0470:1f0b:11de::21"
on router machine it gives "Destination unreachable: Address
unreachable" for the first packet and then it works for the rest of
them from both router and remote machine in "lan" network (whole
forwarding thing starts working).
When I stop this ping, situation repeats after some time.

IPv4 forwarding works fine over the same link, but it's NAT there.


Note that aforementioned "vde" is a tun/tap interface of Virtual
Distributed Ethernet link, but tcpdump should show the packet on tap
interface (vde) regardless of other software, monitoring it, so it's
not a VDE-related bug, right?
That's the first question that's bothering me.

It worked a few months ago but I haven't used it actively since then,
and now it doesn't. Same IPs, but different software versions (see below).

Is something wrong with the setup?
Are there any settings that can induce aforementioned behavior I should
check, apart from the ones, included in this mail?

And if not...
Is there any way to debug the problem futher, apart of inserting
(enabling) debug code in the kernel?
Does it look like a bug in netfilter forwarding, should I post it to
bugzilla?


Thanks in advance for any answers / suggestions.


ip addr:
  2: lan: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
      link/ether 00:22:15:3a:ef:7d brd ff:ff:ff:ff:ff:ff
      inet 192.168.0.10/29 scope global lan
      inet6 2001:470:1f0b:11de::10/125 scope global 
         valid_lft forever preferred_lft forever
      inet6 2001:470:1f0b:11de::1/125 scope global 
         valid_lft forever preferred_lft forever
      inet6 fe80::222:15ff:fe3a:ef7d/64 scope link 
         valid_lft forever preferred_lft forever
  7: vde: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 500
      link/ether b2:f5:e7:68:fd:9e brd ff:ff:ff:ff:ff:ff
      inet 192.168.0.20/28 scope global vde
      inet6 2001:470:1f0b:11de::20/125 scope global 
         valid_lft forever preferred_lft forever

ip -6 route:
  2001:470:1f0b:11de::/125 dev lan  proto kernel  metric 256  mtu 1500 advmss 1440 hoplimit 4294967295
  2001:470:1f0b:11de::10/125 dev lan  proto kernel  metric 256  mtu 1500 advmss 1440 hoplimit 4294967295
  2001:470:1f0b:11de::20/125 dev vde  proto kernel  metric 256  mtu 1500 advmss 1440 hoplimit 4294967295
  fe80::/64 dev lan  proto kernel  metric 256  mtu 1500 advmss 1440 hoplimit 4294967295
  fe80::/64 dev vde  proto kernel  metric 256  mtu 1500 advmss 1440 hoplimit 4294967295

ip6tables has following rules (at the start of FORWARD chain):
  -I FORWARD -i vde -j ACCEPT
  -I FORWARD -i lan -j ACCEPT

Software:
  Linux damnation 2.6.32-gentoo-fg.mf_master #1 SMP Sun Dec 13 22:35:05
    YEKT 2009 x86_64 Intel(R) Xeon(R) CPU L5420 @ 2.50GHz GenuineIntel
    GNU/Linux (happened with .31 as well, will try official .32.2 today)
  iptables-1.4.5
  vde-2.2.3 (shouldn't be relevant?)

IPv6 forwarding is enabled in sysctl.


-- 
Mike Kazantsev // fraggod.net

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 198 bytes --]

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: IPv6 forwarding to TAP-interface with ip6tables fails
  2009-12-19 11:20 IPv6 forwarding to TAP-interface with ip6tables fails Mike Kazantsev
@ 2009-12-19 14:09 ` Pascal Hambourg
  2009-12-21  6:46   ` IPv6 forwarding to TAP-interface fails Mike Kazantsev
  0 siblings, 1 reply; 5+ messages in thread
From: Pascal Hambourg @ 2009-12-19 14:09 UTC (permalink / raw)
  To: Mike Kazantsev; +Cc: netfilter

Hello,

Mike Kazantsev a écrit :
> 
> I wonder if the following problem is a bug in netfilter or I'm just
> doing something wrong, but it wasn't always like that.
> Problem started probably with some kernel update on router machine,
[...]
> I've tried setting -j LOG to FORWARD chain of ip6tables and it always
> (both while the connection works and not) shows lines like this:
>   Dec 19 14:09:48 kern.warn<4> kernel[-]@damnation: IN=lan OUT=vde
>     SRC=2001:0470:1f0b:11de:0000:0000:0000:0013
>     DST=2001:0470:1f0b:11de:0000:0000:0000:0021
>     LEN=104 TC=0 HOPLIMIT=63 FLOWLBL=0 PROTO=ICMPv6
>     TYPE=128 CODE=0 ID=29524 SEQ=8 
> 
> So, I assume the packet is lost somewhere in netfilter, but I've no
> idea how to tell why it's getting discarded like that.

Have you tried to track the packet in the mangle/POSTROUTING chain too,
either with the LOG target in that chain or with the TRACE target in the
raw/PREROUTING chain ?

> Strangely enough (for me), when I type "ping6 2001:0470:1f0b:11de::21"
> on router machine it gives "Destination unreachable: Address
> unreachable"

This indicates that the neighbour discovery for that address failed,
either because the ICMPv6 neighbour solicitation request could not be
sent or the ICMPv6 neighbour advertisement reply was not received. If
neighbour discovery fails, packets cannot be sent or forwarded to that
destination.

> ip addr:
>   2: lan: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
[...]
>       inet6 2001:470:1f0b:11de::10/125 scope global 
[...]
>   7: vde: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 500
[...]
>       inet6 2001:470:1f0b:11de::20/125 scope global 

Regardless of your problem, 2001:470:1f0b:11de::10 and
2001:470:1f0b:11de::20 are the prefix addresses of
2001:470:1f0b:11de::10/25 and 2001:470:1f0b:11de::20/25 and have a
special status : they are anycast addresses meaning "any router
connected to that prefix". So I guess that they should not be assigned
to an interface.

> ip6tables has following rules (at the start of FORWARD chain):
>   -I FORWARD -i vde -j ACCEPT
>   -I FORWARD -i lan -j ACCEPT

ICMPv6 packets involved in neighbour discovery go through the INPUT and
OUTPUT chains. What do these chains contain ? Connection tracking of
these ICMPv6 types changed in kernel 2.6.29.

You wrote in the subject "with ip6tables". Do you mean that it works
without ip6tables, without ip6_tables loaded or without ip6table_filter
loaded, or with all chains empty and with ACCEPT default policy ?

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: IPv6 forwarding to TAP-interface fails
  2009-12-19 14:09 ` Pascal Hambourg
@ 2009-12-21  6:46   ` Mike Kazantsev
  2009-12-21  9:09     ` [SOLVED] " Mike Kazantsev
  0 siblings, 1 reply; 5+ messages in thread
From: Mike Kazantsev @ 2009-12-21  6:46 UTC (permalink / raw)
  To: Pascal Hambourg; +Cc: netfilter

[-- Attachment #1: Type: text/plain, Size: 7437 bytes --]

On Sat, 19 Dec 2009 15:09:08 +0100
Pascal Hambourg <pascal.mail@plouf.fr.eu.org> wrote:

> > So, I assume the packet is lost somewhere in netfilter, but I've no
> > idea how to tell why it's getting discarded like that.
> 
> Have you tried to track the packet in the mangle/POSTROUTING chain
> too, either with the LOG target in that chain or with the TRACE
> target in the raw/PREROUTING chain ?

Didn't know about it, very handy way to check what's happening.
Thanks. Pity I've missed it before.

As for the results - it seems that everything is passing through
netfilter just fine, more about it below.


> > Strangely enough (for me), when I type "ping6
> > 2001:0470:1f0b:11de::21" on router machine it gives "Destination
> > unreachable: Address unreachable"
> 
> This indicates that the neighbour discovery for that address failed,
> either because the ICMPv6 neighbour solicitation request could not be
> sent or the ICMPv6 neighbour advertisement reply was not received. If
> neighbour discovery fails, packets cannot be sent or forwarded to that
> destination.

Yes, that seem to be the cause of a problem, but then I don't seem to
understand why router doesn't send these requests.


I've set TRACE to packets with 2001:470:1f0b:11de::22 as a destination
in raw.PREROUTING and -j LOG to INPUT and OUTPUT chains of filter table.

On VM start tcpdump (with "ip6" filter) shows these:
  IP6 :: > ff02::16: HBH ICMP6, multicast listener report v2, 1 group record(s), length 28
  IP6 :: > ff02::1:ff00:22: ICMP6, neighbor solicitation, who has 2001:470:1f0b:11de::22, length 24
  IP6 :: > ff02::16: HBH ICMP6, multicast listener report v2, 1 group record(s), length 28

Then I start the simple ping6 from lan network to vde (VM):
  IP6 2001:470:1f0b:11de::13 > 2001:470:1f0b:11de::22: ICMP6, echo request, seq 1, length 64
  
  TRACE: raw:PREROUTING:policy:2 IN=lan OUT= MAC=00:22:15:3a:ef:7d:00:17:c4:10:7f:4f:86:dd
   SRC=2001:0470:1f0b:11de:0000:0000:0000:0013
   DST=2001:0470:1f0b:11de:0000:0000:0000:0022
   LEN=104 TC=0 HOPLIMIT=64 FLOWLBL=0 PROTO=ICMPv6 TYPE=128 CODE=0 ID=29452 SEQ=1
  TRACE: mangle:PREROUTING:policy:1 IN=lan OUT= MAC=00:22:15:3a:ef:7d:00:17:c4:10:7f:4f:86:dd
   SRC=2001:0470:1f0b:11de:0000:0000:0000:0013
   DST=2001:0470:1f0b:11de:0000:0000:0000:0022
   LEN=104 TC=0 HOPLIMIT=64 FLOWLBL=0 PROTO=ICMPv6 TYPE=128 CODE=0 ID=29452 SEQ=1
  TRACE: mangle:FORWARD:policy:1 IN=lan OUT=vde
   SRC=2001:0470:1f0b:11de:0000:0000:0000:0013
   DST=2001:0470:1f0b:11de:0000:0000:0000:0022
   LEN=104 TC=0 HOPLIMIT=63 FLOWLBL=0 PROTO=ICMPv6 TYPE=128 CODE=0 ID=29452 SEQ=1
  TRACE: filter:FORWARD:policy:1 IN=lan OUT=vde
   SRC=2001:0470:1f0b:11de:0000:0000:0000:0013
   DST=2001:0470:1f0b:11de:0000:0000:0000:0022
   LEN=104 TC=0 HOPLIMIT=63 FLOWLBL=0 PROTO=ICMPv6 TYPE=128 CODE=0 ID=29452 SEQ=1
  TRACE: mangle:POSTROUTING:policy:1 IN= OUT=vde
   SRC=2001:0470:1f0b:11de:0000:0000:0000:0013
   DST=2001:0470:1f0b:11de:0000:0000:0000:0022
   LEN=104 TC=0 HOPLIMIT=63 FLOWLBL=0 PROTO=ICMPv6 TYPE=128 CODE=0 ID=29452 SEQ=1

  IP6 2001:470:1f0b:11de::22 > ff02::1:ff00:21: ICMP6, neighbor solicitation, who has 2001:470:1f0b:11de::21, length 32
  
  IN=vde OUT= MAC=33:33:ff:00:00:21:00:16:3e:16:38:41:86:dd
   SRC=2001:0470:1f0b:11de:0000:0000:0000:0022
   DST=ff02:0000:0000:0000:0000:0001:ff00:0021
   LEN=72 TC=0 HOPLIMIT=255 FLOWLBL=0 PROTO=ICMPv6 TYPE=135 CODE=0
  
  IP6 2001:470:1f0b:11de::21 > 2001:470:1f0b:11de::22: ICMP6, neighbor advertisement, tgt is 2001:470:1f0b:11de::21, length 32
  
  IN= OUT=vde
   SRC=2001:0470:1f0b:11de:0000:0000:0000:0021
   DST=2001:0470:1f0b:11de:0000:0000:0000:0022
   LEN=72 TC=0 HOPLIMIT=255 FLOWLBL=0 PROTO=ICMPv6 TYPE=136 CODE=0
  
  
  IP6 2001:470:1f0b:11de::22 > 2001:470:1f0b:11de::13: ICMP6, echo reply, seq 1, length 64

...and so on until tcpdump just stops, while traces show the same thing.


On lan interface, unlike vde, neighbor requests seem to be passed quite
frequently:

  ...
  IP6 2001:470:1f0b:11de::13 > 2001:470:1f0b:11de::22: ICMP6, echo request, seq 5, length 64
  IP6 2001:470:1f0b:11de::22 > 2001:470:1f0b:11de::13: ICMP6, echo reply, seq 5, length 64
  IP6 fe80::222:15ff:fe3a:ef7d > 2001:470:1f0b:11de::13: ICMP6, neighbor solicitation, who has 2001:470:1f0b:11de::13, length 32
  IP6 2001:470:1f0b:11de::13 > fe80::222:15ff:fe3a:ef7d: ICMP6, neighbor advertisement, tgt is 2001:470:1f0b:11de::13, length 24
  IP6 2001:470:1f0b:11de::13 > 2001:470:1f0b:11de::22: ICMP6, echo request, seq 6, length 64
  IP6 2001:470:1f0b:11de::22 > 2001:470:1f0b:11de::13: ICMP6, echo reply, seq 6, length 64
  ...


And when I type "ping6 2001:470:1f0b:11de::22" on router itself I can
see neighbor solicitation in tcpdump and pings from lan start working
again, although not for long (if I ping on router):

  [complete silence]
  IP6 2001:470:1f0b:11de::21 > ff02::1:ff00:22: ICMP6, neighbor solicitation, who has 2001:470:1f0b:11de::22, length 32
  IP6 2001:470:1f0b:11de::22 > 2001:470:1f0b:11de::21: ICMP6, neighbor advertisement, tgt is 2001:470:1f0b:11de::22, length 32
  IP6 2001:470:1f0b:11de::13 > 2001:470:1f0b:11de::22: ICMP6, echo request, seq 135, length 64
  IP6 2001:470:1f0b:11de::22 > 2001:470:1f0b:11de::13: ICMP6, echo reply, seq 135, length 64
  ...


So I guess that pinpoints the problem as "router doesn't send neighbor
solicitation requests along with forwarded packets", thanks to your
suggestion.

I have to admit that "neighbor solicitation", although basic IPv6
mechanism, is a obscure to me, since I haven't done necessary research
on the topic before setting the network up, and that's quite a stupid
mistake I'm going to fix right now ;)

Guess that gives me something to search for and debug further, so I'll
probably be able to either fix it or come up with another, more
specific, question.
Thanks for your help.


> Regardless of your problem, 2001:470:1f0b:11de::10 and
> 2001:470:1f0b:11de::20 are the prefix addresses of
> 2001:470:1f0b:11de::10/25 and 2001:470:1f0b:11de::20/25 and have a
> special status : they are anycast addresses meaning "any router
> connected to that prefix". So I guess that they should not be assigned
> to an interface.

While that worked before, I agree that it's a bad practice, and I've
fixed it now, although it doesn't seem to affect this particular
problem indeed.

For the above tests I've changed ...::10 to 11, ...::20 to 21
and ...::21 to 22.


> ICMPv6 packets involved in neighbour discovery go through the INPUT
> and OUTPUT chains. What do these chains contain ? Connection tracking
> of these ICMPv6 types changed in kernel 2.6.29.

These (as well as the rest of ICMPv6) were unrestricted in all chains,
but for the sake of this test (dumps/traces posted above) I've set
everything to ACCEPT explicitly.


> You wrote in the subject "with ip6tables". Do you mean that it works
> without ip6tables, without ip6_tables loaded or without
> ip6table_filter loaded, or with all chains empty and with ACCEPT
> default policy ?

My mistake, sorry, ip6tables tool probably have nothing to do with it,
it's just that the whole forwarding concept is closely associated with
iptables in my mind ;)

ACCEPT everywhere doesn't affect the test, and above results acquired
with just that setup.


-- 
Mike Kazantsev // fraggod.net

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 198 bytes --]

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [SOLVED] Re: IPv6 forwarding to TAP-interface fails
  2009-12-21  6:46   ` IPv6 forwarding to TAP-interface fails Mike Kazantsev
@ 2009-12-21  9:09     ` Mike Kazantsev
  2009-12-23 13:03       ` Pascal Hambourg
  0 siblings, 1 reply; 5+ messages in thread
From: Mike Kazantsev @ 2009-12-21  9:09 UTC (permalink / raw)
  To: netfilter

[-- Attachment #1: Type: text/plain, Size: 2286 bytes --]

On Mon, 21 Dec 2009 11:46:48 +0500
Mike Kazantsev <mk.fraggod@gmail.com> wrote:

> Then I start the simple ping6 from lan network to vde (VM):
...
> 
>   IP6 2001:470:1f0b:11de::22 > ff02::1:ff00:21: ICMP6, neighbor
> solicitation, who has 2001:470:1f0b:11de::21, length 32 
>   IN=vde OUT= MAC=33:33:ff:00:00:21:00:16:3e:16:38:41:86:dd
>    SRC=2001:0470:1f0b:11de:0000:0000:0000:0022
>    DST=ff02:0000:0000:0000:0000:0001:ff00:0021
>    LEN=72 TC=0 HOPLIMIT=255 FLOWLBL=0 PROTO=ICMPv6 TYPE=135 CODE=0
>   
>   IP6 2001:470:1f0b:11de::21 > 2001:470:1f0b:11de::22: ICMP6,
> neighbor advertisement, tgt is 2001:470:1f0b:11de::21, length 32 
>   IN= OUT=vde
>    SRC=2001:0470:1f0b:11de:0000:0000:0000:0021
>    DST=2001:0470:1f0b:11de:0000:0000:0000:0022
>    LEN=72 TC=0 HOPLIMIT=255 FLOWLBL=0 PROTO=ICMPv6 TYPE=136 CODE=0
>   

Just looking at these lines as I pasted them actually helped: ICMP6
neighbor solicitation request was sent from 22 to 21, while the packets
were originated from 21.
Made me wondering about what kind of backwards magic is at work here...


> ip addr:
...
>   7: vde: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 500
>       link/ether b2:f5:e7:68:fd:9e brd ff:ff:ff:ff:ff:ff
>       inet 192.168.0.20/28 scope global vde
>       inet6 2001:470:1f0b:11de::20/125 scope global
>          valid_lft forever preferred_lft forever

And here's the problem: no link-local address on the interface.
"ip addr flush dev vde" in init.d script setting up interface did that,
that was the mistake.

With this address added (or rather preserved), router is able to send
neighbor solicitation requests from it and everything works fine.

Anyway, strange thing is that, apparently, VM on the other side is able
to send these requests without link-local address, using global one
instead:

  2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qlen 1000
      inet6 2001:470:1f0b:11de::22/125 scope global
         valid_lft forever preferred_lft forever

Guess older kernel (2.6.30.4) there is the cause of it, and that's also
why it worked before with pretty much the same setup.

Thanks again to Pascal for pointing me in the right direction.


-- 
Mike Kazantsev // fraggod.net

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 198 bytes --]

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [SOLVED] Re: IPv6 forwarding to TAP-interface fails
  2009-12-21  9:09     ` [SOLVED] " Mike Kazantsev
@ 2009-12-23 13:03       ` Pascal Hambourg
  0 siblings, 0 replies; 5+ messages in thread
From: Pascal Hambourg @ 2009-12-23 13:03 UTC (permalink / raw)
  To: Mike Kazantsev; +Cc: netfilter

Mike Kazantsev a écrit :
> 
> And here's the problem: no link-local address on the interface.

Good catch. I didn't notice it.

> With this address added (or rather preserved), router is able to send
> neighbor solicitation requests from it and everything works fine.
> 
> Anyway, strange thing is that, apparently, VM on the other side is able
> to send these requests without link-local address, using global one
> instead:
[...]
> Guess older kernel (2.6.30.4) there is the cause of it, and that's also
> why it worked before with pretty much the same setup.

I observed that when sending a locally generated packet, Linux uses the
source address (which is one one of its own addresses) of the packet as
the source address in the neighbour solicitation, whereas when
forwarding a packet it uses the link-local address attached to the
output interface. So there may be trouble when forwarding a packet and
the output interface has no link-local address. The tcpdump trace in
your previous message shows a neighbour solicitation packet with
unspecified source address :

> IP6 :: > ff02::1:ff00:22: ICMP6, neighbor solicitation, who has 2001:470:1f0b:11de::22, length 24

This may explain the different results with pings from the LAN and from
the router, and also why VM does not have the problem even though it has
no link-local address.

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2009-12-23 13:03 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-12-19 11:20 IPv6 forwarding to TAP-interface with ip6tables fails Mike Kazantsev
2009-12-19 14:09 ` Pascal Hambourg
2009-12-21  6:46   ` IPv6 forwarding to TAP-interface fails Mike Kazantsev
2009-12-21  9:09     ` [SOLVED] " Mike Kazantsev
2009-12-23 13:03       ` Pascal Hambourg

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).