Iptables uitleg door Piethein Strengholt

Sinds Kernel versie 2.4 wordt er geen gebruik meer gemaakt van ipchains. Ipchains is de nieuwe manier om je netwerk te delen en je firewall op te zetten. hier onder volgt een kort scriptje om je netwerk te delen. Internet zit bij mij op eth0 en mijn netwerk achter eth1. Ik moet er bij zeggen dat dit niet de meest veilige manier is. Alles staat open! Ik raad je aan deze site te bezoeken. Deze is ook Nederlandstalig en bevat zeer veel goede informatie: http://www.nedlinux.nl/~bart/?page=9

Voorbeeld scripten:

firewall zonder nat
firewall met nat

# Dit script doet precies hetzelfde wat proggies zoals ICS of Winroute onder Windows doen,
# namelijk alles forwarden van interface0 naar interface1.
#
# External network (internet) eth0
# Internal private network eth1
# module iptable_nat laden en ipforward activeren
modprobe iptable_nat
echo 1 > /proc/sys/net/ipv4/ip_forward
# alle waardes laten vallen, schoonmaken
iptables --flush
iptables --table nat --flush
iptables --delete-chain
iptables --table nat --delete-chain
# zooi routen
iptables --table nat --append POSTROUTING --out-interface eth0 -j MASQUERADE
iptables --append FORWARD --in-interface eth1 -j ACCEPT
# voorbeeld half-life porten forwarden naar 192.168.0.4
iptables -A PREROUTING -t nat -p TCP --destination 213.73.176.210 --dport 27000:27999 -j DNAT --to 192.168.0.4
iptables -A PREROUTING -t nat -p UDP --destination 213.73.176.210 --dport 27000:27999 -j DNAT --to 192.168.0.4

---------------------------

Verder vind ik dit een bijzonder goed script:

#!/bin/sh

# Masquerading firewall (relatief veilig)

# Een hele relatief veilige masquerading firewall waarmee het mogelijk om met
# het hele achterliggende LAN het internet op te kunnen. De default policy wordt
# op 'weiger alles' gezet, waarna er gaten in de firewall worden gemaakt.
# Alleen de variabelen moeten aan de omgeving worden aangepast.
# Dit script dient alleen als voorbeeld. Het geeft aan hoe de theorie van
# hierboven kan worden toegepast. Hiervoor lever ik GEEN support.
# Kom dus niet aan met mailtjes van 'help, het werkt niet"...


################################################################################
# variabelen

## variabelen die moeten worden aangepast aan omgeving

# waar iptables staat
IPTABLES="/usr/sbin/iptables"

# interfaces
INTERNAL_INTERFACE="eth0" # interface waarmee gateway aan lokale netwerk zit (aanpassen aan eigen omgeving)
EXTERNAL_INTERFACE="ppp0" # interface waarmee gateway aan het internet zit (aanpassen aan eigen omgeving)

# ipadressen / netwerken
IPADDR="212.12.34.56" # internet ip adres
LAN="192.168.1.0/24" # lokale netwerk (aanpassen aan eigen omgeving)

# overige
MASQ="yes"
HTTP_SERVER="yes"
FTP_SERVER="no"
SSH_SERVER="yes"
NAME_SERVER="no"
SMTP_SERVER="no"
TELNET_SERVER="no"
LOG="yes"


## variabelen die NIET moeten worden aangepast

# interfaces
LOOPBACK_INTERFACE="lo" # loopback interface

# ipadressen / netwerken
ANYWHERE="0.0.0.0/0" # elk ip adres valt hierbinnen
LOOPBACK="127.0.0.1" # ip adres van localhost
CLASS_A="10.0.0.0/8" # klasse A prive netwerk
CLASS_B="172.16.0.0/12" # klasse B prive netwerk
CLASS_C="192.168.0.0/24" # klasse C prive netwerk

# poorten
PRIVPORTS="0:1023"
UNPRIVPORTS="1024:65535"

################################################################################
# clean-up + init

# flush en clear alle rules en zet de tellers op 0
$IPTABLES -F
$IPTABLES -X
$IPTABLES -Z
$IPTABLES -t nat -F
$IPTABLES -t nat -X
$IPTABLES -t nat -Z

# set de default policies
$IPTABLES -P INPUT DROP
$IPTABLES -P FORWARD DROP
$IPTABLES -P OUTPUT DROP
$IPTABLES -t nat -P PREROUTING ACCEPT
$IPTABLES -t nat -P POSTROUTING ACCEPT
$IPTABLES -t nat -P OUTPUT ACCEPT


################################################################################
# initialiseren van de kernel

## Enable IP forwarding
echo 1 > /proc/sys/net/ipv4/ip_forward

## Enable IP-spoofing beveiliging
for f in /proc/sys/net/ipv4/conf/*/rp_filter ; do
echo 1 > $f
done

## Disable ICMP redirect acceptatie
for f in /proc/sys/net/ipv4/conf/*/accept_redirects ; do
echo 0 > $f
done

## Disable ICMP send_redirects
for f in /proc/sys/net/ipv4/conf/*/send_redirects ; do
echo 0 > $f
done

## Source routed pakketten niet accepteren
for f in /proc/sys/net/ipv4/conf/*/accept_source_route ; do
echo 0 > $f
done

## Log spoofed pakketten, source routed pakketten en redirected pakketten
for f in /proc/sys/net/ipv4/conf/*/log_martians ; do
echo 1 > $f
done

## Enable TCP SYN cookie beveiliging
echo 1 > /proc/sys/net/ipv4/tcp_syncookies

## Enable ICMP broadcasting protection
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts

## Enable ICMP dead error message protection
echo 1 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses

## Enable dynamic TCP/IP address hacking
echo 1 > /proc/sys/net/ipv4/ip_dynaddr

################################################################################
# op de loopback interface kunnen (en moeten) we alles toelaten

## Onbeperkt verkeer op lo toestaan
$IPTABLES -A INPUT -i $LOOPBACK_INTERFACE -j ACCEPT
$IPTABLES -A OUTPUT -o $LOOPBACK_INTERFACE -j ACCEPT


################################################################################
# in de gemiddelde HTK-environment kunnen we ook alles op het lokale netwerk
# toelaten

## Onbeperkt verkeer op interne interface toestaan
$IPTABLES -A INPUT -i $INTERNAL_INTERFACE -j ACCEPT
$IPTABLES -A OUTPUT -o $INTERNAL_INTERFACE -j ACCEPT

################################################################################
# sommige pakketten resoluut weigeren

## Weiger (en log) alle gefragmenteerde pakketten
$IPTABLES -A INPUT -i $EXTERNAL_INTERFACE -f -j LOG --log-prefix "FRAGMENT! "
$IPTABLES -A INPUT -i $EXTERNAL_INTERFACE -f -j DROP

## Weiger (en log) alles van privenetwerken op externe iface
$IPTABLES -A INPUT -i $EXTERNAL_INTERFACE -s $LOOPBACK -j LOG --log-prefix "SPOOFING! "
$IPTABLES -A INPUT -i $EXTERNAL_INTERFACE -s $CLASS_A -j LOG --log-prefix "CLASS A ADDRESS! "
$IPTABLES -A INPUT -i $EXTERNAL_INTERFACE -s $CLASS_B -j LOG --log-prefix "CLASS B ADDRESS! "
$IPTABLES -A INPUT -i $EXTERNAL_INTERFACE -s $CLASS_C -j LOG --log-prefix "CLASS C ADDRESS! "
$IPTABLES -A INPUT -i $EXTERNAL_INTERFACE -s $LOOPBACK -j DROP
$IPTABLES -A INPUT -i $EXTERNAL_INTERFACE -s $CLASS_A -j DROP
$IPTABLES -A INPUT -i $EXTERNAL_INTERFACE -s $CLASS_B -j DROP
$IPTABLES -A INPUT -i $EXTERNAL_INTERFACE -s $CLASS_C -j DROP


################################################################################
# masquerade

## Alles met afkomst van of bestemming lokale netwerk heeft forwarden
if [ $MASQ = yes ] ; then
$IPTABLES -A POSTROUTING -t nat -o $EXTERNAL_INTERFACE -j MASQUERADE
$IPTABLES -A FORWARD -i $INTERNAL_INTERFACE -o $EXTERNAL_INTERFACE -s $LAN -d ! $LAN -j ACCEPT
$IPTABLES -A FORWARD -o $INTERNAL_INTERFACE -i $EXTERNAL_INTERFACE -d $LAN -s ! $LAN -j ACCEPT
fi


################################################################################
# accepteer bepaalde ICMP pakketten

## Een aantal typen ICMP pakketten accepteren
$IPTABLES -A INPUT -i $EXTERNAL_INTERFACE -p icmp \
--icmp-type 0 -s $ANYWHERE -d $IPADDR \
-m limit --limit 2/s -j ACCEPT

$IPTABLES -A INPUT -i $EXTERNAL_INTERFACE -p icmp \
--icmp-type 3 -s $ANYWHERE -d $IPADDR \
-m limit --limit 2/s -j ACCEPT

$IPTABLES -A INPUT -i $EXTERNAL_INTERFACE -p icmp \
--icmp-type 5 -s $ANYWHERE -d $IPADDR \
-m limit --limit 2/s -j ACCEPT

$IPTABLES -A INPUT -i $EXTERNAL_INTERFACE -p icmp \
--icmp-type 8 -s $ANYWHERE -d $IPADDR \
-m limit --limit 2/s -j ACCEPT

$IPTABLES -A INPUT -i $EXTERNAL_INTERFACE -p icmp \
--icmp-type 11 -s $ANYWHERE -d $IPADDR \
-m limit --limit 10/s -j ACCEPT


$IPTABLES -A OUTPUT -o $EXTERNAL_INTERFACE -p icmp \
--icmp-type 3 -s $IPADDR -d $ANYWHERE \
-m limit --limit 2/s -j ACCEPT

$IPTABLES -A OUTPUT -o $EXTERNAL_INTERFACE -p icmp \
--icmp-type 8 -s $IPADDR -d $ANYWHERE \
-m limit --limit 2/s -j ACCEPT

$IPTABLES -A OUTPUT -o $EXTERNAL_INTERFACE -p icmp \
--icmp-type 0 -s $IPADDR -d $ANYWHERE \
-m limit --limit 2/s -j ACCEPT

$IPTABLES -A OUTPUT -o $EXTERNAL_INTERFACE -p icmp \
--icmp-type 11 -s $IPADDR -d $ANYWHERE \
-m limit --limit 10/s -j ACCEPT


################################################################################
# TCP connecties gestart vanuit lokale netwerk accepteren

## accepteer TCP connecties vlgs SYS, ACK+SYN, ACK principe
$IPTABLES -A OUTPUT -o $EXTERNAL_INTERFACE -p tcp \
-m state --state ESTABLISHED,RELATED \
-s $IPADDR -d $ANYWHERE -j ACCEPT

$IPTABLES -A INPUT -i $EXTERNAL_INTERFACE -p tcp \
-m state --state ESTABLISHED,RELATED \
-s $ANYWHERE -d $IPADDR -j ACCEPT

$IPTABLES -A OUTPUT -o $EXTERNAL_INTERFACE -p tcp \
--tcp-flags ACK,SYN SYN \
-s $IPADDR -d $ANYWHERE -j ACCEPT

## auth aanvragen accepteren (voorkomt timeouts)
$IPTABLES -A INPUT -i $EXTERNAL_INTERFACE -p tcp \
-s $ANYWHERE -d $IPADDR \
--source-port $UNPRIVPORTS --destination-port 113 -j ACCEPT

################################################################################
# UDP

## dns aanvragen vanuit lokale netwerk toestaan
$IPTABLES -A INPUT -i $EXTERNAL_INTERFACE -p udp \
-s $ANYWHERE -d $IPADDR \
--source-port 53 --destination-port $UNPRIVPORTS -j ACCEPT

$IPTABLES -A OUTPUT -o $EXTERNAL_INTERFACE -p udp \
-s $IPADDR -d $ANYWHERE \
--source-port $UNPRIVPORTS --destination-port 53 -j ACCEPT

## traceroute toestaan
$IPTABLES -A INPUT -i $EXTERNAL_INTERFACE -p udp \
-s $ANYWHERE -d $IPADDR \
--source-port 32769:65535 --destination-port 33434:33523 -j ACCEPT

$IPTABLES -A OUTPUT -o $EXTERNAL_INTERFACE -p udp \
-s $IPADDR -d $ANYWHERE \
--source-port 32769:65535 --destination-port 33434:33523 -j ACCEPT

## time toestaan
$IPTABLES -A INPUT -i $EXTERNAL_INTERFACE -p udp \
-s $ANYWHERE -d $IPADDR \
--source-port 37 --destination-port $UNPRIVPORTS -j ACCEPT

$IPTABLES -A OUTPUT -o $EXTERNAL_INTERFACE -p udp \
-s $IPADDR -d $ANYWHERE \
--source-port $UNPRIVPORTS --destination-port 37 -j ACCEPT

# andere UDP poorten hier toevoegen


################################################################################
# zelf servers draaien

## http server openstellen voor buitenwereld
if [ $HTTP_SERVER = yes ] ; then
$IPTABLES -A INPUT -i $EXTERNAL_INTERFACE -p tcp \
-s $ANYWHERE -d $IPADDR \
--source-port $UNPRIVPORTS --destination-port 80 -j ACCEPT

$IPTABLES -A OUTPUT -o $EXTERNAL_INTERFACE -p tcp \
-s $IPADDR -d $ANYWHERE \
--source-port 80 --destination-port $UNPRIVPORTS -j ACCEPT
fi

## nameserver openstellen voor buitenwereld
if [ $NAME_SERVER = yes ] ; then
$IPTABLES -A INPUT -i $EXTERNAL_INTERFACE -p tcp \
-s $ANYWHERE -d $IPADDR \
--source-port $UNPRIVPORTS --destination-port 53 -j ACCEPT

$IPTABLES -A OUTPUT -o $EXTERNAL_INTERFACE -p tcp \
-s $IPADDR -d $ANYWHERE \
--source-port 53 --destination-port $UNPRIVPORTS -j ACCEPT
fi

## ssh server openstellen voor buitenwereld
if [ $SSH_SERVER = yes ] ; then
$IPTABLES -A INPUT -i $EXTERNAL_INTERFACE -p tcp \
-s $ANYWHERE -d $IPADDR \
--source-port $UNPRIVPORTS --destination-port 22 -j ACCEPT

$IPTABLES -A OUTPUT -o $EXTERNAL_INTERFACE -p tcp \
-s $IPADDR -d $ANYWHERE \
--source-port 22 --destination-port $UNPRIVPORTS -j ACCEPT
fi

## telnet server openstellen voor buitenwereld
if [ $TELNET_SERVER = yes ] ; then
$IPTABLES -A INPUT -i $EXTERNAL_INTERFACE -p tcp \
-s $ANYWHERE -d $IPADDR \
--source-port $UNPRIVPORTS --destination-port 25 -j ACCEPT

$IPTABLES -A OUTPUT -o $EXTERNAL_INTERFACE -p tcp \
-s $IPADDR -d $ANYWHERE \
--source-port 25 --destination-port $UNPRIVPORTS -j ACCEPT
fi

## smtp server openstellen voor buitenwereld
if [ $SMTP_SERVER = yes ] ; then
$IPTABLES -A INPUT -i $EXTERNAL_INTERFACE -p tcp \
-s $ANYWHERE -d $IPADDR \
--source-port $UNPRIVPORTS --destination-port 25 -j ACCEPT

$IPTABLES -A OUTPUT -o $EXTERNAL_INTERFACE -p tcp \
-s $IPADDR -d $ANYWHERE \
--source-port 25 --destination-port $UNPRIVPORTS -j ACCEPT
fi

## ftp server openstellen voor buitenwereld
if [ $FTP_SERVER = yes ] ; then
$IPTABLES -A INPUT -i $EXTERNAL_INTERFACE -p tcp \
-s $ANYWHERE -d $IPADDR -m state --state NEW,ESTABLISHED \
--source-port $UNPRIVPORTS --destination-port 21 -j ACCEPT

$IPTABLES -A OUTPUT -o $EXTERNAL_INTERFACE -p tcp \
-s $IPADDR -d $ANYWHERE -m state --state ESTABLISHED,RELATED \
--source-port 21 --destination-port $UNPRIVPORTS -j ACCEPT

## ftp server - active
$IPTABLES -A INPUT -i $EXTERNAL_INTERFACE -p tcp \
-s $ANYWHERE -d $IPADDR -m state --state ESTABLISHED,RELATED ! --syn \
--destination-port 20 -j ACCEPT

$IPTABLES -A OUTPUT -o $EXTERNAL_INTERFACE -p tcp \
-s $IPADDR -d $ANYWHERE -m state --state ESTABLISHED,RELATED \
--source-port 20 -j ACCEPT

## ftp server - passive
$IPTABLES -A INPUT -i $EXTERNAL_INTERFACE -p tcp \
-s $ANYWHERE -d $IPADDR -m state --state ESTABLISHED,RELATED \
--destination-port $UNPRIVPORTS -j ACCEPT

$IPTABLES -A OUTPUT -o $EXTERNAL_INTERFACE -p tcp \
-s $IPADDR -d $ANYWHERE -m state --state ESTABLISHED,RELATED \
--source-port $UNPRIVPORTS -j ACCEPT
fi


################################################################################
# trash opvangen

# alles dat nu nog wordt opgevangen loggen
if [ $LOG = yes ] ; then
$IPTABLES -A INPUT -j LOG --log-prefix "filtered on INPUT "
$IPTABLES -A OUTPUT -j LOG --log-prefix "filtered on OUTPUT "
$IPTABLES -A FORWARD -j LOG --log-prefix "filtered on FORWARD "
fi

Uitleg:

This command appends the rule to the end of the chain. The rule will will in other words always be put last in the ruleset in comparison to previously added rules, and hence be checked last, unless you append or insert more rules later on. (-A).
This command tells the kernel to set a specified default target, or policy, on a chain. All packets that don't match any rule will then be forced to use the policy of the chain. Legal targets are: DROP, ACCEPT and REJECT (There might be more, mail me if so) (-P).

-------------------------------------------------------
Wat extra informatie:

- Flush alle instellingen
iptables -F

- Al het tcp verkeer mag naar binnen ( er kan ook gekozen worden voor udp, met '-p udp' optie )
iptables -A INPUT -p tcp

- Zet SSH binnekomend op poort 22 open voor de buitenwereld
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p udp --dport 22 -j ACCEPT

- Zet 22 tot 80 binnekomend voor de buitenwereld
iptables -A INPUT -p tcp --dport 22:80 -j ACCEPT
iptables -A INPUT -p udp --dport 22:80 -j ACCEPT

- Zet 22,53.80,110 binnenkomend open voor de buitenwereld
iptables -A INPUT -p tcp -m multiport --dport 22,53,80,110
iptables -A INPUT -p udp -m multiport --dport 22,53,80,110

- Zet SSH inkomend open voor ip's tussen 192.168.0.1 t/m 110
iptables -A INPUT -p tcp --dport 22 -s 192.168.0.110/32 -j ACCEPT
iptables -A INPUT -p udp --dport 22 -s 192.168.0.110/32 -j ACCEPT

- Zet irc uitgaand poort 6667 dicht
iptables -A OUTPUT -p tcp --dport 6667 -j DENY

- Open ftp port op eth0
iptables -A INPUT -p tcp -i eth0 --dport 21 -j ACCEPT
iptables -A INPUT -p udp -i eth0 --dport 21 -j ACCEPT

- Accepteer Samba van binnenuit netwerk
iptables -A INPUT -p tcp --syn -s 192.168.10.0/24 --dport 139 -j ACCEPT
iptables -A INPUT -p tcp --syn -s trancas --destination-port 139 -j ACCEPT

- weiger al het verkeer inkomend!
iptables -A INPUT -p tcp -j DENY

- Drop alle instellingen.. Alleen de instellingen zoals hierboven blijven bewaard
iptables -P INPUT DROP

Het volgende script laat alleen binnenkomende HTTP en SSH pakketen door en logt alles:

iptables -P INPUT ROP
iptables -A INPUT -s 0/0 -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -s 0/0 -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -j DROP
iptables -A INPUT -j log

- telnet aflsuiten voor eth0
iptables -A INPUT -p tcp --dport 23 -i eth0 -j DROP

-weiger al het inkomend verkeer op eth0 port 139
iptables -A INPUT -p tcp --dport 139 -i eth0 -j DROP


----------

First, set a rule that allows ssh within the network on the INPUT chain.

iptables -A INPUT -s 198.168.0.0 -p tcp --destination-port ssh -j ACCEPT

The source (-s) argument tells iptables which network or hosts from which you're willing to accept connections, while --destination-port specifies the type of TCP connection you're willing to accept. Next, block any connections from outside your internal network:

iptables -A INPUT -s ! 198.168.0.0 -p tcp --destination-port ssh -j DROP

Finally, to block outgoing telnet connections, apply this rule to the OUTPUT chain:

iptables -A OUTPUT -p tcp --destination-port telnet -j DROP

Instead of appending (-A) a rule to the INPUT chain, we've added the rule to the OUTPUT chain. If users try to telnet out, they'll be unable to get a connection. However, this might frustrate users who wait indefinitely for the telnet connection to finish. So, let's reject the packets instead of just dropping them.

iptables -F OUTPUT
iptables -A OUTPUT -p tcp --destination-port telnet -j REJECT

If you want to allow telnet connections within the internal network, flush the previous rules and use these commands to

set rules that allow telnet inside the network, but not outside:

iptables -A OUTPUT -p tcp --destination-port telnet -d 198.168.0.0 -j ACCEPT
iptables -A OUTPUT -p tcp --destination-port telnet -d ! 198.168.0.0 -j REJECT


You may want to run iptables -L again to see what rules you've got going and make sure they've all been entered correctly. Your output should look something like the image to the right: