Iptables

Linux.fista
Versio hetkellä 7. helmikuuta 2008 kello 21.03 – tehnyt 192.100.124.218 (keskustelu)
Siirry navigaatioon Siirry hakuun

Iptables-työkalulla säädetään Linuxin ytimessä olevaa Netfilter-pakettisuodatinta. Sen avulla voidaan toteuttaa esimerkiksi palomuureja ja reitittimiä. Iptables on ollut mukana ytimessä versiosta 2.4-alkaen.

Pakettien rajoittaminen

Palomuuri perustuu siihen, että tietyt paketit (tieto liikkuu Internetissä paketteina) pääsevät palomuurin läpi ja tietyt estetään. Näitä esto- ja päästösääntöjä säädetään iptablesilla.

Iptablesin kanssa paketit jaetaan kolmeen luokkaan: INPUT, OUTPUT ja FORWARD. OUTPUT-tyyppiset paketit ovat paketteja jotka lähtevät koneeltasi Internettiin - esimerkiksi ladatessasi tämän sivun lähetit wikin palvelimelle paketin, jossa pyysit tätä sivua. Kun palvelin sitten vastaa pyyntöösi lähettäen tätä sivua paketteina, ne tulevat INPUT-tyyppisinä. FORWARD-tyyppiset paketit ovat paketteja, jotka vastaanotetaan toisesta verkosta ja lähetetään toiseen (yleensä Internetistä lähiverkkoon tai päinvastoin).

Vielä yksi perusasia ennen kuin lähdemme säätelemään palomuuriamme: tehtyäsi asetukset ne eivät tallennu mihinkään, vaan seuraavan uudelleenkäynnistyken jälkeen asetukset palautuvat alkuperäisiksi. Tämä voidaan estää tallentamalla asetukset komennolla /sbin/iptables-save. Tallennetut asetukset palautetaan komennolla /sbin/iptables-restore.

Kannattaa myös huomioida että ipforward pitää olla kytketty päälle /etc/sysctl.conf tiedostossa (net.ipv4.ip_forward=1) jotta FORWARD ketjun ja nat taulun säännöillä olisi vaikutusta.

Pakettien estäminen

Tietystä osoitteesta tulevia paketteja voidaan estää iptables-komennoilla joiden syntaksi on seuraavanlainen:

iptables -s osoite -A INPUT -j DROP

Parametri -s tarkoittaa osoitetta, josta paketit tulevat (engl. source). Osoite voi olla joko IP-osoite (123.345.456.578) tai DNS-nimi (esim. wiki.linux.fi).

-A tarkoittaa paketin tyyppiä, tässä tapauksessa sisään tulevaa pakettia. -j kertoo, mitä paketille tehdään. Tässä tapauksessa se pudotetaan (engl. drop), eli sitä ei päästetä palomuurin läpi.

Vastaavasti tiettyyn osoitteeseen lähetettävät paketit voitaisiin estää komennolla

iptables -d osoite -A OUTPUT -j DROP

Huomaa, että pakettilähteen (-s) tilalla käytetään nyt pakettien kohdetta -d (engl. destination). Lisäksi pakettien tyyppi -A on nyt OUTPUT.

Tarkempaa rajoittamista

Edellä estimme kaikki mahdolliset paketit tiettyyn osoitteeseen. Iptables tarjoaa kuitenkin mahdollisuuden käyttää tarkempia rajoituksia. Esimerkiksi seuraavassa rajoittaisimme kaiken SSH-liikenteen (porttiin 22 kohdistuvan TCP-protokollaa käyttävän liikenteen).

iptables -A INPUT -s 123.456.789.123 -p tcp –destination-port 22 -j DROP

Huomaa uudet valitsimet -p (protokolla) ja -destination-port (kohdeportti). Iptables ymmärtää myös portin numeron sijasta protokollien nimiä, esimerkiksi ssh (portti 22) tai http (80).

SYN-paketit

SYN paketit ovat käytännöllisiä pikku kikkoja, kun haluamme kohdeosoitteen keskustelevan meidän kanssamme vasta siinä vaiheessa kun olemme ensin itse ottaneet yhteyden kohdekoneeseen. Eli paketit estetään jos kohdejärjestelmä aloittaa yhteyden, mutta hyväksytään siinä vaiheessa jos yhteyden aloittaja olemme me. Seuraavassa komennossa meidän tulee määritellä laite, joka on kytköksissä verkkoon josta haluamme estää liikenteen. Tämä tapahtuu kytkimellä -i(interface), jonka jälkeen tulee laitteen "nimi" (yleensä laajakaistajärjestelmissä verkkokortti eth0). Seuraavalla komennolla saamme estettyä kaiken liikenteen tietokoneemme TCP-portteihin jos emme itse ensin ota yhteyttä kohdekoneeseen:

iptables -A INPUT -i eth0 -p tcp --syn -j DROP

Näin, entä jos haluamme ajaa esim. http-palvelinta kuten Apache? Ei huolta, määrittelemme kohdeportiksi kaikki muut portit paitsi TCP/80, jota apache käyttää vakiona. Tämä saadaan aikaan komennolla

iptables -A INPUT -i eth0 -p tcp --syn --destination-port ! 80 -j DROP


Pikamuuri

Tässä ohjeet yksinkertaisen palomuurin pystyttämiseen:

Ensin säädetään perusasetukset: kaikki sisään tuleva estetään ja ulos menevä sallitaan

iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

Seuraavaksi sallitaan loopback-liikenne

iptables -A INPUT -i lo -j ACCEPT

Jos sinulla on lähiverkko, voit sallia liikenteen siinä (oletan, että lähiverkon nimiavaruus on 192.168.0.x)

iptables -A INPUT -s 192.168.0.0/255.255.255.0 -j ACCEPT 

Tähän kohtaan voidaan avata halutut portit (ÄLÄ AVAA JOS EI OLE TARVETTA)

#ssh-portin avaaminen koneen etäkäyttöön (22):
iptables -A INPUT -p tcp --dport ssh -j ACCEPT
#http-portin avaaminen web-palvelinta varten (80):
iptables -A INPUT -p tcp --dport http -j ACCEPT 

Estetään liikenne private-portteihin

iptables -A INPUT -p tcp --dport 0:1023 -j DROP
iptables -A INPUT -p udp --dport 0:1023 -j DROP

Estetään SYN-paketit ja ICMP-liikenne

iptables -A INPUT -p tcp --syn -j DROP
iptables -A INPUT -p icmp -j DROP

Sallitaan kaikki "takaisin palaava" liikenne

iptables -A INPUT -p TCP -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -p UDP -m state --state RELATED,ESTABLISHED -j ACCEPT

Lopuksi estetään loput

iptables -A INPUT -j DROP

Esimerkkejä

Tämän pienen iptables-skriptin avulla saat Linux-koneen reitittämään netin muille koneille.

Koneessa on 2 verkkokorttia:

  • eth0 = Lähiverkko
  • eth1 = Internet

Lähiverkon ip-avaruus on 192.168.x.x

#!/bin/bash

#Muuttujat
LAN=eth0
LAN_IP=192.168.0.0/255.255.0.0
WAN=eth1
IPTABLES=/sbin/iptables

###########################################################
###################### Perustaulukko ######################
###########################################################

#Putsataan taulukko
${IPTABLES} -F
${IPTABLES} -X

#Taulukoiden perussäännöt
${IPTABLES} -P FORWARD DROP
${IPTABLES} -P INPUT DROP
${IPTABLES} -P OUTPUT ACCEPT

#---------- INPUT ----------#
${IPTABLES} -A INPUT -i lo -s 127.0.0.1 -j ACCEPT
${IPTABLES} -A INPUT -i ${LAN} -s ${LAN_IP} -j ACCEPT
#Salli SSH-yhteys ulkopuolelta
#${IPTABLES} -A INPUT -p tcp --dport ssh -j ACCEPT
${IPTABLES} -A INPUT -i ${WAN} -p tcp --dport 0:1023 -j DROP
${IPTABLES} -A INPUT -i ${WAN} -p udp --dport 0:1023 -j DROP
${IPTABLES} -A INPUT -i ${WAN} -p tcp --syn -j DROP
${IPTABLES} -A INPUT -i ${WAN} -p icmp -j DROP
${IPTABLES} -A INPUT -i ${WAN} -p TCP -m state --state RELATED,ESTABLISHED -j ACCEPT
${IPTABLES} -A INPUT -i ${WAN} -p UDP -m state --state RELATED,ESTABLISHED -j ACCEPT
${IPTABLES} -A INPUT -j DROP

#---------- FORWARD ----------# 
${IPTABLES} -A FORWARD -i ${WAN} -p tcp --dport 0:1023 -j DROP
${IPTABLES} -A FORWARD -i ${WAN} -p udp --dport 0:1023 -j DROP
${IPTABLES} -A FORWARD -i ${WAN} -p tcp --syn -j DROP
${IPTABLES} -A FORWARD -i ${WAN} -p icmp -j DROP
${IPTABLES} -A FORWARD -i ${LAN} -o ${WAN} -s ${LAN_IP} -j ACCEPT
${IPTABLES} -A FORWARD -i ${WAN} -o ${LAN} -d ${LAN_IP} -p TCP -m state --state RELATED,ESTABLISHED -j ACCEPT
${IPTABLES} -A FORWARD -i ${WAN} -o ${LAN} -d ${LAN_IP} -p UDP -m state --state RELATED,ESTABLISHED -j ACCEPT
${IPTABLES} -A FORWARD -j DROP

#---------- OUTPUT ----------#

##########################################################
###################### NAT-taulukko ######################
##########################################################

#Putsataan taulukko
${IPTABLES} -t nat -F
${IPTABLES} -t nat -X

#Taulukoiden perussäännöt
${IPTABLES} -t nat -P PREROUTING ACCEPT
${IPTABLES} -t nat -P POSTROUTING ACCEPT
${IPTABLES} -t nat -P OUTPUT ACCEPT

#---------- PREROUTING ----------#
#Tänne uudelleenohjeukset
#Call of Duty 
#${IPTABLES} -t nat -A PREROUTING -p udp --dport 28960 -i ${WAN} -j DNAT --to 192.168.x.x
#web-serveri
#${IPTABLES} -t nat -A PREROUTING -p tcp --dport http -i ${WAN} -j DNAT --to 192.168.x.x

#---------- POSTROUTING ----------#
${IPTABLES} -t nat -A POSTROUTING -o ${WAN} -j MASQUERADE