aboutsummaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorEric Dumazet <edumazet@google.com>2012-06-26 19:14:15 -0400
committerDavid S. Miller <davem@davemloft.net>2012-06-27 18:34:24 -0400
commitc074da2810c118b3812f32d6754bd9ead2f169e7 (patch)
tree772c7fbb9da464f9afd6d56e9e610157ed665e8f /include
parent93040ae5cc8dcc893eca4a4366dc8415af278edf (diff)
ipv4: tcp: dont cache unconfirmed intput dst
DDOS synflood attacks hit badly IP route cache. On typical machines, this cache is allowed to hold up to 8 Millions dst entries, 256 bytes for each, for a total of 2GB of memory. rt_garbage_collect() triggers and tries to cleanup things. Eventually route cache is disabled but machine is under fire and might OOM and crash. This patch exploits the new TCP early demux, to set a nocache boolean in case incoming TCP frame is for a not yet ESTABLISHED or TIMEWAIT socket. This 'nocache' boolean is then used in case dst entry is not found in route cache, to create an unhashed dst entry (DST_NOCACHE) SYN-cookie-ACK sent use a similar mechanism (ipv4: tcp: dont cache output dst for syncookies), so after this patch, a machine is able to absorb a DDOS synflood attack without polluting its IP route cache. Signed-off-by: Eric Dumazet <edumazet@google.com> Cc: Hans Schillstrom <hans.schillstrom@ericsson.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include')
-rw-r--r--include/net/protocol.h2
-rw-r--r--include/net/route.h8
-rw-r--r--include/net/tcp.h2
3 files changed, 6 insertions, 6 deletions
diff --git a/include/net/protocol.h b/include/net/protocol.h
index 967b926cbfb1..7cfc8f76914d 100644
--- a/include/net/protocol.h
+++ b/include/net/protocol.h
@@ -37,7 +37,7 @@
37 37
38/* This is used to register protocols. */ 38/* This is used to register protocols. */
39struct net_protocol { 39struct net_protocol {
40 int (*early_demux)(struct sk_buff *skb); 40 int (*early_demux)(struct sk_buff *skb, bool *nocache);
41 int (*handler)(struct sk_buff *skb); 41 int (*handler)(struct sk_buff *skb);
42 void (*err_handler)(struct sk_buff *skb, u32 info); 42 void (*err_handler)(struct sk_buff *skb, u32 info);
43 int (*gso_send_check)(struct sk_buff *skb); 43 int (*gso_send_check)(struct sk_buff *skb);
diff --git a/include/net/route.h b/include/net/route.h
index 47eb25ac1f7f..6361f9335774 100644
--- a/include/net/route.h
+++ b/include/net/route.h
@@ -201,18 +201,18 @@ static inline struct rtable *ip_route_output_gre(struct net *net, struct flowi4
201} 201}
202 202
203extern int ip_route_input_common(struct sk_buff *skb, __be32 dst, __be32 src, 203extern int ip_route_input_common(struct sk_buff *skb, __be32 dst, __be32 src,
204 u8 tos, struct net_device *devin, bool noref); 204 u8 tos, struct net_device *devin, bool noref, bool nocache);
205 205
206static inline int ip_route_input(struct sk_buff *skb, __be32 dst, __be32 src, 206static inline int ip_route_input(struct sk_buff *skb, __be32 dst, __be32 src,
207 u8 tos, struct net_device *devin) 207 u8 tos, struct net_device *devin)
208{ 208{
209 return ip_route_input_common(skb, dst, src, tos, devin, false); 209 return ip_route_input_common(skb, dst, src, tos, devin, false, false);
210} 210}
211 211
212static inline int ip_route_input_noref(struct sk_buff *skb, __be32 dst, __be32 src, 212static inline int ip_route_input_noref(struct sk_buff *skb, __be32 dst, __be32 src,
213 u8 tos, struct net_device *devin) 213 u8 tos, struct net_device *devin, bool nocache)
214{ 214{
215 return ip_route_input_common(skb, dst, src, tos, devin, true); 215 return ip_route_input_common(skb, dst, src, tos, devin, true, nocache);
216} 216}
217 217
218extern void ipv4_update_pmtu(struct sk_buff *skb, struct net *net, u32 mtu, 218extern void ipv4_update_pmtu(struct sk_buff *skb, struct net *net, u32 mtu,
diff --git a/include/net/tcp.h b/include/net/tcp.h
index 6660ffc4963d..917ed2e55e8c 100644
--- a/include/net/tcp.h
+++ b/include/net/tcp.h
@@ -325,7 +325,7 @@ extern void tcp_v4_err(struct sk_buff *skb, u32);
325 325
326extern void tcp_shutdown (struct sock *sk, int how); 326extern void tcp_shutdown (struct sock *sk, int how);
327 327
328extern int tcp_v4_early_demux(struct sk_buff *skb); 328extern int tcp_v4_early_demux(struct sk_buff *skb, bool *nocache);
329extern int tcp_v4_rcv(struct sk_buff *skb); 329extern int tcp_v4_rcv(struct sk_buff *skb);
330 330
331extern struct inet_peer *tcp_v4_get_peer(struct sock *sk); 331extern struct inet_peer *tcp_v4_get_peer(struct sock *sk);