On Tue, Oct 26, 1999 at 06:37:24PM -0400, Rob Schmaling wrote:
> IP Masquerade apears not to be working in 2.2.14pre1. make oldconfig used
> from a masq-functional 2.2.13 x86 SMP machine. I've attached config for
> 2.2.14pre1.
>
> ip_forward is enabled, and ipchains forward 192.168.1.0/24 <internal
Yap... 14pre1 has my (incorrect) patch merged.
Backing out ip_forward changes (patch -R ... < masq.unpatch) should do it.
Also try attached patch (patch < masq.patch) by Joseph Gooch
which correctly deals with masq addresses used.
Regards
--
-- Juanjo http://juanjox.kernelnotes.org/
... because there IS an OS that CAN follow your power
--pWyiEgJYm5f9v55/
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment; filename="masq.patch"
diff -ru linux-2.2.13-vanilla/net/ipv4/ip_forward.c linux-2.2.13-ipmasq/net/ipv4/ip_forward.c
--- linux-2.2.13-vanilla/net/ipv4/ip_forward.c Wed Oct 20 18:02:28 1999
+++ linux-2.2.13-ipmasq/net/ipv4/ip_forward.c Sun Oct 24 14:07:41 1999
@@ -10,6 +10,7 @@
* Authors: see ip.c
*
* Fixes:
+ * Joseph Gooch : Removed maddr selection for ip_masq, now done in ip_masq.c
* Many : Split from ip.c , see ip_input.c for
* history.
* Dave Gregorich : NULL ip_rt_put fix for multicast
@@ -168,7 +169,6 @@
* and skip the firewall checks
*/
if (iph->protocol == IPPROTO_ICMP) {
- __u32 maddr;
#ifdef CONFIG_IP_MASQUERADE_ICMP
struct icmphdr *icmph = (struct icmphdr *)((char*)iph + (iph->ihl << 2));
if ((icmph->type==ICMP_DEST_UNREACH)||
@@ -176,8 +176,7 @@
(icmph->type==ICMP_TIME_EXCEEDED))
{
#endif
- maddr = rt->rt_src;
- fw_res = ip_fw_masq_icmp(&skb, maddr);
+ fw_res = ip_fw_masquerade(&skb, 0);
if (fw_res < 0) {
kfree_skb(skb);
return -1;
@@ -187,7 +186,7 @@
/* ICMP matched - skip firewall */
goto skip_call_fw_firewall;
#ifdef CONFIG_IP_MASQUERADE_ICMP
- }
+ }
#endif
}
if (rt->rt_flags&RTCF_MASQ)
@@ -219,15 +218,11 @@
*/
if (!(IPCB(skb)->flags&IPSKB_MASQUERADED) &&
(fw_res==FW_MASQUERADE || rt->rt_flags&RTCF_MASQ)) {
- u32 maddr;
+ u32 maddr = 0;
#ifdef CONFIG_IP_ROUTE_NAT
maddr = (rt->rt_flags&RTCF_MASQ) ? rt->rt_src_map : 0;
-
- if (maddr == 0)
#endif
- maddr = rt->rt_src;
-
if (ip_fw_masquerade(&skb, maddr) < 0) {
kfree_skb(skb);
return -1;
diff -ru linux-2.2.13-vanilla/net/ipv4/ip_masq.c linux-2.2.13-ipmasq/net/ipv4/ip_masq.c
--- linux-2.2.13-vanilla/net/ipv4/ip_masq.c Wed Oct 20 17:59:59 1999
+++ linux-2.2.13-ipmasq/net/ipv4/ip_masq.c Sun Oct 24 14:09:28 1999
@@ -10,6 +10,9 @@
* See ip_fw.c for original log
*
* Fixes:
+ * Joseph Gooch : Modified ip_fw_masquerade() to do a ip_route_output()
+ * (help by Dan Drown) : to choose the proper local address.
+ * (and Alexey) :
* Juan Jose Ciarlante : Modularized application masquerading (see ip_masq_app.c)
* Juan Jose Ciarlante : New struct ip_masq_seq that holds output/input delta seq.
* Juan Jose Ciarlante : Added hashed lookup by proto,maddr,mport and proto,saddr,sport
@@ -1141,6 +1144,22 @@
return -1;
}
+ /* Lets determine our maddr now, shall we? */
+ if (maddr == 0) {
+ struct rtable *rt;
+ struct rtable *skb_rt = (struct rtable*)skb->dst;
+ struct device *skb_dev = skb_rt->u.dst.dev;
+
+ if (ip_route_output(&rt, iph->daddr, 0, RT_TOS(iph->tos)|RTO_CONN, skb_dev?skb_dev->ifindex:0)) {
+ /* Fallback on old method */
+ maddr = inet_select_addr(skb_dev, skb_rt->rt_gateway, RT_SCOPE_UNIVERSE);
+ } else {
+ /* Route lookup succeeded */
+ maddr = rt->rt_src;
+ ip_rt_put(rt);
+ }
+ }
+
switch (iph->protocol) {
case IPPROTO_ICMP:
return(ip_fw_masq_icmp(skb_p, maddr));
diff -ru linux-2.2.13-vanilla/net/ipv4/ip_masq_user.c linux-2.2.13-ipmasq/net/ipv4/ip_masq_user.c
--- linux-2.2.13-vanilla/net/ipv4/ip_masq_user.c Wed Oct 20 17:59:59 1999
+++ linux-2.2.13-ipmasq/net/ipv4/ip_masq_user.c Sat Oct 23 00:25:48 1999
@@ -100,7 +100,7 @@
return ret;
}
dev = rt->u.dst.dev;
- ums->maddr = ip_masq_select_addr(dev, rt->rt_gateway, RT_SCOPE_UNIVERSE);
+ ums->maddr = rt->rt_src; /* Per Alexey */
IP_MASQ_DEBUG(1-debug, "did setup maddr=%lX\n", ntohl(ums->maddr));
ip_rt_put(rt);
--pWyiEgJYm5f9v55/
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment; filename="masq.unpatch"
--- linux/net/ipv4/ip_forward.c.dist Sun Mar 21 12:22:00 1999
+++ linux/net/ipv4/ip_forward.c Wed Oct 20 15:16:58 1999
@@ -176,7 +176,7 @@
(icmph->type==ICMP_TIME_EXCEEDED))
{
#endif
- maddr = inet_select_addr(dev2, rt->rt_gateway, RT_SCOPE_UNIVERSE);
+ maddr = rt->rt_src;
fw_res = ip_fw_masq_icmp(&skb, maddr);
if (fw_res < 0) {
kfree_skb(skb);
@@ -226,7 +226,7 @@
if (maddr == 0)
#endif
- maddr = inet_select_addr(dev2, rt->rt_gateway, RT_SCOPE_UNIVERSE);
+ maddr = rt->rt_src;
if (ip_fw_masquerade(&skb, maddr) < 0) {
kfree_skb(skb);
--pWyiEgJYm5f9v55/--
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.rutgers.edu
Please read the FAQ at http://www.tux.org/lkml/