IPTABLES
- Er infrastrukturen i Linuxsystemer som gjør det mulig å lage en fornuftig brannmur og router.
- Er en del av Linuxkjernen fra kernel 2.4 og senere.
- Før 2.2. het tilsvarende løsning ipchains.
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.
- Porter – Du bør ha oversikt over mest kjente portnumrene til de mest vanlige tjenestene, eller i det minste vite hvordan du skal finne portnummeret (eks. /etc/services )
- Protokoller – Bu bør vite litt om TCP, UDP og ICMP pakker.
Superkort om protokoller
TCP
- Ligger på laget over IP-protokollen
- Er en tilstandsbevarende protokoll,og ser på data som en kontinuerlig strøm av pakker med definert start og stopp.
- For at strømmen skal starte må både mottaker og avsender akseptere at strømmen skal starte.
UDP
- Ligger på laget over IP-protokollen
- En enkel protokoll, uten tilstandsbevaring
- Ingen feilhåndtering hvis pakken forsvinner
ICMP
- Brukes for å sjekke etter forskjellige feil på nettverket
- Eks. på bruk – Ping www.hiof.no. Får du svar er host’en oppe (svært forenklet skrevet..)
Ord og uttrykk – iptables
- Drop/Deny – Når en pakke som mottas droppes, blir pakken rett og slett slettet. Ingen tilbakemelding gis til avsender av pakken.
- Reject – Som drop/deny over men med et viktig unntak. Pakker som “nektes”, blir besvart. Det er altså mulig å varsle avsender om at pakken de forsøkte sende ikke ble akseptert hos oss.
- State – En spesifikk tilstand som pakken har i det den ankommer iptables. Hvis det f.eks. er den første pakken som kommer (TCP), så blir den betraktet som en ny pakke som vi kan baserer en regel på.
- Chain – En kjede inneholder et regelsett med regler som blir testet på pakkene som går igjennom den bestemte kjeden. Hver kjede har sin mening.
- Table – Hver tabell har sin bestemte oppgave, og iptables har 4 tabeller. Det er “raw”, nat, mangle og filter. Hver tabell har sin bestemte oppgave. Filter tabellen er klargjort for å filtrere pakker, mens nat tabellen er designet for å “NAT’e” pakker (Network Address Translation)
- Match – Betyr “treff” eller når kriteriene slår til. Kan i denne betydningen bety to ting, dvs når pakken som kommer f.eks. inneholder akkurat det portnummeret eller den ipadressen som det søkes etter med f.eks. –source. Du kan også ha et “treff” på hele tabellen, som gjør at du kan gjennomføre “målet” (target – f.eks. droppe en pakke) eller gjøre et “hopp” (Jump) til en annen kjede.
- Target – Hver regel i et regelsett har som regel et mål. Hvis regelen f.eks. får et treff i en av kjedene, avgjøres det hva som skal skje med pakken. Skal den droppes, aksepteres eller NAT’es. Den kan også foreta et hopp.
- Rule – En regel er et sett med “treff” som er satt sammen for å kunne gjennomføre og oppnå et mål. Eks Vi har en regel som sier at hvis en tcp pakke ankommer fra en bestemt ip-adresse, og fra en bestemt port, så skal pakken slettes. I denne regelen var det tre “match” og en “target”.
- Ruleset – Et regelsett er den komplette pakken av alle regler som er aktive i IPTABLES. I vårt tilfelle er regelsettet den fila som hvi skriver reglene våre i.
- Jump – Instruksjonen hopp er nærmest en del av “target”. Du kan gjennomføre et hopp til en annen kjede for å jobbe videre med behandlingen av pakken i en annen f.eks. egendefinert kjede. Eks. Du kan gjennomføre et hopp hvis alle pakker som kommer til interfacet er av typen UDP. Alle UDP- pakker går da videre til “UDP kjedet, og behandles videre der.
- Connection tracking – Tilstands bevaring – dvs en brannmur som kjenner til og tar vare på tilstandene til pakkene som går over nettverket. TCP pakker er jo litt komplekse og sendes frem og tilbake mellom avsender/mottager. En brannmur som kjenner til tilstanden til pakkene kan derfor finne ut av om trafikken som går over interfacet f.eks. er initiert innenfra eget nettverket, og om det er allerede etablert trafikk som kommer utenfra.
- Accept – Her aksepteres pakkene som kommer over interfacet. Kan være målet til en bestemt regel, eller til en bestemt policy.
- Policy – I vår betydning, er en policy hovedregelen som gjelder for hver av kjedene våre. Det kan f.eks. være om vi per definisjon skal droppe eller akseptere alle pakker, og så bygge opp en brannmur basert på hovedregelen.
- SNAT – Source NAT – Brukes for omskrivning av avsenderadressen til pakker. Som regel omskrivning av interne ip-adressert til reelle ip-adresser.
- Masquerade – Fungerer omtrent som SNAT, men den sjekker fysisk hvilket nettverksgrensesnitt pakken går ut fra og setter riktig adresse basert på dette. Den dropper også alle aktive TCP forbindelser hvis nettverket av en eller annen grunn går ned.
- DNAT – Destination NAT – Brukes for omskrivning av mottakeradressen til en pakker. For å videresende pakker til bestemte maskiner på vårt interne nett.
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..."