Firewall Wizards mailing list archives
Big Question
From: Chris Malott <chrismalott () chameleonweb net>
Date: Tue, 31 Oct 2000 15:10:57 -0800
I just upgraded to kern 2.4.0-test9 due to my wish to use iptables.
Here is my iptables configuration file. For some reason I can't get it to
port forward.
Any help is greatly appreciated. And Yes I'm a newbie to iptables
#!/bin/sh
##################################################################
#
## rc.firewall.iptables
#
##################################################################
## Variables
IPTABLES="/usr/local/bin/iptables"
INTERNAL="eth1" # Internal Interface
EXTERNAL="eth0" # External Interface
## Flush Built-in Rules
$IPTABLES -F
$IPTABLES -F INPUT
$IPTABLES -F OUTPUT
$IPTABLES -F FORWARD
$IPTABLES -F -t mangle
$IPTABLES -X
## Set Default Policies
$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT ACCEPT
$IPTABLES -P FORWARD ACCEPT
## Special Chains First, INPUT/OUTPUT chains will follow
############################################################################
#
## Special Chains
############################################################################
#
############################################################################
#
## Special chain KEEP_STATE to handle incoming, outgoing, and
## established connections.
$IPTABLES -N KEEP_STATE
$IPTABLES -F KEEP_STATE
## ACCEPT certain packets which are starting a new connection or are
## related to an established connection.
## ACCEPT packets whose input interface is anything but the external
interface.
$IPTABLES -A KEEP_STATE -m state --state RELATED,ESTABLISHED -j ACCEPT
$IPTABLES -A KEEP_STATE -i ! $EXTERNAL -m state --state NEW -j ACCEPT
## DROP packets associated with a NEW or "INVALID" connection.
## DROP TCP packets with only the SYN, SYN/URG, or SYN/PUSH flag set,
## perhaps a bit redundant.
$IPTABLES -A KEEP_STATE -i $EXTERNAL -m state --state INVALID,NEW -j
DROP
$IPTABLES -A KEEP_STATE -i $EXTERNAL -p tcp --tcp-flags SYN,ACK SYN -j
DROP
############################################################################
#
## Special chain CHECK_FLAGS that will DROP and log TCP packets with certain
## TCP flags set.
## We set some limits here to limit the amount of crap that gets sent to the
logs.
## Keep in mind that the first dozen rules should never match normal
traffic, these
## rules are designed to capture obviously messed up packets... But there's
## alot of wierd shit out there, so who knows.
$IPTABLES -N CHECK_FLAGS
$IPTABLES -F CHECK_FLAGS
$IPTABLES -A CHECK_FLAGS -p tcp --tcp-flags ALL FIN,URG,PSH -m limit
--limit 5/minute -j LOG --log-level 1 --log-prefix "NMAP-XMAS:" ## NMAP
Stuff
$IPTABLES -A CHECK_FLAGS -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP
$IPTABLES -A CHECK_FLAGS -p tcp --tcp-flags ALL ALL -m limit --limit
5/minute -j LOG --log-level 1 --log-prefix "Merry XMAS:"
$IPTABLES -A CHECK_FLAGS -p tcp --tcp-flags ALL ALL -j DROP
$IPTABLES -A CHECK_FLAGS -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -m
limit --limit 5/minute -j LOG --log-level 1 --log-prefix "XMAS-PSH:"
$IPTABLES -A CHECK_FLAGS -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j
DROP
$IPTABLES -A CHECK_FLAGS -p tcp --tcp-flags ALL NONE -m limit --limit
5/minute -j LOG --log-level 1 --log-prefix "NULL_SCAN:"
$IPTABLES -A CHECK_FLAGS -p tcp --tcp-flags ALL NONE -j DROP
$IPTABLES -A CHECK_FLAGS -p tcp --tcp-flags SYN,RST SYN,RST -m limit
--limit 5/minute -j LOG --log-level 5 --log-prefix "SYN/RST:"
$IPTABLES -A CHECK_FLAGS -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
$IPTABLES -A CHECK_FLAGS -p tcp --tcp-flags SYN,FIN SYN,FIN -m limit
--limit 5/minute -j LOG --log-level 5 --log-prefix "SYN/FIN:"
$IPTABLES -A CHECK_FLAGS -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
## Make some types of port scanning annoyingly slow, also provides some
protection
## against certain DoS attacks. Adjust for your network. The rule in
chain
## KEEP_STATE referring to the INVALID state should catch most TCP
packets with
## the RST or FIN bits set that aren't associate with an established
connection.
## Still, these will limit the amount of stuff that is accepted through
our open ports.
#$IPTABLES -A CHECK_FLAGS -m limit --limit 1/second -p tcp --tcp-flags
ALL RST -j ACCEPT
#$IPTABLES -A CHECK_FLAGS -m limit --limit 1/second -p tcp --tcp-flags
ALL FIN -j ACCEPT
#$IPTABLES -A CHECK_FLAGS -m limit --limit 1/second -p tcp --tcp-flags
ALL SYN -j ACCEPT
############################################################################
#
## Firewall Input Chains
############################################################################
#
############################################################################
#
## New chain for input to the external interface
$IPTABLES -N EXTERNAL-input
$IPTABLES -F EXTERNAL-input # Flush chain
## Just DROP all unroutables.
## Since we're on Roger's cable network, there are some legitimate
## unroutables out there, so some of these remain commented for now. (fuqed)
$IPTABLES -A EXTERNAL-input -i $EXTERNAL -s 10.0.0.0/8 -j DROP
$IPTABLES -A EXTERNAL-input -i $EXTERNAL -d 10.0.0.0/8 -j DROP
$IPTABLES -A EXTERNAL-input -i $EXTERNAL -s 172.16.0.0/12 -j DROP
$IPTABLES -A EXTERNAL-input -i $EXTERNAL -d 172.16.0.0/12 -j DROP
$IPTABLES -A EXTERNAL-input -i $EXTERNAL -s 192.168.0.0/16 -j DROP
$IPTABLES -A EXTERNAL-input -i $EXTERNAL -d 192.168.0.0/16 -j DROP
$IPTABLES -A EXTERNAL-input -i $EXTERNAL -d 224.0.0.0/8 -j DROP
## Check TCP packets coming in on the external interface for wierd flags
$IPTABLES -A EXTERNAL-input -i $EXTERNAL -p tcp -s 0/0 -j CHECK_FLAGS
## These next few serve to block particular ports on the external interface.
## Usually to confine the use of certain services or daemons.
## These are sometimes usefull.
## NFS, X, VNC, SMB, blah blah
# $IPTABLES -A EXTERNAL-input -i $EXTERNAL -p tcp -s 0/0 -d 0/0 --dport
137:139 -j DROP
# $IPTABLES -A EXTERNAL-input -i $EXTERNAL -p udp -s 0/0 -d 0/0 --dport
137:139 -j DROP
# $IPTABLES -A EXTERNAL-input -i $EXTERNAL -p tcp -s 0/0 -d 0/0 --dport
1433 -j DROP
# $IPTABLES -A EXTERNAL-input -i $EXTERNAL -p udp -s 0/0 -d 0/0 --dport
1433 -j DROP
# $IPTABLES -A EXTERNAL-input -i $EXTERNAL -p tcp -s 0/0 -d 0/0 --dport
2049 -j DROP
# $IPTABLES -A EXTERNAL-input -i $EXTERNAL -p udp -s 0/0 -d 0/0 --dport
2049 -j DROP
# $IPTABLES -A EXTERNAL-input -i $EXTERNAL -p tcp -s 0/0 -d 0/0 --dport
5432 -j DROP
# $IPTABLES -A EXTERNAL-input -i $EXTERNAL -p udp -s 0/0 -d 0/0 --dport
5432 -j DROP
# $IPTABLES -A EXTERNAL-input -i $EXTERNAL -p tcp -s 0/0 -d 0/0 --dport
5999:6010 -j DROP
# $IPTABLES -A EXTERNAL-input -i $EXTERNAL -p udp -s 0/0 -d 0/0 --dport
5999:6010 -j DROP
# $IPTABLES -A EXTERNAL-input -i $EXTERNAL -p tcp -s 0/0 -d 0/0 --dport
5900:5910 -j DROP
# $IPTABLES -A EXTERNAL-input -i $EXTERNAL -p udp -s 0/0 -d 0/0 --dport
5900:5910 -j DROP
## ALLOW foreign machines to access certain services.
$IPTABLES -A EXTERNAL-input -i $EXTERNAL -p tcp -s 0/0 --dport 20 -j
ACCEPT
$IPTABLES -A EXTERNAL-input -i $EXTERNAL -p tcp -s 0/0 --dport 21 -j
ACCEPT
$IPTABLES -A EXTERNAL-input -i $EXTERNAL -p tcp -s 0/0 --dport 80 -j
ACCEPT
$IPTABLES -A EXTERNAL-input -i $EXTERNAL -p tcp -s 0/0 --dport 443 -j
ACCEPT
$IPTABLES -A EXTERNAL-input -i $EXTERNAL -p tcp -s 0/0 --dport 25 -j
ACCEPT
$IPTABLES -A EXTERNAL-input -i $EXTERNAL -p tcp -s 0/0 --dport 22 -j
ACCEPT
$IPTABLES -A EXTERNAL-input -i $EXTERNAL -p udp -s 0/0 --dport 110 -j
ACCEPT
$IPTABLES -A EXTERNAL-input -i $EXTERNAL -p tcp -s 0/0 --dport 53 -j
ACCEPT
$IPTABLES -A EXTERNAL-input -i $EXTERNAL -p tcp -s 0/0 --dport 110 -j
ACCEPT
$IPTABLES -A EXTERNAL-input -i $EXTERNAL -p tcp -s 0/0 --dport 113 -j
REJECT
## ICMP Stuff, we're going to allow some ICMP.
## DROP fragmented ICMP packets(sure, why not)
## This will only catch the second and further fragments.
$IPTABLES -A EXTERNAL-input -i $EXTERNAL -f -p icmp -j DROP
## Echo Reply (pong)
$IPTABLES -A EXTERNAL-input -i $EXTERNAL -p icmp --icmp-type 0 -j ACCEPT
## Destination Unreachable (blah)
$IPTABLES -A EXTERNAL-input -i $EXTERNAL -p icmp --icmp-type 3 -j ACCEPT
## Echo Request (ping) -- Comment this if you don't like to be pinged
# $IPTABLES -A EXTERNAL-input -i $EXTERNAL -p icmp --icmp-type 8 -j
ACCEPT
$IPTABLES -A EXTERNAL-input -i $EXTERNAL -p icmp --icmp-type 8 -m limit
--limit 1/second -j ACCEPT
## TTL Exceeded (traceroute)
$IPTABLES -A EXTERNAL-input -i $EXTERNAL -p icmp --icmp-type 11 -j
ACCEPT
## DROP all icmp network broadcasts
## This may actually break things in a few cases
$IPTABLES -A EXTERNAL-input -i $EXTERNAL -p icmp -d 224.0.0.0/8 -j DROP
############################################################################
#
## New chain for input to the internal interface
$IPTABLES -N INTERNAL-input
$IPTABLES -F INTERNAL-input
## ACCEPT internal to internal traffic
$IPTABLES -A INTERNAL-input -i $INTERNAL -s 192.168.0.0/16 -d 0/0 -j
ACCEPT
## DROP anything not coming from the internal network
$IPTABLES -A INTERNAL-input -i $INTERNAL -s ! 192.168.0.0/16 -d 0/0 -j
DROP
############################################################################
#
## New chain for input to the loopback interface
$IPTABLES -N lo-input
$IPTABLES -F lo-input
## Accept packets to the loopback interface
$IPTABLES -A lo-input -i lo -j ACCEPT
############################################################################
#
## Firewall Output Chains
############################################################################
#
############################################################################
#
## New chain for output from the external interface
$IPTABLES -N EXTERNAL-output
$IPTABLES -F EXTERNAL-output
## ACCEPT outgoing packets on the external interface
$IPTABLES -A EXTERNAL-output -o $EXTERNAL -j ACCEPT
## Just DROP all outgoing unroutables.
$IPTABLES -A EXTERNAL-output -o $EXTERNAL -s 10.0.0.0/8 -j DROP
$IPTABLES -A EXTERNAL-output -o $EXTERNAL -d 10.0.0.0/8 -j DROP
$IPTABLES -A EXTERNAL-output -o $EXTERNAL -s 172.16.0.0/12 -j DROP
$IPTABLES -A EXTERNAL-output -o $EXTERNAL -d 172.16.0.0/12 -j DROP
$IPTABLES -A EXTERNAL-output -o $EXTERNAL -s 192.168.0.0/16 -j DROP
$IPTABLES -A EXTERNAL-output -o $EXTERNAL -d 192.168.0.0/16 -j DROP
$IPTABLES -A EXTERNAL-output -o $EXTERNAL -d 224.0.0.0/8 -j DROP
############################################################################
#
## New chain for output across the internal interface
$IPTABLES -N INTERNAL-output
$IPTABLES -F INTERNAL-output
## ACCEPT all outbound traffic across the internal interfaces
$IPTABLES -A INTERNAL-output -o $INTERNAL -j ACCEPT
############################################################################
#
## New chain for output across the loopback device
$IPTABLES -N lo-output
$IPTABLES -F lo-output
## ACCEPT all traffic across loopback device
$IPTABLES -A lo-output -o lo -j ACCEPT
############################################################################
#
## Main Stuff
############################################################################
#
## Jumping to our INPUT chains.
$IPTABLES -A INPUT -i $INTERNAL -j INTERNAL-input
$IPTABLES -A INPUT -i $EXTERNAL -j EXTERNAL-input
$IPTABLES -A INPUT -i lo -j lo-input
## Jump to KEEP_STATE to accept packets that are part of an established
## connection, and DROP packets that may be trying to establish a new
connection.
$IPTABLES -A INPUT -i $EXTERNAL -j KEEP_STATE
# $IPTABLES -A FORWARD -o $INTERNAL -p tcp -d 192.168.1.1 -j ACCEPT
$IPTABLES -A FORWARD -j KEEP_STATE
## Jump to our OUTPUT chains.
$IPTABLES -A OUTPUT -o $INTERNAL -j INTERNAL-output
$IPTABLES -A OUTPUT -o $EXTERNAL -j EXTERNAL-output
$IPTABLES -A OUTPUT -o lo -j lo-output
############################################################################
#
## More Stuff:
############################################################################
#
## Rule to mangle TOS values
## TOS stuff: (type: iptables -m tos -h)
## Minimize-Delay 16 (0x10)
## Maximize-Throughput 8 (0x08)
## Maximize-Reliability 4 (0x04)
## Minimize-Cost 2 (0x02)
## Normal-Service 0 (0x00)
## - Most of these are the RFC 1060/1349 compliant TOS values, yours might
vary.
## - The -d 0/0 is a bit redundant.
## - To view mangle table, type: iptables -L -t mangle
$IPTABLES -t mangle -A OUTPUT -o $EXTERNAL -p tcp -d 0/0 --dport 80 -j
TOS --set-tos 8 # 0x08
$IPTABLES -t mangle -A OUTPUT -o $EXTERNAL -p tcp -d 0/0 --dport 443 -j
TOS --set-tos 16 # 0x10
$IPTABLES -t mangle -A OUTPUT -o $EXTERNAL -p tcp -d 0/0 --dport 25 -j
TOS --set-tos 16 # 0x10
$IPTABLES -t mangle -A OUTPUT -o $EXTERNAL -p tcp -d 0/0 --dport 20 -j
TOS --set-tos 16 # 0x10
$IPTABLES -t mangle -A OUTPUT -o $EXTERNAL -p tcp -d 0/0 --dport 21 -j
TOS --set-tos 16 # 0x10
$IPTABLES -t mangle -A OUTPUT -o $EXTERNAL -p tcp -d 0/0 --dport 110 -j
TOS --set-tos 16 # 0x10
$IPTABLES -t mangle -A OUTPUT -o $EXTERNAL -p udp -d 0/0 --dport 22 -j
TOS --set-tos 16 # 0x10
### END FIREWALL RULES ###
## Might be a good idea to keep the NAT stuff in a separate file.
############################################################################
###
## IPTABLES Network Address Translation(NAT) Rules
############################################################################
###
#######################################################
## Destination NAT -- (DNAT)
#######################################################
extip="xxx.xxx.xxx.xxx"
## Redirect packets headed for certain ports on our external interface to
other
## machines on the network.
$IPTABLES -A PREROUTING -t nat -p tcp -d $extip --dport 80 -j DNAT --to
192.168.1.2:80
$IPTABLES -A PREROUTING -t nat -p tcp -d $extip --dport 443 -j DNAT --to
192.168.1.2:443
$IPTABLES -A PREROUTING -t nat -p tcp -d $extip --dport 25 -j DNAT --to
192.168.1.2:25
$IPTABLES -A PREROUTING -t nat -p tcp -d $extip --dport 20 -j DNAT --to
192.168.1.2:20
$IPTABLES -A PREROUTING -t nat -p tcp -d $extip --dport 21 -j DNAT --to
192.168.1.2:21
$IPTABLES -A PREROUTING -t nat -p tcp -d $extip --dport 110 -j DNAT --to
192.168.1.2:110
$IPTABLES -A PREROUTING -t nat -p tcp -d $extip --dport 22 -j DNAT --to
192.168.1.2:22
#for internal machines
$IPTABLES -A OUTPUT -t nat -p tcp -d $extip --dport 80 -j DNAT --to
192.168.1.2:80
$IPTABLES -A OUTPUT -t nat -p tcp -d $extip --dport 443 -j DNAT --to
192.168.1.2:443
$IPTABLES -A OUTPUT -t nat -p tcp -d $extip --dport 25 -j DNAT --to
192.168.1.2:25
$IPTABLES -A OUTPUT -t nat -p tcp -d $extip --dport 20 -j DNAT --to
192.168.1.2:20
$IPTABLES -A OUTPUT -t nat -p tcp -d $extip --dport 21 -j DNAT --to
192.168.1.2:21
$IPTABLES -A OUTPUT -t nat -p tcp -d $extip --dport 110 -j DNAT --to
192.168.1.2:110
$IPTABLES -A OUTPUT -t nat -p tcp -d $extip --dport 22 -j DNAT --to
192.168.1.2:22
#######################################################
## Source NAT -- (SNAT/Masquerading)
#######################################################
## Static IP address ##
## Change source address of outgoing packets on external
## interface to our IP address.
$IPTABLES -t nat -A POSTROUTING -o $EXTERNAL -j SNAT --to $extip
## Dynamic IP address ##
#$IPTABLES -t nat -A POSTROUTING -eth0 -j MASQUERADE
### END NAT RULES ###
############################################################################
###
## Additional Kernel Configuration
############################################################################
###
## Adjust for your requirements/preferences.
## Make sure you understand what these things are doing before you uncomment
## any of them. A good place to start would be some of the resources listed
## at the top of this script.
## These are certainly not the only cool things you can tweek in the
/proc/sys,
## check out some of the documentation with your Kernel source for more
info.
## Brief Explaination:
## - Disable source routing of packets
#if [ -e /proc/sys/net/ipv4/conf/all/accept_source_route ]; then
# for i in /proc/sys/net/ipv4/conf/*/accept_source_route; do
# echo 0 > $i;
# done
#fi
## - Enable rp_filter
#if [ -e /proc/sys/net/ipv4/conf/all/rp_filter ]; then
# for i in /proc/sys/net/ipv4/conf/*/rp_filter; do
# echo 1 > $i;
# done
#fi
## - Ignore any broadcast icmp echo requests
#if [ -e /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts ]; then
# echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
#fi
## - Ignore all icmp echo requests on all interfaces
#if [ -e /proc/sys/net/ipv4/icmp_echo_ignore_all ]; then
# echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_all
#fi
## - Local port range for TCP/UDP connections
#if [ -e /proc/sys/net/ipv4/ip_local_port_range ]; then
# echo -e "32768\t61000" > /proc/sys/net/ipv4/ip_local_port_range
#fi
## - "Log packets with impossible addresses to kernel log." (ip-sysctl.txt)
#if [ -e /proc/sys/net/ipv4/conf/all/log_martians ]; then
# echo 1 > /proc/sys/net/ipv4/conf/all/log_martians
#fi
## - Don't accept ICMP redirects
#if [ -e /proc/sys/net/ipv4/conf/all/accept_redirects ]; then
# echo 0 > /proc/sys/net/ipv4/conf/all/accept_redirects
#fi
## - Don't accept ICMP redirects
## (You may only want to disable on the external interface)
#if [ -e /proc/sys/net/ipv4/conf/$EXTERNAL/accept_redirects ]; then
# echo 0 > /proc/sys/net/ipv4/conf/$EXTERNAL/accept_redirects
#fi
## Additional options for dialup connections with a dynamic ip address
## See: linux/Documentation/networking/ip_dynaddr.txt
#if [ -e /proc/sys/net/ipv4/ip_dynaddr ]; then
# echo 1 > /proc/sys/net/ipv4/ip_dynaddr
#fi
## - Enable IP Forwarding
if [ -e /proc/sys/net/ipv4/ip_forward ]; then
echo 1 > /proc/sys/net/ipv4/ip_forward
else
echo "Error: /proc/sys/net/ipv4/ip_forward doesn't exist"
echo "(That may be a problem)"
fi
_______________________________________________
firewall-wizards mailing list
firewall-wizards () nfr com
http://www.nfr.com/mailman/listinfo/firewall-wizards
Current thread:
- Big Question Chris Malott (Nov 02)
