IPtables

Gå til:

Baserer seg på materialet om IPTABLES på Wikipedia Norge, og Iptables tutorial 1.2.2 av Oskar Andreasson

IPTABLES

Fungerer ved at nettverkspakker som kommer inn over nettverksgrensesnitt som iptables kjøres på blir analysert og sjekket ut gjennom et sett med tabeller og kjeder. I de aktuelle tabellene og kjedene blir pakkene analysert opp mot de forskjellige reglene som er satt, og deretter utføres det operasjoner i henhold til det vi ønsker skal skje med pakken.

Hva bør jeg kunne i forkant?

Før du starter med selve oppbyggingen av en komplisert brannmur, bør du ha noe forkunnskaper. Og i forhold til hva som er målet for dette kurset, trenger vi ikke all verdens kompetanse på alle mulige protokoller.

Superkort om protokoller

TCP

UDP

ICMP

Ord og uttrykk – iptables

Eksempler på regler:

Vi antar samme oppsett av nettverk somvist på tavle. En routermaskin (debian) med iptables, og en server og en klient på lokalnettet.

Forutsetter at vi baserer oss på open_brannmur.sh skriptet som vist, og at default policy for alle kjedene er satt til DROP.

# Tillate allerede etablert trafikk, og trafikk som er relatert til denne
$IPT -A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT

Denne regelen sjekker på statusen til pakkene og at allerede etablert trafikk, og trafikk relatert til dette godkjennes og aksepteres inn til routeren (LES: input kjedet)

# Tillate HTTP til og fra maskiner bak brannmuren
$IPT -A FORWARD -p tcp -m state –state NEW –dport 80 -j ACCEPT

# Route innkommende HTTP fra gw til HTTP port på server
$IPT -t nat -A PREROUTING -d 158.39.163.8 -p tcp –dport 80 -j DNAT –to 192.168.1.3:80

Den første av de to reglene godkjenner at nye tcp pakker som kommer til port 80 på lokalnettet og som skal sendes fra lokalnettet til port 80 på en maskine utenfor lokalnettet godkjennes. Dvs at ny tcp trafikk til og fra port 80 godkjennes. Den andre regelen NAT’er slik at trafikk som etterspørres på port 80 på den offentlige ip-adressen 158.39.163.8 rutes til vår servers ip (192.168.1.3) port 80. .

Hvis vi av en eller annen grunn vil f.eks. ha en webserver til på vårt lokalnett, som skulle nås utenfra ( med webadressen http://www.testwebserver.no:8080) og skulle gått på klienten (tenkt tilfelle) så kunne følgende regel vært brukt:

# Tillate HTTP til port 8080 og fra maskiner bak brannmuren
$IPT -A FORWARD -p tcp -m state –state NEW –dport 8080 -j ACCEPT

# Route innkommende HTTP fra gw på port 8080 til HTTP port på klient
$IPT -t nat -A PREROUTING -d 158.39.163.8 -p tcp –dport 8080 -j DNAT –to 192.168.1.30:80

Som vi ser er det lite som endres i regelsettet. Det eneste er at vi aksepterer ny TCP trafikk til port 8080, og at vi router trafikk fra port 8080 på vår router til standard port 80 på vår klient. Det er helt uproblematisk å ha forskjellig portnummer eksternt og internt.

Dette eksempelet ble feil (takk til Ted som så dette)- Det er ikke nødvendig å tillatte trafikk spesifikt til port 8080, siden mottagerporten på klienten er 80 (standard httpd port). Den regelen har vi jo satt tidligere. Det var også enkelt å teste regelen. Det var bare å lage en ny regel som tok en “jump” til LOG i stedet for ACCEPT. Og så var det bare å titte i loggen og forsøke å komme seg inn på de forskjellige portene.
Det holder altså BARE å sette opp regelen som NAT’er trafikken til klienten. Alt som er feil er streket over.

Vi har i tidligere eksempler satt opp regler som tillater ny trafikk begge veier (f.eks. til port 80  – Folk på lokalnettet kan surfe, og andre eksterne kan nå vår webserver). Dette eksemplet viser at vi også kan spesifisere slik at det bare er trafikk ut som skal tillates vie an bestemt port  og protokoll.

# Tillate utgående DNS
$IPT -A FORWARD -p udp -s $INT_NET -m state –state NEW –dport 53 -j ACCEPT

Henvisningnen til “INT_NET=”192.168.1.0/24″” sier at det er dette nettet som skal få lov til å sende udp-oakker ut på port 53.

Hvordan stoppe tilgangen til Facebook - den enkle utgaven

# Stoppe de bak router å komme seg til standardport 80 på facebook.com
$IPT -A FORWARD -p tcp -d facebook.com --dport 80 -j DENY

firewall.sh - brannmurskript

#!/bin/bash

echo "Brannmur starter..."

######################################################################
# Setter opp PATH til iptables filen
######################################################################
IPT="/sbin/iptables"

######################################################################
# Setter forst noen parametere som gjor det enkelt aa forandre
# paa skriptet senere med tanke paa ip-adresse osv.
######################################################################
#EXT_IP må byttes ut til ip-adresse på brannmur maskin
EXT_IP="158.39.162.78"
INT_IP="192.168.1.1"
INT_NET="192.168.1.0/24"
INT_NET_BROADCAST="192.168.1.255"
BROADCAST="255.255.255.255"
ANYWHERE="any/0"
HIGHPORTS="1024:65535"


echo "Loading required stateful/NAT kernel modules..."

/sbin/depmod -a
/sbin/modprobe ip_tables
/sbin/modprobe ip_conntrack
/sbin/modprobe ip_conntrack_ftp
/sbin/modprobe ip_conntrack_irc
/sbin/modprobe iptable_nat
/sbin/modprobe ip_nat_ftp
/sbin/modprobe ip_nat_irc

echo "    Enabling IP forwarding..."
echo "1" > /proc/sys/net/ipv4/ip_forward
echo "1" > /proc/sys/net/ipv4/ip_dynaddr

echo "       External interface IP address is: $EXT_IP"
echo "    Loading firewall server rules..."


######################################################################
# Flusher eksisterende regler 
######################################################################
$IPT -F INPUT
$IPT -F FORWARD
$IPT -F OUTPUT
$IPT -F -t nat

######################################################################
# Setter policy til DROP for alt
######################################################################
$IPT -P INPUT DROP
$IPT -P OUTPUT DROP
$IPT -P FORWARD DROP

######################################################################
# Tillater all trafikk for loopback-interfacet
######################################################################
$IPT -I INPUT 1 -i lo -j ACCEPT
$IPT -I OUTPUT 1 -o lo -j ACCEPT

####################################################################
# INPUT
###################################################################
# Tillate etablert trafikk, og trafikk relatert til denne
$IPT -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

# Tillate SSH og trafikk etablert og relatert til dette
$IPT -A INPUT -p tcp --dport 22 -j ACCEPT

# Tillate trafikk av type ICMP (ping)
$IPT -A INPUT -p icmp -j ACCEPT


####################################################################
# OUTPUT
###################################################################
# Tillate allerede etablert trafikk og trafikk relatert til denne
$IPT -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Tillate SSH 
$IPT -A OUTPUT -p tcp --dport 22 -j ACCEPT

# Tillate trafikk av type ICMP (ping)
$IPT -A OUTPUT -p icmp -j ACCEPT  

# Tillate DNS
$IPT -A OUTPUT -p udp --dport 53 -j ACCEPT
$IPT -A OUTPUT -p tcp --dport 53 -j ACCEPT

# Tillate HTTP
$IPT -A OUTPUT -p tcp --dport 80 -j ACCEPT

####################################################################
# FORWARD
###################################################################

# Tillate trafikk av type ICMP (ping)
$IPT -A FORWARD -p icmp -j ACCEPT  

# Tillate allerede etablert trafikk og trafikk relatert til denne
#$IPT -A FORWARD -m state --state ESTABLISHED,RELATED -j LOG
$IPT -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

# Tillate ftp fra maskinene bak router og ut mot verden
$IPT -A FORWARD -p tcp -s $INT_NET --dport 21 -j ACCEPT

# Tillate ssh fra maskinene bak router og ut mot verden
$IPT -A FORWARD -p tcp -s $INT_NET --dport 22 -j ACCEPT

# Tillate smtp fra maskinene bak router og ut mot verden
$IPT -A FORWARD -p tcp -s $INT_NET --dport 25 -j ACCEPT

# Tillate smtps fra maskinene bak router og ut mot verden
$IPT -A FORWARD -p tcp -s $INT_NET --dport 465 -j ACCEPT

# Tillate DNS-queries fra maskinene bak router og ut mot verden
$IPT -A FORWARD -p udp -s $INT_NET --dport 53 -j ACCEPT
$IPT -A FORWARD -p tcp -s $INT_NET --dport 53 -j ACCEPT

# Tillate http fra maskinene bak router og ut mot verden
$IPT -A FORWARD -p tcp -s $INT_NET --dport 80 -j ACCEPT

# Tillate https fra maskinene bak router og ut mot verden
$IPT -A FORWARD -p tcp -s $INT_NET --dport 443 -j ACCEPT

# Tillate NTP fra maskinene bak router og ut mot verden
$IPT -A FORWARD -p tcp -s $INT_NET --dport 43 -j ACCEPT

# Tillate autentifisering av brukere bak router mot server RAPS
$IPT -A FORWARD -p tcp -s $INT_NET -d 158.39.162.10 -j ACCEPT
$IPT -A FORWARD -p udp -s $INT_NET -d 158.39.162.10 -j ACCEPT

#$IPT -A FORWARD -p tcp -s $INT_NET -d 158.39.162.10 --dport 139 -j ACCEPT
#$IPT -A FORWARD -p udp -s $INT_NET -d 158.39.162.10 --dport 139 -j ACCEPT

# Test samba
#$IPT -A FORWARD -p tcp -s $INT_NET -d 158.39.162.10 --dport 138 -j ACCEPT
#$IPT -A FORWARD -p tcp -s $INT_NET -d 158.39.162.10 --dport 139 -j ACCEPT
$IPT -A FORWARD -p tcp -s $INT_NET -d 158.39.162.10 --dport 445 -j ACCEPT
#$IPT -A FORWARD -p tcp -s $INT_NET -d 158.39.162.10 --dport 901 -j ACCEPT

# Tillate innkommende SSH 
$IPT -A FORWARD -p tcp -d $INT_NET --dport 22 -j ACCEPT

# Route innkommende SSH til server
$IPT -t nat -A PREROUTING -d $EXT_IP -p tcp --dport 22 -j DNAT --to 192.168.1.3:22

# Tillate innkommende http
$IPT -A FORWARD -p tcp -d $INT_NET --dport 80 -j LOG
$IPT -A FORWARD -p tcp -d $INT_NET --dport 80 -j ACCEPT

# Tillate innkommende https
$IPT -A FORWARD -p tcp -d $INT_NET --dport 443 -j ACCEPT

# Route innkommende http til server
$IPT -t nat -A PREROUTING -d $EXT_IP -p tcp --dport 80 -j DNAT --to 192.168.1.3:80

# Route innkommende https til server
$IPT -t nat -A PREROUTING -d $EXT_IP -p tcp --dport 443 -j DNAT --to 192.168.1.3:443

# Tillate innkommende smtp
$IPT -A FORWARD -p tcp -d $INT_NET --dport 25 -j ACCEPT

# Tillate innkommende smtps
$IPT -A FORWARD -p tcp -d $INT_NET --dport 465 -j ACCEPT

# Route innkommende smtp til server
$IPT -t nat -A PREROUTING -d $EXT_IP -p tcp --dport 25 -j DNAT --to 192.168.1.3:25

# Route innkommende smtps til server
$IPT -t nat -A PREROUTING -d $EXT_IP -p tcp --dport 465 -j DNAT --to 192.168.1.3:465

# Tillate innkommende imaps
$IPT -A FORWARD -p tcp -d $INT_NET --dport 993 -j ACCEPT

# Route innkommende imaps til server
$IPT -t nat -A PREROUTING -d $EXT_IP -p tcp --dport 993 -j DNAT --to 192.168.1.3:993

# Tillate trafikk inn mot port 9998
$IPT -A FORWARD -p tcp -d $INT_NET --dport 9998 -j ACCEPT

# Route innkommende trafikk mot port 9998 til ssh for IP 192.168.1.1 (router)
$IPT -t nat -A PREROUTING -d $EXT_IP -p tcp --dport 9998 -j DNAT --to 192.168.1.1:22

# Tillate trafikk inn mot port 9999
$IPT -A FORWARD -p tcp -d $INT_NET --dport 9999 -j ACCEPT

# Route innkommende trafikk mot port 9999 til ssh for IP 192.168.1.30 (klient)
$IPT -t nat -A PREROUTING -d $EXT_IP -p tcp --dport 9999 -j DNAT --to 192.168.1.30:22

#  Standard Masquerade (skjuler lokalnettet bak brannmuren)
$IPT -t nat -A POSTROUTING -o eth0 -j MASQUERADE 

echo "Brannmur startet..."