From: Tomasz Chmielewski <hidden> Date: 2011-06-17 20:00:50
I have a system pushing around 800 Mbit/s, ~130 kpps.
It uses 2.6.35.12 kernel.
Several times a minute, I can see entries like (a.b.c.d - IP of this system):
Jun 18 02:39:19 KOR-SV22 kernel: [37187.665951] ip_rt_bug: 110.x.x.x -> a.b.c.d, ?
Jun 18 02:39:19 KOR-SV22 kernel: [37187.685419] ip_rt_bug: 110.x.x.x -> a.b.c.d, ?
Jun 18 02:40:31 KOR-SV22 kernel: [37259.199315] ip_rt_bug: 124.x.x.x -> a.b.c.d, ?
Jun 18 02:40:36 KOR-SV22 kernel: [37263.828000] ip_rt_bug: 124.x.x.x -> a.b.c.d, ?
Jun 18 02:44:16 KOR-SV22 kernel: [37484.120689] ip_rt_bug: 110.x.x.x -> a.b.c.d, ?
Jun 18 02:44:19 KOR-SV22 kernel: [37487.114357] ip_rt_bug: 110.x.x.x -> a.b.c.d, ?
What may be causing this? Is it "dangerous"?
--
Tomasz Chmielewski
http://wpkg.org
From: Eric Dumazet <hidden> Date: 2011-06-17 20:36:37
Le vendredi 17 juin 2011 à 22:00 +0200, Tomasz Chmielewski a écrit :
I have a system pushing around 800 Mbit/s, ~130 kpps.
It uses 2.6.35.12 kernel.
Several times a minute, I can see entries like (a.b.c.d - IP of this system):
Jun 18 02:39:19 KOR-SV22 kernel: [37187.665951] ip_rt_bug: 110.x.x.x -> a.b.c.d, ?
Jun 18 02:39:19 KOR-SV22 kernel: [37187.685419] ip_rt_bug: 110.x.x.x -> a.b.c.d, ?
Jun 18 02:40:31 KOR-SV22 kernel: [37259.199315] ip_rt_bug: 124.x.x.x -> a.b.c.d, ?
Jun 18 02:40:36 KOR-SV22 kernel: [37263.828000] ip_rt_bug: 124.x.x.x -> a.b.c.d, ?
Jun 18 02:44:16 KOR-SV22 kernel: [37484.120689] ip_rt_bug: 110.x.x.x -> a.b.c.d, ?
Jun 18 02:44:19 KOR-SV22 kernel: [37487.114357] ip_rt_bug: 110.x.x.x -> a.b.c.d, ?
Hi
What your routing table looks like ? (ip ro)
You also could backport this patch so that we can catch where/why this
happens
commit c378a9c019cf5e017d1ed24954b54fae7bebd2bc
Author: Dave Jones [off-list ref]
Date: Sat May 21 07:16:42 2011 +0000
ipv4: Give backtrace in ip_rt_bug().
Add a stack backtrace to the ip_rt_bug path for debugging
Signed-off-by: Dave Jones [off-list ref]
Signed-off-by: David S. Miller [off-list ref]
From: Tomasz Chmielewski <hidden> Date: 2011-06-17 21:37:50
On 17.06.2011 22:36, Eric Dumazet wrote:
Le vendredi 17 juin 2011 à 22:00 +0200, Tomasz Chmielewski a écrit :
quoted
I have a system pushing around 800 Mbit/s, ~130 kpps.
It uses 2.6.35.12 kernel.
Several times a minute, I can see entries like (a.b.c.d - IP of this system):
Jun 18 02:39:19 KOR-SV22 kernel: [37187.665951] ip_rt_bug: 110.x.x.x -> a.b.c.d, ?
Jun 18 02:39:19 KOR-SV22 kernel: [37187.685419] ip_rt_bug: 110.x.x.x -> a.b.c.d, ?
Jun 18 02:40:31 KOR-SV22 kernel: [37259.199315] ip_rt_bug: 124.x.x.x -> a.b.c.d, ?
Jun 18 02:40:36 KOR-SV22 kernel: [37263.828000] ip_rt_bug: 124.x.x.x -> a.b.c.d, ?
Jun 18 02:44:16 KOR-SV22 kernel: [37484.120689] ip_rt_bug: 110.x.x.x -> a.b.c.d, ?
Jun 18 02:44:19 KOR-SV22 kernel: [37487.114357] ip_rt_bug: 110.x.x.x -> a.b.c.d, ?
Hi
What your routing table looks like ? (ip ro)
It's just a proxy, no special routing set:
# ip ro
58.185.117.18 via 119.46.110.193 dev eth0
119.46.240.13 via 119.46.110.193 dev eth0
58.185.117.29 via 119.46.110.193 dev eth0
119.46.241.13 via 119.46.110.193 dev eth0
58.185.117.28 via 119.46.110.193 dev eth0
119.46.110.192/26 dev eth0 proto kernel scope link src 119.46.110.197
169.254.0.0/16 dev eth0 scope link
default via 119.46.110.195 dev eth0
The box is also crashing every few days; and I really had no clue why (just connected a serial console to catch any new oops/panic).
The last time it crashed, I have this entry in syslog:
Jun 17 16:16:17 TRUE-SC02 kernel: [172488.602629] ip_rt_bug: 124.121.155.197 -> 119.46.110.197, ?
Jun 17 16:17:00 TRUE-SC02 kernel: [172531.239041] BUG: unable to handle kernel NULL pointer dereference at (null)
Jun 17 16:17:00 TRUE-SC02 kernel: [172531.239409] IP: [<ffffffff81361cae>] dev_queue_xmit+0x1e3/0x441
Jun 17 16:17:00 TRUE-SC02 kernel: [172531.239760] PGD 43c30b067 PUD 439e63067 PMD 0
Jun 17 16:17:00 TRUE-SC02 kernel: [172531.240103] Oops: 0000 [#1] SMP
Jun 17 16:19:58 TRUE-SC02 syslogd 1.4.1: restart.
Right now, it uses the newest igb driver, and I started seeing "Out of socket memory" quite a bit (didn't have it with the original igb driver from 2.6.35.12).
So I doubled this value to be:
net.ipv4.tcp_max_orphans = 256000
and "Out of socket memory" stopped showing up.
Instead, "ip_rt_bug" shows up.
--
Tomasz Chmielewski
http://wpkg.org
Hello,
On Fri, 17 Jun 2011, Tomasz Chmielewski wrote:
quoted
What your routing table looks like ? (ip ro)
It's just a proxy, no special routing set:
Is transparent proxy used?
# ip ro
58.185.117.18 via 119.46.110.193 dev eth0
119.46.240.13 via 119.46.110.193 dev eth0
58.185.117.29 via 119.46.110.193 dev eth0
119.46.241.13 via 119.46.110.193 dev eth0
Same route for 58.185.117.28 2nd time? Is that possible?:
58.185.117.28 via 119.46.110.193 dev eth0
119.46.110.192/26 dev eth0 proto kernel scope link src 119.46.110.197
169.254.0.0/16 dev eth0 scope link
default via 119.46.110.195 dev eth0
The box is also crashing every few days; and I really had no clue why (just connected a serial console to catch any new oops/panic).
The last time it crashed, I have this entry in syslog:
Jun 17 16:16:17 TRUE-SC02 kernel: [172488.602629] ip_rt_bug: 124.121.155.197 -> 119.46.110.197, ?
The ip_rt_bug messages show that skb->dev is
NULL (OUTPUT hook), daddr in IP header is local address,
may be some original received packet. If such packet is
provided to ip_route_me_harder(skb, RTN_UNSPEC) an
ip_route_input call can happen. Calling later dst_output
should lead to this warning. The question is what can
cause received packet to appear in OUTPUT hook where
a change in mark or TOS can can trigger such ip_route_input
call. What kind of netfilter modules are used? nf_queue,
-j REJECT, NAT? Is 124.121.155.197 a local address?
Jun 17 16:17:00 TRUE-SC02 kernel: [172531.239041] BUG: unable to handle kernel NULL pointer dereference at (null)
Jun 17 16:17:00 TRUE-SC02 kernel: [172531.239409] IP: [<ffffffff81361cae>] dev_queue_xmit+0x1e3/0x441
Jun 17 16:17:00 TRUE-SC02 kernel: [172531.239760] PGD 43c30b067 PUD 439e63067 PMD 0
Jun 17 16:17:00 TRUE-SC02 kernel: [172531.240103] Oops: 0000 [#1] SMP
Jun 17 16:19:58 TRUE-SC02 syslogd 1.4.1: restart.
From: Tomasz Chmielewski <hidden> Date: 2011-06-18 08:32:04
On 18.06.2011 01:56, Julian Anastasov wrote:
Hello,
On Fri, 17 Jun 2011, Tomasz Chmielewski wrote:
quoted
quoted
What your routing table looks like ? (ip ro)
It's just a proxy, no special routing set:
Is transparent proxy used?
Yes, it is.
quoted
# ip ro
58.185.117.18 via 119.46.110.193 dev eth0
119.46.240.13 via 119.46.110.193 dev eth0
58.185.117.29 via 119.46.110.193 dev eth0
119.46.241.13 via 119.46.110.193 dev eth0
Same route for 58.185.117.28 2nd time? Is that possible?:
Not second time, the addresses are similar, but different: 58.185.117.18, 58.185.117.29, 58.185.117.28. Unless there's something I don't see! ;)
quoted
58.185.117.28 via 119.46.110.193 dev eth0
119.46.110.192/26 dev eth0 proto kernel scope link src 119.46.110.197
169.254.0.0/16 dev eth0 scope link
default via 119.46.110.195 dev eth0
The box is also crashing every few days; and I really had no clue why (just connected a serial console to catch any new oops/panic).
The last time it crashed, I have this entry in syslog:
Jun 17 16:16:17 TRUE-SC02 kernel: [172488.602629] ip_rt_bug: 124.121.155.197 -> 119.46.110.197, ?
The ip_rt_bug messages show that skb->dev is
NULL (OUTPUT hook), daddr in IP header is local address,
may be some original received packet. If such packet is
provided to ip_route_me_harder(skb, RTN_UNSPEC) an
ip_route_input call can happen. Calling later dst_output
should lead to this warning. The question is what can
cause received packet to appear in OUTPUT hook where
a change in mark or TOS can can trigger such ip_route_input
call. What kind of netfilter modules are used? nf_queue,
-j REJECT, NAT? Is 124.121.155.197 a local address?
Hello,
CC-ing tproxy developers for more ideas...
On Sat, 18 Jun 2011, Tomasz Chmielewski wrote:
quoted
quoted
It's just a proxy, no special routing set:
Is transparent proxy used?
Yes, it is.
quoted
quoted
# ip ro
58.185.117.18 via 119.46.110.193 dev eth0
119.46.240.13 via 119.46.110.193 dev eth0
58.185.117.29 via 119.46.110.193 dev eth0
119.46.241.13 via 119.46.110.193 dev eth0
Same route for 58.185.117.28 2nd time? Is that possible?:
Not second time, the addresses are similar, but different: 58.185.117.18, 58.185.117.29, 58.185.117.28. Unless there's something I don't see! ;)
Ops, my fault :)
quoted
quoted
58.185.117.28 via 119.46.110.193 dev eth0
119.46.110.192/26 dev eth0 proto kernel scope link src 119.46.110.197
169.254.0.0/16 dev eth0 scope link
default via 119.46.110.195 dev eth0
The box is also crashing every few days; and I really had no clue why (just connected a serial console to catch any new oops/panic).
The last time it crashed, I have this entry in syslog:
Jun 17 16:16:17 TRUE-SC02 kernel: [172488.602629] ip_rt_bug: 124.121.155.197 -> 119.46.110.197, ?
The ip_rt_bug messages show that skb->dev is
NULL (OUTPUT hook), daddr in IP header is local address,
may be some original received packet. If such packet is
provided to ip_route_me_harder(skb, RTN_UNSPEC) an
ip_route_input call can happen. Calling later dst_output
should lead to this warning. The question is what can
cause received packet to appear in OUTPUT hook where
a change in mark or TOS can can trigger such ip_route_input
call. What kind of netfilter modules are used? nf_queue,
-j REJECT, NAT? Is 124.121.155.197 a local address?
No, it's not local.
With "ip_rt_bug: 124.121.184.77 -> 119.46.110.197, ?" lines, only the address on the right side is local.
Hm, if it happens "sometimes", can it be some
problem with tproxy and TIME_WAIT sockets? I see that
tproxy_sk_is_transparent has special treatment for TW
sockets while ip_route_me_harder is different. As result,
may be input route is assigned for TW packets.
May be inet_sk_flowi_flags() needs fixing, not
sure. But following patch is first step to fix this
problem. I don't have setup to test this patch.
===========================================================
Avoid creating input routes with ip_route_me_harder.
It does not work for locally generated packets. Instead,
restrict sockets to provide valid saddr for output route (or
unicast saddr for transparent proxy). For other traffic
allow saddr to be unicast or local but if callers forget
to check saddr type use 0 for the output route.
The resulting handling should be:
- REJECT TCP:
- in INPUT we can provide addr_type = RTN_LOCAL but
better allow rejecting traffic delivered with
local route (no IP address => use RTN_UNSPEC to
allow also RTN_UNICAST).
- FORWARD: RTN_UNSPEC => allow RTN_LOCAL/RTN_UNICAST
saddr, add fix to ignore RTN_BROADCAST and RTN_MULTICAST
- OUTPUT: RTN_UNSPEC
- NAT, mangle, ip_queue, nf_ip_reroute: RTN_UNSPEC in LOCAL_OUT
- IPVS:
- use RTN_LOCAL in LOCAL_OUT and FORWARD after SNAT
to restrict saddr to be local
Signed-off-by: Julian Anastasov <ja@ssi.bg>
---
diff -urp v2.6.39/linux/net/ipv4/netfilter/ipt_REJECT.c linux/net/ipv4/netfilter/ipt_REJECT.c
@@ -17,51 +17,35 @@ int ip_route_me_harder(struct sk_buff *sconststructiphdr*iph=ip_hdr(skb);structrtable*rt;structflowi4fl4={};-unsignedlongorefdst;+__be32saddr=iph->saddr;+__u8flags=0;unsignedinthh_len;-unsignedinttype;-type=inet_addr_type(net,iph->saddr);-if(skb->sk&&inet_sk(skb->sk)->transparent)-type=RTN_LOCAL;-if(addr_type==RTN_UNSPEC)-addr_type=type;+if(!skb->sk&&addr_type!=RTN_LOCAL){+if(addr_type==RTN_UNSPEC)+addr_type=inet_addr_type(net,saddr);+if(addr_type==RTN_LOCAL||addr_type==RTN_UNICAST)+flags|=FLOWI_FLAG_ANYSRC;+else+saddr=0;+}/* some non-standard hacks like ipt_REJECT.c:send_reset() can cause*packetswithforeignsaddrtoappearontheNF_INET_LOCAL_OUThook.*/-if(addr_type==RTN_LOCAL){-fl4.daddr=iph->daddr;-if(type==RTN_LOCAL)-fl4.saddr=iph->saddr;-fl4.flowi4_tos=RT_TOS(iph->tos);-fl4.flowi4_oif=skb->sk?skb->sk->sk_bound_dev_if:0;-fl4.flowi4_mark=skb->mark;-fl4.flowi4_flags=skb->sk?inet_sk_flowi_flags(skb->sk):0;-rt=ip_route_output_key(net,&fl4);-if(IS_ERR(rt))-return-1;--/* Drop old route. */-skb_dst_drop(skb);-skb_dst_set(skb,&rt->dst);-}else{-/* non-local src, find valid iif to satisfy-*rp-filterwhencallingip_route_input.*/-fl4.daddr=iph->saddr;-rt=ip_route_output_key(net,&fl4);-if(IS_ERR(rt))-return-1;+fl4.daddr=iph->daddr;+fl4.saddr=saddr;+fl4.flowi4_tos=RT_TOS(iph->tos);+fl4.flowi4_oif=skb->sk?skb->sk->sk_bound_dev_if:0;+fl4.flowi4_mark=skb->mark;+fl4.flowi4_flags=skb->sk?inet_sk_flowi_flags(skb->sk):flags;+rt=ip_route_output_key(net,&fl4);+if(IS_ERR(rt))+return-1;-orefdst=skb->_skb_refdst;-if(ip_route_input(skb,iph->daddr,iph->saddr,-RT_TOS(iph->tos),rt->dst.dev)!=0){-dst_release(&rt->dst);-return-1;-}-dst_release(&rt->dst);-refdst_drop(orefdst);-}+/* Drop old route. */+skb_dst_drop(skb);+skb_dst_set(skb,&rt->dst);if(skb_dst(skb)->error)return-1;
Hm, if it happens "sometimes", can it be some
problem with tproxy and TIME_WAIT sockets? I see that
tproxy_sk_is_transparent has special treatment for TW
sockets while ip_route_me_harder is different. As result,
may be input route is assigned for TW packets.
May be inet_sk_flowi_flags() needs fixing, not
sure. But following patch is first step to fix this
problem. I don't have setup to test this patch.
TPROXY has special code to make sure that time-wait sockets
are not assigned to skb->sk, as explained in commit
d503b30bd648b3cb4e5f50b65d27e389960cc6d9, that would cause
all kinds of crashes in nfnetlink_log etc.
Therefore we would see skb->sk==NULL at ip_route_me_harder()
in that case.
===========================================================
Avoid creating input routes with ip_route_me_harder.
It does not work for locally generated packets. Instead,
restrict sockets to provide valid saddr for output route (or
unicast saddr for transparent proxy). For other traffic
allow saddr to be unicast or local but if callers forget
to check saddr type use 0 for the output route.
The resulting handling should be:
- REJECT TCP:
- in INPUT we can provide addr_type = RTN_LOCAL but
better allow rejecting traffic delivered with
local route (no IP address => use RTN_UNSPEC to
allow also RTN_UNICAST).
- FORWARD: RTN_UNSPEC => allow RTN_LOCAL/RTN_UNICAST
saddr, add fix to ignore RTN_BROADCAST and RTN_MULTICAST
- OUTPUT: RTN_UNSPEC
- NAT, mangle, ip_queue, nf_ip_reroute: RTN_UNSPEC in LOCAL_OUT
- IPVS:
- use RTN_LOCAL in LOCAL_OUT and FORWARD after SNAT
to restrict saddr to be local
Signed-off-by: Julian Anastasov <ja@ssi.bg>
Unless someone gives some negative feedback soon I'm going to
apply this.
Hm, if it happens "sometimes", can it be some
problem with tproxy and TIME_WAIT sockets? I see that
tproxy_sk_is_transparent has special treatment for TW
sockets while ip_route_me_harder is different. As result,
may be input route is assigned for TW packets.
May be inet_sk_flowi_flags() needs fixing, not
sure. But following patch is first step to fix this
problem. I don't have setup to test this patch.
TPROXY has special code to make sure that time-wait sockets
are not assigned to skb->sk, as explained in commit
d503b30bd648b3cb4e5f50b65d27e389960cc6d9, that would cause
all kinds of crashes in nfnetlink_log etc.
Therefore we would see skb->sk==NULL at ip_route_me_harder()
in that case.
Aha, after this clarification other changes should not
be needed. If saddr is translated, now we will use
FLOWI_FLAG_ANYSRC. As result, if SNAT happens one day in
LOCAL_OUT, the new saddr can be unicast because RTN_UNSPEC
is provided for addr_type. If saddr is not changed, it
should be already validated when the first route for skb is
performed, so TPROXY should work.
quoted
===========================================================
Avoid creating input routes with ip_route_me_harder.
It does not work for locally generated packets. Instead,
restrict sockets to provide valid saddr for output route (or
unicast saddr for transparent proxy). For other traffic
allow saddr to be unicast or local but if callers forget
to check saddr type use 0 for the output route.
The resulting handling should be:
- REJECT TCP:
- in INPUT we can provide addr_type = RTN_LOCAL but
better allow rejecting traffic delivered with
local route (no IP address => use RTN_UNSPEC to
allow also RTN_UNICAST).
- FORWARD: RTN_UNSPEC => allow RTN_LOCAL/RTN_UNICAST
saddr, add fix to ignore RTN_BROADCAST and RTN_MULTICAST
- OUTPUT: RTN_UNSPEC
- NAT, mangle, ip_queue, nf_ip_reroute: RTN_UNSPEC in LOCAL_OUT
- IPVS:
- use RTN_LOCAL in LOCAL_OUT and FORWARD after SNAT
to restrict saddr to be local
Signed-off-by: Julian Anastasov <ja@ssi.bg>
Unless someone gives some negative feedback soon I'm going to
apply this.
TPROXY has special code to make sure that time-wait sockets
are not assigned to skb->sk, as explained in commit
d503b30bd648b3cb4e5f50b65d27e389960cc6d9, that would cause
all kinds of crashes in nfnetlink_log etc.
Therefore we would see skb->sk==NULL at ip_route_me_harder()
in that case.
Aha, after this clarification other changes should not
be needed.
By this do you mean that you think your patch in this thread
is completely sufficient?
TPROXY has special code to make sure that time-wait sockets
are not assigned to skb->sk, as explained in commit
d503b30bd648b3cb4e5f50b65d27e389960cc6d9, that would cause
all kinds of crashes in nfnetlink_log etc.
Therefore we would see skb->sk==NULL at ip_route_me_harder()
in that case.
Aha, after this clarification other changes should not
be needed.
By this do you mean that you think your patch in this thread
is completely sufficient?
Yes. My worry was for the skb->sk != NULL not being
handled by inet_sk_flowi_flags for TW sockets. But it seems
it is not needed, so the patch in this form should be ok.
Regards
--
Julian Anastasov [off-list ref]
From: Tomasz Chmielewski <hidden> Date: 2011-06-28 08:30:36
On 28.06.2011 05:55, David Miller wrote:
quoted
The resulting handling should be:
- REJECT TCP:
- in INPUT we can provide addr_type = RTN_LOCAL but
better allow rejecting traffic delivered with
local route (no IP address => use RTN_UNSPEC to
allow also RTN_UNICAST).
- FORWARD: RTN_UNSPEC => allow RTN_LOCAL/RTN_UNICAST
saddr, add fix to ignore RTN_BROADCAST and RTN_MULTICAST
- OUTPUT: RTN_UNSPEC
- NAT, mangle, ip_queue, nf_ip_reroute: RTN_UNSPEC in LOCAL_OUT
- IPVS:
- use RTN_LOCAL in LOCAL_OUT and FORWARD after SNAT
to restrict saddr to be local
Signed-off-by: Julian Anastasov<ja@ssi.bg>
Unless someone gives some negative feedback soon I'm going to
apply this.
Can you tell me where it will be pushed?
I.e. 3.x kernels only, or does it have a chance to go into 2.6.39.x?
--
Tomasz Chmielewski
http://wpkg.org