Firewall Features of the Linux 2.2 Kernel
by Steven Pritchard, Linux
Users of Central Illinois
Compile kernel.
Say Y or M as appropriate to all of the following:
Networking support (CONFIG_NET) [Y/n/?]
Network firewalls (CONFIG_FIREWALL) [Y/n/?]
TCP/IP networking (CONFIG_INET) [Y/n/?]
IP: firewalling (CONFIG_IP_FIREWALL) [Y/n/?]
IP: always defragment (required for masquerading) (CONFIG_IP_ALWAYS_DEFRAG) [Y/n/?]
IP: transparent proxy support (CONFIG_IP_TRANSPARENT_PROXY) [Y/n/?]
IP: masquerading (CONFIG_IP_MASQUERADE) [Y/n/?]
IP: masquerading special modules support (CONFIG_IP_MASQUERADE_MOD) [Y/n/?]
IP: ipportfw masq support (EXPERIMENTAL) (CONFIG_IP_MASQUERADE_IPPORTFW) [M/n/y/?]
You'll want to turn on most other firewalling/masquerading options as well. Obviously you'll also need to turn on the appropriate drivers for PPP and/or SLIP, ethernet devices, etc.
Boot new kernel.
Install new tools.
ipchains - http://www.rustcorp.com/linux/ipchains/
ipmasqadm - http://juanjox.linuxhq.com/
Set up networking.
Turn on IP forwarding.
Either
echo 1 > /proc/sys/net/ipv4/ip_forwardor on Red Hat (or similar systems), set FORWARD_IPV4=yes in /etc/sysconfig/network (or check the appropriate box in netcfg).
Set up firewalling rules.
#!/bin/sh # # firewall This shell script takes care of starting and stopping # IP masquerading and firewalling. # # Run the old 2.0 script if we're running a 2.0 kernel. if [ `uname -r | cut -d. -f1-2` = "2.0" ]; then exec /etc/rc.d/init.d/firewall-2.0 $* fi # Fill in with your Internet-accessible address. INET_ADDR= # Source function library. #. /etc/rc.d/init.d/functions # Source networking configuration. . /etc/sysconfig/network # Check that networking is up. [ ${NETWORKING} = "no" ] && exit 0 # See how we were called. case "$1" in start) echo -n "Starting firewall: " # Load ip_masq modules. for module in /lib/modules/`uname -r`/ipv4/ip_masq_*.o do modprobe `echo ${module} | cut -d/ -f6` done # Set up firewalling rules. ipchains -P input ACCEPT ipchains -P output ACCEPT ipchains -P forward REJECT # Block reserved addresses on the appropriate interfaces. # I originally had these set to REJECT, but that doesn't # make sense since the traffic is by definition invalid. ipchains -I input -p all -s 192.168.0.0/16 -i ppp0 -j DENY ipchains -I output -p all -s 192.168.0.0/16 -i ppp0 -j DENY ipchains -I input -p all -s 172.16.0.0/12 -i ppp0 -j DENY ipchains -I output -p all -s 172.16.0.0/12 -i ppp0 -j DENY ipchains -I input -p all -s 10.0.0.0/8 -i ppp0 -j DENY ipchains -I output -p all -s 10.0.0.0/8 -i ppp0 -j DENY ipchains -I input -p all -s 127.0.0.0/8 -i ppp0 -j DENY ipchains -I output -p all -s 127.0.0.0/8 -i ppp0 -j DENY ipchains -I input -p all -s 127.0.0.0/8 -i eth0 -j DENY ipchains -I output -p all -s 127.0.0.0/8 -i eth0 -j DENY ipchains -I input -p all -s 127.0.0.0/8 -i eth1 -j DENY ipchains -I output -p all -s 127.0.0.0/8 -i eth1 -j DENY # Forward anything on eth0 -> eth1 and vice-versa. ipchains -A forward -p all -s 192.168.0.0/24 -d 192.168.1.0/24 -i eth1 \ -j ACCEPT ipchains -A forward -p all -s 192.168.1.0/24 -d 192.168.0.0/24 -i eth0 \ -j ACCEPT # Don't allow connections from eth1 -> eth0. ipchains -A input -p tcp -s 192.168.1.0/24 -d 192.168.0.0/24 -i eth1 \ -y -j REJECT ipchains -A input -p udp -s 192.168.1.0/24 -d 192.168.0.0/24 -i eth1 \ -j REJECT # MASQ everything in 192.168.0.0 (from the ethernet interfaces). ipchains -A forward -p all -s 192.168.0.0/16 -d 0.0.0.0/0 -i ppp0 \ -j MASQ # Forward useful ports appropriately. # Make sure $INET_ADDR is filled in with your ppp0 address above. # domain -> server:domain ipmasqadm portfw -a -P udp -L $INET_ADDR 53 -R 192.168.1.1 53 ipmasqadm portfw -a -P tcp -L $INET_ADDR 53 -R 192.168.1.1 53 # http -> server:http ipmasqadm portfw -a -P tcp -L $INET_ADDR 80 -R 192.168.1.1 80 touch /var/lock/subsys/firewall echo ;; stop) echo -n "Shutting down firewall: " # Flush portfw rules. ipmasqadm portfw -f # Flush firewalling rules & accept everything. ipchains -F input ipchains -F output ipchains -F forward ipchains -P input ACCEPT ipchains -P output ACCEPT ipchains -P forward ACCEPT # Unload modules for module in `cat /proc/modules | grep '^ip_masq' | cut -d' ' -f1` do rmmod ${module} done echo "done" rm -f /var/lock/subsys/firewall ;; restart) $0 stop $0 start ;; *) echo "Usage: firewall {start|stop}" exit 1 esac exit 0