Skip to content

mjuric/udpfwd

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

22 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

udpfwd -- Userspace UDP relay.
==============================

Think of it as poor man's single-port UDP DNAT/SNAT.

Usage:

	./udpfwd <dest_ip> <dest_port> <listen_port>

The relay listens for packets received on listen_port, changes their source
IPs to the IP of the local host ("SNAT"), and forwards them to the
destination (dest_ip:dest_port) from a randomly chosen local send_port. The
selection of send_port is made on reception of the first packet from a given
source_ip:source_port; once chosen, the source_ip:source_port:send_port
triplet is unique, allowing for connection tracking. Therefore, when a
packet is received on send_port, its destination is changed to
source_ip:source_port ("DNAT"), and forwarded onwards.

Effectively, this is a userspace SNAT/DNAT.

Schematic:

                         +----------------+
 [host_a:xxxx] <-------> |          a_out:| <-------> [                   ]
 [host_b:yyyy] <-------> |:listen   b_out:| <-------> [ dest_ip:dest_port ]
 [host_c:zzzz] <-------> |          c_out:| <-------> [                   ]
                         +----------------+

*****************************************************************
*Warning:*

This relay has no authentication or authorization mechanisms, nor
does it in any way obscure or encrypt the forwarded packets. You
have been warned.
*****************************************************************

Getting the Sources
===================

Download them from http://www.sns.ias.edu/~mjuric/udpfwd[]


Building and Installing
=======================

A simple

	cd src && make

should do. Then copy the executable `udpfwd' to wherever you like (e.g.,
/usr/local/bin).


Logging
=======

A connection log and status file will by default be created in subdirectory
'log' of the directory from which you start udpfwd. If the the log file
cannot be written for any reason, logging will be disabled.

You can change the log and status file destinations using the --log and
--status command line options.


Where is this useful
====================

Wherever you don't have control over kernel-level routing/forwarding. For
example, when attempting to set up an OpenVPN tunnel on an OpenVZ VPS where
the hosting company disallows access to IP forwarding (I'll let you figure
out the details :-)).


Testing
=======

Two other tools are included in the package, mainly to make the testing
easier. They are:

	./reflect <port_to_listen_on>

		UDP packet reflector -- returns received packets to the
		sender

	./send <dest_ip> <dest_port> <source_port> [seconds_between_packets=1]

		Sends a stream of UDP packets to dest_ip:dest_port. UDP
		packets are sent from source_port. When a packet is sent,
		waits for 1 second for a reply. After receiving the reply
		(or after 1 second expires), waits for
		seconds_between_packets seconds and repeats.

You may use these to test the relay. E.g.

	Host A:  ./relay   Host_B 5000 4999
	Host B:  ./reflect 5000
	Host C:  ./send    Host_A 4999 6000

In the example above, ./send (executed on Host_C) will send packets from port
6000 to Host_A's port 4999. ./relay will forward these to Host_C's port
5000. These will be reflected by ./reflect and passed back through the relay
to ./send.


License and Warranty
====================
Copyright (C) 2008 Mario Juric <[email protected]>

This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License, Version 2, as published
by the Free Software Foundation.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
USA