Ipchains: Easy Links to the Net
A D V E R T I S E M E N T
Multiple
Machines, A Single Connection
Now that the Internet has become a ubiquitous presence in our society, it
seems only reasonable that every machine should have Internet access. And with a
couple of Ethernet cards, some well-chosen software, and a little bit of
brainpower, many people can manage to share a single Internet connection among
more than one PC, whether that connection be a PPP dial-up connection, a DSL
line, or a cable modem.
In this case, the well-chosen software is ipchains.
As described by its author, Paul Russell, ipchains "is
an update to [and hopefully an improvement upon] the 2.0 Linux packet-filtering
code, for the 2.2 Linux kernel." In a nutshell, it's a pretty neat way to
make a firewall out of a 2.2 kernel Linux box, as well as providing access for
multiple PCs using a single Internet connection. In this article, we will be
talking about how to setup IP masquerading, allowing transparent proxying to the
Internet.
In order to get started with ipchains, you're
going need a Linux box (in this case, we'll be using a freshly installed
Slackware 4.0 distribution), preferably two NIC cards (one can be a PPP dialup
interface), a copy ofipchains, and probably a copy
of the source code for your kernel. Chances are most distributions of Linux
should come preinstalled with ipchains;. A copy of the Linux kernel source may already be installed in
/usr/src/linux. . At the time
of this writing, the latest version of ipchains is
1.3.9 and the latest 2.2 kernel is 2.2.13. If you're trying to set up
ipchains on Linux 2.0, you're going to need quite a
bit more kernel configuration prior to setting up ipchains,
a process that is outside the scope of this article. For the purpose of this
article, we're going to assume you're doing everything as
root, since most things here require it anyway.
Kernel
Changes
Before you can actually set up ipchains, you may
have to recompile your kernel to support IP masquerading. But fear not! Some
distributions nowadays may already have IP masquerading enabled in their
kernels. In our distribution of Slackware 4.0, the IP masquerading settings were
already enabled in the 2.2.6 kernel built and included with the distribution. If
you want to check to see if you already have IP masquerading enabled, simply
check for the existence of the /proc/sys/net/ipv4/ip_forward
file:
# cd /proc/sys/net/ipv4
# ls -la ip_forward
-rw-r--r-- 1 root root 0 Oct 24 23:36 ip_forward
The ip_forward file size being 0 is normal. If
this file exists, your kernel is already set to do IP masquerading. If you don't
see this, you're going to have to recompile your kernel. Recompiling your kernel
isn't a terribly easy task, and we won't cover every step here (check your
system documentation for more information). In brief, you will want to enable
the following options:
Prompt for development and/or incomplete code/drivers (CONFIG_EXPERIMENTAL)
Enable loadable module support (CONFIG_MODULES)
Networking support (CONFIG_NET)
Packet socket (CONFIG_PACKET)
Kernel/User netlink socket (CONFIG_NETLINK)
Network firewalls (CONFIG_FIREWALL)
TCP/IP networking (CONFIG_INET)
IP: verbose route monitoring (CONFIG_IP_ROUTE_VERBOSE)
IP: firewalling (CONFIG_IP_FIREWALL)
IP: firewall packet netlink device (CONFIG_IP_FIREWALL_NETLINK)
IP: always defragment (required for masquerading) (CONFIG_IP_ALWAYS_DEFRAG)
IP: masquerading (CONFIG_IP_MASQUERADE)
IP: ICMP masquerading (CONFIG_IP_MASQUERADE_ICMP)
IP: optimize as router not host (CONFIG_IP_ROUTER)
IP: TCP syncookie support (not enabled per default) (CONFIG_SYN_COOKIES)
Network device support (CONFIG_NETDEVICES)
/proc filesystem support (CONFIG_PROC_FS)
Remember, as general rule when compiling a new kernel, keep a back-up copy of
your old kernel and maybe even a Linux bootdisk.
Starting
Ipchains
In order to have IP masquerading configured and started every system boot,
create a start-up script or an rc.d script. Every
time a system starts up, a set of scripts residing in /etc/rc.d/
are run. In these scripts are essential system services like the telnet daemon,
ftp daemon, mount daemon and more. For our setup, eth0
will be connected to the internal network and eth1
will be connected to the Internet. If using a dial-up connection, such as
ppp0, make sure to enable the line for
dynaddr below.
Here is a sample /etc/rc.d/rc.firewall file,
where we'll keep all our IP masquerading startup commands.
#!/bin/sh
/sbin/depmod -a # allows loading of modules into the kernel
# The following are custom modules, which allows use of
# tricky protocols through the firewall. It's general rule
# to use only those really needed.
/sbin/modprobe ip_masq_ftp # to FTP out
/sbin/modprobe ip_masq_raudio # enable RealAudio
/sbin/modprobe ip_masq_irc # enable IRC DCC
/sbin/modprobe ip_masq_quake ports=26000,27000,27910,27960 # Quake I/II/III
/sbin/modprobe ip_masq_cuseeme # CuSeeMe
/sbin/modprobe ip_masq_vdolive # VDO-live
echo "1" > /proc/sys/net/ipv4/ip_forward # Enables IP
Forwarding! Important!
echo "1" > /proc/sys/net/ipv4/ip_dynaddr # Do this if on a dialup (ppp0)
/sbin/ipchains -M -S 7200 10 160 # Set timeouts on
masquerading sessions.
# Here, 2 hours idle for TCP sessions
# 10 seconds after a TCP FIN is received
# 2 minutes for UDP packets
/sbin/ipchains -P forward DENY # By default, deny packet
forwarding
/sbin/ipchains -A forward -s 192.168.0.0/24 -j MASQ # Enable IP masquerading
# 192.168.0.0/24 is the subnet of our
# internal network. This must be changed
# to reflect the proper subnet of your
# internal network, otherwise masq'ing
# will fail. Try Daryl's Subnet Calc.
# ipprimer.windsorcs.com/subnet.html
/sbin/ipchains -N infilt # create a new "chain" named
infilt
/sbin/ipchains -A input -i eth1 -j infilt # use infilt to check data from eth1
/sbin/ipchains -A infilt -s 192.168.0.0/24 -l -j DENY
# deny anything from eth1 (the Internet
# interface) that says it's coming
# from the internal network. This will
# help prevent spoofing.
Before adding this to our startup scripts, we will want to test it. To do
this, simply execute /etc/rc.d/rc.firewall. If we
see no output, it's pretty safe to say that the commands worked. To configure
the client side, simply set the default gateway to that of your Linux machine.
There are several tools available to monitor your IP masquerader. One of them
is netstat. This tool will give a quick rundown of
who is masquerading to where. Output may be similar to something like this:
$ netstat -M
IP masquerading entries
prot expire source destination ports
tcp 46:01.49 ntbox www.netearth.com 2806 -> 3306 (63673)
tcp 118:00.35 macintoy 152.163.244.159 1038 -> 5190 (62427)
tcp 4:36.31 macintoy www.linuxplanet.com 55076 -> www (61675)
tcp 119:48.56 ntbox web2.netearth.com 4337 -> ssh (63658)
$
Another tool is ipchains -L -v. This will give
some overall statistics on the IP masquerading connection, including some basic
bandwidth usage reports.
So what's so cool about this? You can maintain a single Internet connection
for multiple users on multiple operating systems, using Linux as the gateway to
the Internet. Plus, because ipchains and Linux
itself are low cost or free, creating and maintaining this setup is much easier,
and in many cases more secure, than a more expensive Windows solution.
|