Skip to contentSkip to conversation

: Apply PRE_ROUTING manips in LOCAL_OUT for locally generated icmp errors

PATCH In review Patrick McHardy 1 participant 1 message Nov 28, 2004 netfilter

lore
Share & tools
lore
#0 lore raw

PATCH 4/5 : Apply PRE_ROUTING manips in LOCAL_OUT for locally generated icmp errors

Locally generated ICMP errors to a non-local IP never hit PRE_ROUTING, their PRE_ROUTING manips need to be applied in LOCAL_OUT. ICMP errors for localhost have them applied twice with this patch, but it doesn't break anything and the next patch avoids it again. Fixes incorrectly addressed ICMP errors for SNATed packets.

# This is a BitKeeper generated diff -Nru style patch. #
# ChangeSet
# 2004/11/27 13:26:24+01:00 [email protected]
# [NETFILTER]: Apply PRE_ROUTING manips in LOCAL_OUT for locally generated icmp errors
#
# Locally generated ICMP errors never hit PRE_ROUTING. Fixes invalid
# addressed ICMP errors for SNATed packets.
#
# Signed-off-by: Patrick McHardy <[email protected]>
#

# net/ipv4/netfilter/ip_nat_core.c
#   2004/11/27 13:26:17+01:00 [email protected] +8 -0
#   [NETFILTER]: Apply PRE_ROUTING manips in LOCAL_OUT for locally generated icmp errors
#   
#   Locally generated ICMP errors never hit PRE_ROUTING. Fixes invalid
#   addressed ICMP errors for SNATed packets.
#   
#   Signed-off-by: Patrick McHardy <[email protected]>
# 
diff -Nru a/net/ipv4/netfilter/ip_nat_core.c b/net/ipv4/netfilter/ip_nat_core.c
--- a/net/ipv4/netfilter/ip_nat_core.c	2004-11-28 21:36:49 +01:00
+++ b/net/ipv4/netfilter/ip_nat_core.c	2004-11-28 21:36:49 +01:00
@@ -880,6 +880,14 @@
 		/* Mapping the inner packet is just like a normal packet, except
 		 * it was never src/dst reversed, so where we would normally
 		 * apply a dst manip, we apply a src, and vice versa. */
+
+		/* Only true for forwarded packets, locally generated packets
+		 * never hit PRE_ROUTING, we need to apply their PRE_ROUTING
+		 * manips in LOCAL_OUT. */
+		if (hooknum == NF_IP_LOCAL_OUT &&
+		    info->manips[i].hooknum == NF_IP_PRE_ROUTING)
+			hooknum = info->manips[i].hooknum;
+
 		if (info->manips[i].hooknum != hooknum)
 			continue;