Forwarding non local packets to loopback with iptables?

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Setup:
   NAT + Firewall - Debian, 2.4.18 kernel, iptables v1.2.6a
   eth0 - 10.0.x.x        - wireless broadband VPN connection
   eth1 - 192.168.0.1     - Local network
   ppp0 - server assigned - Internet connection via VPN established via
                            eth0 - though, fairly irrelivent.
   eth1:1 - 192.168.0.128 - Local network alias
   eth1:2 - 192.168.0.129 - Local network alias
      .. etc ..

What I want to do is set up a SSH tunnel to another machine, behind
another firewall, and use the eth1 aliases to access the remote machines from my
local network (eth1) and the iptables machine. I tried to set this up
before with iptables, failed, found discovered rinetd, and have been using
that since successfully. However, I'd like to use an iptables solution,
because I think it'll be cleaner (can't easily ifup/ifdown the eth1 aliases
when using rinetd), plus I'm plain interested in if/how to do an iptables
solution.

The main catch here is that I'm not using GatewayPorts for the ssh port
forwarding. Firstly because binding the forwards to the loopback seems
slightly more secure, and secondly because the ports I forward to on the
remote machines are the same - using GatewayPorts binds to all available
interfaces. Hence I do the ssh port forwards, binding to different
ports on the loopback on the local end of the ssh tunnel, and then map
the default service ports on the eth1 aliases to the appropriate port on
the loopback ie:

rinetd.conf:

   192.168.0.128   3389      127.0.0.1       13389 # rdc
   192.168.0.129   3389      127.0.0.1       23389 # rdc
   192.168.0.130   3389      127.0.0.1       33389 # rdc

Connections to 192.168.0.128:3389 redirect to localhost:13389, which connects
via the ssh tunnel to port 3389 on the remote host.

Last time I tried to establish this with iptables, I got nowhere. This time
around I got it working on the iptables machine with:

$IPTABLES -t nat -I OUTPUT -p tcp -s 192.168.0.128 --dport 3389 \
        -j DNAT --to 127.0.0.1:13389
   .. etc .. for each address and port required.

Connecting to 129.168.0.128 port 3389 takes me where I want - down the
ssh tunnel, to machine on the remote network.

However, no matter what I try, I can't get connections from other machines
on the 192.168.0.0/24 network to work. I've tried to several combinations
of using PREROUTING, POSTROUTING and OUTPUT chains, with no luck.
In particular, I've tried to model it on a rule that works:

    iptables -t nat -I PREROUTING -p tcp -d 192.168.0.128 --dport 3389 \
         -j DNAT --to x.x.x.x:3389
    (where x.x.x.x is a host on the internet.)

with:

    iptables -t nat -I PREROUTING -p tcp -d 192.168.0.128 --dport 3389 \
         -j DNAT --to 127.0.0.1:3389

which doesn't work, to which I can only conclude that you can't dnat to
127.0.0.1.

Is it possible to achieve this with iptables (redirecting traffic coming in
on eth1 (for eth1:?) to a port on 127.0.0.1), and if so, what rules are
required?

Thanks in advance,
Mark.



[Index of Archives]     [Linux Netfilter Development]     [Linux Kernel Networking Development]     [Netem]     [Berkeley Packet Filter]     [Linux Kernel Development]     [Advanced Routing & Traffice Control]     [Bugtraq]

  Powered by Linux