iptables
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. NFTables on korvaamassa ytimen 3.19 versiosta alkaen.
Peruskäsitteitä
Pakettien käsittely perustuu sääntöihin (rule), joita voidaan muokata iptables-komennolla. Kussakin säännössä on tietyt ehdot, jotka määrittävät mihin paketteihin kyseistä sääntöä sovelletaan. Ehdot voivat määrittää esimerkiksi, että sääntöä sovelletaan paketteihin, jotka saapuvat tietystä IP-osoitteesta, tai jotka ovat matkalla tiettyyn porttiin. Lisäksi kussakin säännössä määritellään mikä toiminto suoritetaan kun paketti täsmää säännön ehtoihin. Yleensä toiminto on joko hylkääminen (DROP) tai hyväksyminen (ACCEPT).
Säännöt tallennetaan ketjuihin (chain). Kun paketti tulee käsiteltäväksi tiettyyn ketjuun, käydään ketjun sääntöjä järjestyksessä lävitse yksi kerrallaan, kunnes löytyy sääntö joka täsmää pakettiin.
Ketjut tallennetaan tauluihin (table). Oletuksena iptables käsittelee filter-taulua, jolla voidaan toteuttaa tavanomainen palomuuritoiminnallisuus. Muitakin tauluja on olemassa, mutta niiden käsittelyä voidaan pitää edistyneempänä käyttönä.
Säännöillä voidaan esimerkiksi määrittää, että tietystä IP-osoitteesta tai tiettyyn porttiin saapuvat paketit joko estetään tai päästetään läpi. Säännöillä voidaan myös määritellä edistyneempiä toimintoja, esimerkiksi voidaan estää uudet yhteydet tietystä IP-osoitteesta, jos yhteyksiä on jo samasta IP-osoitteesta auki liian monta.
Yksinkertainen palomuuri
Iptablesin oletuksena käsittelemässä filter-taulussa on kolme sisäänrakennettua ketjua, INPUT, FORWARD ja OUTPUT. Kun ulkomaailmasta saapuu palvelimelle paketti, siihen sovelletaan INPUT-ketjussa olevia sääntöjä. Vastaavasti jos palvelimelta lähtee ulospäin paketti, siihen sovelletaan OUTPUT-ketjussa olevia sääntöjä. FORWARD-ketjun sääntöjä sovelletaan siinä tapauksessa, että paketti saapuu palvelimelle ulkoa päin, mutta sen lopullinen kohde on jokin toinen palvelin, eli paketti on vain kauttakulkumatkalla.
Jos siis halutaan vaikkapa estää palvelimelle tuleva liikenne tietystä IP-osoitteesta, täytyy lisätä uusi sääntö INPUT-ketjuun. Samoin jos halutaan estää palvelimelta yhteydet ulospäin tiettyihin portteihin, täytyy lisätä yksi tai useampi sääntö OUTPUT-ketjuun.
Tämänhetkiset säännöt näkee komennolla
iptables -L
Kun mitään asetuksia ei ole tehty, palauttaa komento seuraavanlaisen listauksen:
Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination
Listauksesta nähdään sisäänrakennetut ketjut, ja että ketjut ovat tyhjiä, eli niissä ei ole sääntöjä. Listauksesta voidaan myös nähdä, että jokaisen ketjun oletustoiminnoksi (policy) on asetettu ACCEPT. Oletustoimintoa sovelletaan siinä tapauksessa, että ei löydy mitään sääntöä jota voitaisiin soveltaa. Tässä tapauksessa kaikkien ketjujen oletustoimintona on ACCEPT, eli paketit hyväksytään ja päästetään läpi.
Liikenteen salliminen rajattuihin portteihin
Yksinkertaisissa palomuuriasetuksissa voidaan lähteä siitä, että kaikki sisäänpäin tuleva liikenne estetään, ja erikseen määritellään poikkeustapaukset joissa liikenne sallitaan. Säädetään siis INPUT-ketjun oletustoiminnoksi DROP, jolloin oletuksena sisäänpäin tulevat paketit hylätään:
iptables -P INPUT DROP
Haluamme hallita palvelinta SSH-yhteyden kautta, joten sallimme liikenteen SSH:n käyttämään porttiin 22. Sallimme myös liikenteen portteihin 80 ja 443, jotta ulkopuoliset voivat saada yhteyden HTTP-palvelimeemme:
iptables -A INPUT -p tcp --dport 22 -j ACCEPT iptables -A INPUT -p tcp --dport 80 -j ACCEPT iptables -A INPUT -p tcp --dport 443 -j ACCEPT
Valitsimella -A INPUT määritellään, että lisätään uusi sääntö INPUT-ketjun loppuun (append).
Valitsimella -p tcp määritellään että sääntö täsmää paketteihin, jotka käyttävät TCP-protokollaa. Valitsimella --dport määritellään, että sääntö täsmää paketteihin, joiden päämääränä on annettu portti.
Valitsimella -j ACCEPT määritellään että paketti hyväksytään, eli suorituksessa "hypätään" (jump) sisäänrakennettuun ketjuun nimeltä ACCEPT, joka hyväksyy paketin ja lopettaa sääntöjen suorituksen.
Paluuliikenteen salliminen
Nyt kaikki ulospäin menevät paketit on sallittu, mutta sisäänpäin on sallittu liikenne vain rajattuihin portteihin. Tässä vaiheessa voidaan kuitenkin huomata eriskummallinen seikka, nimittäin yhteydet toisiin palvelimiin eivät tunnu enää toimivan. Yritämme ottaa yhteyden google.com:iin (curl google.com), mutta emme saa vastausta. Emme estäneet ulospäin menevää liikennettä, joten miksi emme enää saa yhteyttä ulos?
Kyse on siitä, että vaikka palomuurimme päästää paketit ulospäin, niin toiselta palvelimelta takaisin tuleva vastaus ei enää pääse palomuurista läpi, koska estimme sisäänpäin tulevan liikenteen. Lisätään siis uusi sääntö, joka sallii sellaiset sisäänpäin tulevat paketit, jotka kuuluvat johonkin jo avoinna olevaan yhteyteen.
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
Valitsimella -m state otetaan käyttöön iptablesin lisäosa nimeltä state, jonka jälkeen saadaan käyttöön valitsin --state, jonka avulla voidaan määrittää, että sääntö täsmää paketteihin jotka ovat osa jotakin avattua yhteyttä (ESTABLISHED) tai muuten liittyvät johonkin olemassaolevaan yhteyteen (RELATED).
Kun nyt otamme palvelimelta yhteyden ulospäin toiseen palvelimeen, niin palomuuri päästää toiselta palvelimelta tulevan vastauksen läpi, koska palomuuri tunnistaa että kyseiset paketit kuuluvat yhteyteen joka avattiin palvelimeltamme. Vaikka palomuuri päästääkin nyt ulkoapäin tulevat vastaukset läpi, ulkoapäin tulevat uudet yhteydet palomuuri estää edelleen, paitsi jos uusi yhteys avattaisiin erikseen sallimiimme portteihin 22, 80 tai 443.
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 viiteen luokkaan: INPUT, OUTPUT, FORWARD, PREROUTING ja POSTROUTING. 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. Tallentaminen onnistuu komennoilla iptables-save ja iptables-restore joista lisää myöhemmin.
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. Tiedoston muutos tulee voimaan vasta uudelleenkäynnistyksen jälkeen, joten jos haluaa, että ipforward tulee heti päälle pitää antaa seuraava komento:
/sbin/sysctl -w net.ipv4.ip_forward=1
Lisäksi iptables pitää kytkeä päälle, jos se ei ole jo. Tämä onnistuu seuraavalla komennolla:
/sbin/chkconfig iptables on
Nykyään iptables on käytössä käytännössä kaikissa jakeluissa eikä mitään erityissäätöjä tarvitse tehdä sen käyttöönottamista varten.
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. linux.fi). Yksittäisen osoitteen sijaan voidaan antaa myös kokonainen IP-osoiteavaruus käyttäen verkkomaskia: esimerkiksi IP-osoitteet väliltä 192.168.0.0-192.168.0.255 valittaisiin merkinnällä 192.168.0.0/255.255.255.0.
-A tarkoittaa paketin tyyppiä, tässä tapauksessa sisään tulevaa pakettia (INPUT). -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 estäisimme kaiken saapuvan SSH-liikenteen osoitteesta 123.456.789.123 (porttiin 22 kohdistuvan TCP-protokollaa käyttävän liikenteen).
iptables -A INPUT -s 123.456.789.123 -p tcp --dport 22 -j DROP
Huomaa uudet valitsimet -p (protokolla) ja --dport (kohdeportti, destination port, voi olla myös alue muodossa alku:loppu). 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
Asetusten tallentaminen ja palauttaminen
Iptablesin senhetkiset asetukset saa ulos ajamalla pääkäyttäjänä komennon
iptables-save
, joka tulostaa nykyiset asetukset (käytännössä normaaleita iptables-komentoja ilman iptables-alkuosaa). Toimivat asetukset kannattaakin tallentaa tiedostoon:
iptables-save > /home/tux/iptables-asetukset
Jonka jälkeen toimivat asetukset on tarvittaessa helppo palauttaa komennolla
iptables-restore /home/tux/iptables-asetukset
Pikamuuri
Tässä ohjeet yksinkertaisen palomuurin pystyttämiseen: (HUOMAA ETTÄ VOIT NÄIN HELPOSTI SULKEA ITSESI PALVELIMELTA MIKÄLI KÄYTÄT SSH -YHTEYTTÄ)
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ä (oletetaan, 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-palvelin #${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
Ongelmatilanteita
Joissain jakeluissa käytössä olevat verkkoyhteyden hallintatyökalut saattavat aiheuttaa ongelmia, jos iptablesia käytetään käsin. Esimerkiksi Ubuntun käyttämä NetworkManager on tällainen. Lisätietoja löytyy Ubuntun ohjeista.
Kannattaa myös huolehtia, ettei jakelusi oma palomuuriasetusohjelma (esimerkiksi YaST openSUSEssa tai system-config-firewall Fedorassa) aiheuta ristiriitaa oman iptables-skriptisi kanssa. Käytännössä kannattaa joko poistaa palomuuriasetusohjelma kokonaan käytöstä tai ainakin huolehtia siitä, että sen tuottama iptables-skripti ajetaan käynnistyksen yhteydessä (init) ennen omaa skriptiäsi. Sama pätee luonnollisesti myös Firestarterin ja Shorewallin kaltaisiin ulkoisiin palomuuriasetustyökaluihin.
Katso myös
Aiheesta muualla
- Iptables-opas Gentoo-wikissä
- Ubuntun iptables-opas
Palvelin | |
Ylläpito | SSH | Tietoturva | Käyttäjien hallinta | Systemd | iptables | Security-Enhanced Linux | AppArmor |
---|---|
Palvelintyypit | Web-palvelin | Sähköposti | Tietokanta | NFS | Samba |
Komentorivi | Komentorivin perusteet | Komentorivikomennot | Bash-skriptaus |
Tekstieditoreja | nano | vi | emacs |
Palvelin-luokka |