IP maskeraad Linuxis

Allikas: Kuutõrvaja

Vaja ümber kirjutada iptabelsit kasutama Uuem paketifilter netfilter koos kasutajaliidesega iptables pakub palju suuremaid võimalusi http://viki.pingviin.org/Tulem%C3%BC%C3%BCrimas_IPTABLES_abiga

                                        Roheline.jpg Toores. Ehk seda pala võib täiendada.

Sissejuhatus

IP maskeraad on eriline tehnika sisevõrgu arvutite ühendamiseks Internetiga Tüüpiliselt on see ühendus ühepoolne: sisevõrgu arvutitest saab kasutada Interneti teenuseid, kuid reeglina ei saa Internetist kasutada sisevõrgu teenuseid. Oluline on arvestada, et maskeraadiga ühendatud sisevõrgu arvutitele on tavaliselt omistatud IP aadressid privaataadresside ruumist (nt võrgust 192.168.1.0/24, 10.0.0.0/8 jne).

IP maskeraadi eelisteks on:

  • saab teha Interneti teenused kättesaadavaks suuremale hulgale töökohtadele, kui teil on kasutada avalikke IP aadresse
  • saab osa IP maskeraadiga kaasnevast turvalisusest - kuna sisevõrgu arvutile on omistatud privaat-aadressid, siis ei saa neid otseselt rünnata - paketid ei jõua lihtsalt kohale.
  • maskeraadi kasutamiseks ei ole tarvis tööjaamadesse installeerida täiendavat tarkvara

IP maskeraadiga kaasneb turvalisus vaid seni, kuni maskeeriv masin ise on turvaline. Tavaliselt on maskeeriv masin ainus sisevõrgu ja Interneti kokkupuute-punkt ning seetõttu on oluline maskeeriv masin kindlustada st konfigureerida tulemüürina.

IP maskeraadi puudusteks on:

  • mitte päris kõik teenused pole rahuldavalt maskeraaditavad, näiteks videokonverentsid. Siiski enamus töörahvale olulisi teenuseid on maskeeritud arvutitest täiesti kasutatavad
  • maskeeritud võrgu arvutisse on keeruline tööle seada serverit, mis pakub avalikku so Internetist kasutatavat teenust

Kuigi järgnevas näites kõneleme ühest kohtvõrgust, saab sarnaselt Internetiga ühendada ka mitut kohtvõrku.

Võrgu skeem

Et maskeraad edukalt tööle saada, peaks teil olema suhteliselt selge ettekujutus, kuidas teie arvutid võrgus paiknevad ning millised IP aadresse te kasutate. Näiteks kirjeldab seda selline skeem

             ((   ..-     ) 
         (                      )
    (                              )
 (                                )))
         INTERNET
 (                       .    -)
  ((.                 )
         (----   )
              |
              |
            __|__
           |     |  ISPi võrguseade
           |__ __|   193.40.222.63
              | 
              |
              |
              |
            __|__    193.40.222.62
           |     |  teenusepakkuja ruuter, näiteks NOKIA
           |     |
        _ _|_ _ _|_ _ _ _ teie asutuse piir _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
           |     |
           |__ __|                                            ___  avalik
              |   193.40.223.97                              |   | server
              |                                              |___| 193.40.223.99
              |         vahevõrk                               |
          |---|--------|------ 193.40.223.96/28 ---------------|------------|
                       |
                       |
                       | eth0 193.40.223.98
                    ---|---
                   |       |
                   |       | Linuxi masin
                   |       |
                    ---|---
                       | eth1 192.168.1.1
                       |                   
                 |-----|--- 192.168.1.0/24 ---|----  ...  --|------|
                             sisevork       __|__        __|__
                                           |     |      |     |
                                           |_____|      |_____| 

                                         192.168.1.2   192.168.1.254

Skeemil on kujutatud Internetiühenduse ja kohtvõrgu maskeraadimise seisukohtast kõik olulised sõlmed ja parameertid.

Teie asutuse piiri kujutavast joonest allapoole jääb asutusesisene võrk, miskoosneb kahest alamvõrgust:

  • vahevõrk - selles võrgus kasutatakse avalikke IP aadresse ning sinna ühendatud masinad on otse nähtavad Internetist
  • sisevõrk - selles võrgus kasutatakse privaat IP aadresse ning seal asuvad masinad on maskeraaditud Linuxi serveri poolt

Praktiliselt saab kõike avalikke teenuseid pakkuda ka Linuxi masinast, kuid põhimõtteliselt on korrektsem kasutada selleks eraldi masinat, avalikku serverit (193.40.223.99). Järgnevas ei kirjeldada kuidas kasutada või konfigureerida avalikku serverit, sisevõrgu jaoks on ta lihtsalt üks väljas Internetis asuv masin.

Välisvõrgu võrguseadmete aadressid teatab teile teenusepakkuja, näites kasutame järgmisi:

  • 193.40.223.96 - vahevõrgu aadress
  • 193.40.223.111 - vahevõrgu leviaadress
  • 193.40.223.97 - teenusepakkuja ruuteri vahevõrgupoolne IP aadress
  • 193.40.223.98 - Linuxi masina vahevõrgupoolse seadme IP aadress
  • eth0 - Linuxi masina välisvõrgu poolse seadme nimi

Maskeeritud sisevõrgu arvutid paigutatakse tavaliselt privaat aardessruumi, näiteks võrku 192.168.1.0 kus on 255 IP aadressi:

  • 192.168.1.0 - sisevõrgu aadress
  • 192.168.1.255 - sisevõrgu leviaadress
  • 192.168.1.1 - Linuxi masina sisevõrgu poolse seadme IP aadress
  • 192.168.1.2 ... 192.168.1.254 - sisevõrgu tööjaamade IP aadressid
  • eth1 - Linuxi masina sisevõrgu poolse seadme nimi

Skeemil on suhteliselt meelevaldselt valitud väliseks võrguseadmeks eth0 ja sisemiseks eth1, võib olla ka vastupidi, see pole oluline; alltoodud näidete kasutamisel tuleb nad selles suhtes kohandada oma olukorrale.

Maskeraad

Ilma maskeraadi kasutamata saab interneti teenuseid tarvitada vaid Linuxi arvutist; tööjaamadest saab tarvitada ainult Linuxi masina enda poolt pakutvaid teenuseid. Selleks tuleb Linuxi masina võrguseadmed konfigureerida ning seada ruutingud kumbagi võrku ning ka Internetti. Näiteks selliselt

bash# ifconfig eth0 193.40.223.98 netmask ?
bash# ifconfig eth1 192.168.1.1 netmask 192.168.1.255 

Paraku ei saa Linuxi masinat kasutada tavalises mõttes ruuterina kuna teil pole sisevõrgu klientide jaoks IP aadresse. Põhimõtteliselt saavad nad pakette Internetti saada, kuid see, kellele nad läksid ei saa neile vastuseid saata, kuna lähteaadress pole avalikult kasutatav IP aadress.

Eeldusel, et kumbagi võrku on ruuting tehtud, saab teha sisevõrgu masinatele siiski Interneti teenused kättesaadavaks. Selleks tuleb sisevõrgust Internetti suunduva IP paketi lähteaadressiks kirjutada Linuxi masina Interneti poolse võrguseadme aadress ning jätta meelde milliselt sisevõrgu masinast pakett tuli ja kuhu see läks. Paketid vastuvõtnud Interneti server saadab vastuse tagasi Linuxi masinale ning see peab toimeta selle edasi andmevahetuse algatanud sisevõrgu masinale.

Sellise skeemi kohaselt tegutsedes jääb sisevõrgus oleval kliendil mulje, et ta suhtleb otse Interneti serveriga. Interneti server aga suhtleb enda meelest Linuxi masinaga.

Mida on vaja teha maskeraadi töölesaamiseks

Sõltuvalt teie olemasolevast asjade seisust peate tegema rohkem või vähem samme maskeraadi tööleseadmiseks. Näiteks, kui teie Linuxi kernel ei toeta maskeraadi, ei pääse te muidu, kui peate hankima sobiva kerneli.

Teil on tarvis:

  • teada eelmise punkti skeemil toodud vahevõrgu parameetreid, selle informatsiooni saate te oma teenusepakkujalt
  • konfigureerida sisevõrgu tööjaamad eelmises punktis toodud skeemile vastavalt (vt. Linuxi võrguotoe seadistamise KT, Windowsi masina võrgutoe kongfigureerimine)
  • konfigureerida Linuxi masina võrguseadmed vastavalt eelmises punktis toodud skeemile (vt. Linuxi võrguotoe seadistamise KT)
  • veenduda, et Linuxi masinast paistab vahe- ja sisevõrk (vt. Võrgudiagnostika) ning Internet vajadusel muuta Linuxi masina või tööjaamade konfiguratsiooni

teha kindlaks kas Linuxi masinas leidub maskeraadimiseks vajalik tarkvara ning vajadusel see lisada (vt. punkt Tarkvara)

  • konfigureerida maskeraad (vt. punkt Maskeraadi käivitamine)
  • kindlustada Linuxi masin (vt. punkt Linuxi masina kindlustamine)

Kolm viimast sammu on kirejeldatud järgnevates punktides, näidetes jätkame skeemil toodud võrguseadmete parameetrite väärtustega, teie peate ilmselt asendama need oma vastavate väärtustega.

Tarkvara

Maskeraadi tegemine Iptables abil, mis on tavaliselt Linuxi distributsiooniga kaasas ja vaikimisi installeeritud. Uurige, kas teie süsteemis on programm iptables olemas

TODO

Kuna Iptables töötab tuuma tasemel, siis on tihti tarvis sobiv tuum kompileerida. Olulised valikud on: (Tuuma ver: )

Esmalt tasub katsetada olemasoleva tuumaga.

Lisaks tuumale kompileeritakse tehtud valikute korral käsuga 'make modules' teatud teenuste (FTP, IRC jt) maskeraadiks vajalikud moodulid


Olemasoleva tuuma versiooni saab näha käsuga

bash$ uname -a
Linux myyr.zoo.tartu.ee 2.6.39-gentoo-r3 #4 SMP Thu Sep 22 13:15:34 x86_64 Intel(R) Xeon(TM) CPU 2.80GHz GenuineIntel GNU/Linux

ning sellele, et olemasolev tuum toetab Iptablesit viitab faili /proc/net/ip_fwchains olemasolu.

Maskeraadi käivitamine

seadistame masina pakette edasisuunama

# echo 1 > /proc/sys/net/ipv4/ip_forward

Selleks, et seda tehaks automaatselt igakord peale rebooti tuleb avada /etc/sysctl.conf fail ja muuta rida net.ipv4.ip_forward = 0 ümber net.ipv4.ip_forward = 1

Maskeraadi käivitamiseks sobib alustuseks moodustada sarnane kooriku skript masq.sh

 #!/bin/sh
 # välisseade eth0"
 # sisevõrk eth1"
 # korraldame sisevõrgu maskeerimise ehk pakettide edasitamise sisemiselt võrgult välimisele.
 /sbin/iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
 /sbin/iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
 /sbin/iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT

Anname skriptile käivitamiseks vajalikud õigused

bash# chmod 744 masq.sh

ning käivitame

bash# ./masq.sh

Siiamaani kehtestatud reegleid saab vaadata käsuga ipchains selliselt

bash# iptables -L

Soovides reegleid muuta, redigeerige masq.sh faili ning käivitage ta uuesti.

Toodud näide töötab, kuid ei sobi pikaajaliseks praktiliseks kasutamiseks, kuna ta sõna otseses mõttes jätab liiga palju auke. Alustada aga on mõtet just sellest, sest väikese arvu reeglitega on lihtsam suuri vigu leida. Kui maskeraad töötab, siis tuleb tõhustada Linuxi masina kui tulemüüri omadusi.

Maskeraadi õnnestunud konfigureerimisest annab tunnistust see, et kohtvõrgu tööjaamadest saab kasutada levinud interneti teenuseid, näiteks veebi.

Linuxi masina kindlustamine

Kui te olete saanud eelmises punktis toodud näite eeskujul tööle maskeraadi, on tarvis kindlustada Linuxi masinat ja sisevõrku mittesoovitavate külalistuste eest.

Kindlustame Linuxi masina IP pakettide filtreerimse abil, mida võimaldab korraldada samuti programm ipchains. IP pakettide filtreerimisel kontrollitakse igast võrguseadmest läbi liikuvaid IP pakette ning otsustatakse millises suunas liikuvaid milliseid pakette lubada (ACCEPT) või keelata (REJECT). Näiteks käsk

ipchains -A input -i eth0 -d 193.40.223.98 80 -p tcp -j ACCEPT

lisab ahelasse input (-A input) reegeli, mis näitab, et tuleb sisse lubada (-j ACCEPT) läbi võrguseadme eth0 (-i eth0) saabuvad TCP paketid (-p tcp), mis suunduvad aadressile 193.40.223.98 ja pordile 80 (-d 193.40.223.98 80).

Kõige lihtsamal juhul asuvad reeglid vaid kolmes ahelas

  • input - toimub võrguseadmest sisenevate pakettide kontroll
  • output - toimub võrguseadmest väljuvate pakettide kontroll
  • forward - toimub võrguseadmesse edasisuunatud pakettide kontroll, selles ahelas toimub muuseas ka maskeraad

Ühes ahelas on tavaliselt mitu reeglit; kui näiteks pakett siseneb, siis asutakse järjest läbi vaatama input ahela reegleid. Rakendatakse esimene reegel, millega pakett klappis ning võetakse vaatluse alla järgmine pakett.

Seame eesmärgiks

lubada Linuxi masinast ja sisevõrgust külastada kõiki interneti teenuseid (praktiliselt küll vaid neid, mida maskeraad toetab, kuid enamlevinuid teenused on kasutatavad) lubada Internetist külastada vaid teatud Linuxi masina teenuseid lubada sisevõrgust külastada kõiki Linuxi masina teenuseid Linuxi masinas töötavad järgmised teenused ning nad kasutavad tabelis tootud vaikimisi porte. Tabelis on samuti näidatud milliseid teenused saab kuskilt tarvitada

Sõnastatud nõudeid täidab selline, muudetud masq.sh

 #!/bin/sh
 
 # need moodulid tagavad vähemvalulise FTP, RealAudi ja IRC kasutamise
 # maskeraaditud sisevõrgust
 modprobe ip_masq_ftp.o
 modprobe ip_masq_raudio.o
 modprobe ip_masq_irc.o
 
 #############################################
 ##     TEHKE SIIN VAJALIKUD MUUDATUSED     ##
 #############################################
 # kasutame allpool muutujaid
 # välisvõrguga suhtleva võrguseademe nimi
 vs="eth0"
 
 # sisevõrguga suhtleva võrguseadme nimi
 ss="eth1"
 
 # välisvõrguga suhtleva võrguseadme IP aadress
 vip="193.40.223.98"
 
 # sisevõrguga suhtleva võrguseadme IP aadress
 sip="192.168.1.1"
 
 # sisevõrgu võrgunumber ja võrgmask
 sv="192.168.1.0/255.255.255.0"
 
 #############################################
 ##     ALLPOOL POLE VAJA MIDAGI MUUTA      ##
 #############################################
 # puhastame ahelad
 ipchains -F input
 ipchains -F output
 ipchains -F forward
 
 # kehtestame ahelate vaiketegevuse ehk policy
 ipchains -P input REJECT
 ipchains -P output REJECT
 ipchains -P forward REJECT
 
 # ALLPOOL KASUTATUD 'SISSE' JA 'VÄLJA' ON ARVESTATUD
 # LINUXI MASINA SUHTES
 # Nii lähevad näiteks Linuxi masinast sisevõrku suunduvad paketid samuti
 # selles mõttes välja
 
 #
 # VÄLISSEADE
 #
 # LÄBI VÄLISSEADME VÄLJA
 #
 # Oleme viisakad: Linuxi masinast ei saa välja paketid
 # mille lähteaadressiks on privaatvõrk
 # kui selline asi toimub on tegemist kohaliku pahalasega
 
 ipchains -A output -i $vs -s 192.168.0.0/255.255.0.0 -d 0/0 -j REJECT -l
 ipchains -A output -i $vs -s 172.16.0.0/255.240.0.0 -d 0/0 -j REJECT -l
 ipchains -A output -i $vs -s 10.0.0.0/255.0.0.0 -d 0/0 -j REJECT -l
 ipchains -A output -i $vs -s 127.0.0.0/255.0.0.0 -d 0/0 -j REJECT -l
 
 # välja saab piiranguteta kõikjale
 ipchains -A output -i $vs -s $vip -d 0/0 -j ACCEPT
 
 # igaks juhuks logime kõike muud väljuvat
 ipchains -A output -i $vs -j REJECT -l
 
 # LÄBI VÄLISSEADME SISSE
 #
 # Millised Linuxi masina teenused peavad olema välisvõrgust kättesaadavad
 #
 # privaatvõrkudest lähtuvad paketid
 # ei saa siseneda läbi välise seadme
 # Tavaliselt on sellised paketid kahtlased - logime
 
 ipchains -A input -i $vs -s 192.168.0.0/255.255.0.0 -d $vip -j REJECT -l
 ipchains -A input -i $vs -s 172.16.0.0/255.240.0.0 -d $vip -j REJECT -l
 ipchains -A input -i $vs -s 10.0.0.0/255.0.0.0 -d $vip -j REJECT -l
 ipchains -A input -i $vs -s 127.0.0.0/255.0.0.0 -d $vip -j REJECT -l
 
 # mida teha välisvõrgu leviaadressile saadetud
 # pakettidega, küsimus laiale ringile ?
 
 # sisse saavad seest algatatud ühendustele vastuseks
 # saabuvad tcp paketid
 ipchains -A input -i $vs -d $vip -p tcp ! -y -j ACCEPT
 
 # sisse saavad välisvõrgust saabuvad udp paketid
 # paraku tuleb kõik vastu võtta, ka need mis 
 # tulevad omaalgatuslikult; siiski võtame vastu 
 # ainult privilegeerimata portidele
 # va NFSi port 2049
 ipchains -A input -i $vs -d $vip 2049 -p udp -j REJECT -l
 ipchains -A input -i $vs -d $vip 1024: -p udp -j ACCEPT
 
 # sisse saavad icmp paketid (ping, traceroute)
 ipchains -A input -i $vs -d $vip -p icmp -j ACCEPT -l
 
 # välisvõrgust tuleb sisse lasta
 # meie poolt välisvõrgule pakutavatele teenustele vastavad paketid
 # nende vastused saavad välja kuna me laseme
 # välja väga ladnalt
 ipchains -A input -i $vs -d $vip 21 -p tcp -j ACCEPT
 ipchains -A input -i $vs -d $vip 22 -p tcp -j ACCEPT
 ipchains -A input -i $vs -d $vip 25 -p tcp -j ACCEPT
 ipchains -A input -i $vs -d $vip 80 -p tcp -j ACCEPT
 ipchains -A input -i $vs -d $vip 113 -p tcp -j ACCEPT
 
 # aktiivne FTP, kliendi jaoks
 ipchains -A input -i $vs -s 0/0 20 -d $vip 1024: -p tcp -y -j ACCEPT
 
 # passiivne FTP, serveri jaoks
 ipchains -A input -i $vs -s 0/0 1024: -d $vip 1024: -p tcp -y -j ACCEPT
 
 # muu väljast siseneva keelame ja logime
 ipchains -A input -i $vs -j REJECT -l
  
 
 # LÄBI SISESEADME SUUNATUD SISSE
 #
 # Kohtvõrgu kliendid saavad külastada kõiki
 # Linuxi masina ja interneti teenuseid
 # 
 ipchains -A input -i $ss -s $sv -d 0/0 -j ACCEPT
 
 # kõik muud keelame ja logime
 ipchains -A input -i $ss -d 0/0 -j REJECT -l
  

 #
 # SISESEADE
 # 
 # LÄBI SISESEADME VÄLJA
 #
 # 3. Sisevõrku saavad kõik paketid piiranguteta
 # Kaitse välismaailma eest toimub välisseadme reeglitega
 ipchains -A output -i $ss -s 0/0 -d $sv -j ACCEPT
 
 # muu keelame ja logime
 ipchains -A output -i $ss -j REJECT -l
 
 # KOHTSEADE
 # serverist saab lo0 seadet kasutada igatpidi
 ipchains -A input -i lo -j ACCEPT
 ipchains -A output -i lo -j ACCEPT
 
 # MASKERAAD
 # korraldame kohtvõrgu maskeraadimise
 ipchains -A forward -i $vs -s $sv -d 0/0 -j MASQ

Näites on reeglid sõnastaud seadmete kaupa, Ipchains hoiab ise reegleid ahelate kaupa, vastavad reeglid on sellised

bash# ipchains -L -n --line-numbers -v

Võtmega -n kuvatakse IP aadressid ja pordid numbrilisel kujul. Lisades võtme -v saate näha iga reegliga seotud andmemahte.

Maskeraadi automaatne käivitamine

Et igal masina taaskäivitamisel ei peaks käsitsi skripti masq.sh käivitama, selleks tuleb kirjutada vastav rida mõnda süsteemi algkäivitusfaili. Näiteks täidetakse failis /etc/rc.d/rc.local olevad käsud süsteemi käivitamise käigus automaatselt.

Logide analüüs

Nendele skriptis kirjeldatud reeglitele, mis lõppevad '-l' -ga vastavad paketid logitakse Syslogi. Syslogis on ilmselt lisaks maskeraadi logidele ka muud informatsiooni, mida saab vaadata näiteks käsuga tail

bash# tail -f /var/log/messages
Dec 13 14:14:14 cockpit kernel: Packet log: input ACCEPT eth1 PROTO=1 62.254.76.154:0  193.40.223.98:0 L=28 S=0x00 I=61117 F=0x0000 T=112 (#8) 
Dec 13 14:14:16 cockpit identd[16683]: Connection from lustiverepk.edu.ee
Dec 13 14:14:15 cockpit kernel: Packet log: input ACCEPT eth1 PROTO=1 172.143.67.60:0 193.40.223.98:0 L=28 S=0x00 I=12806 F=0x0000 T=108 (#8)
Dec 13 14:14:15 cockpit kernel: Packet log: input ACCEPT eth1 PROTO=1 172.154.227.160:0 193.40.223.98:0 L=28 S=0x00 I=19757 F=0x0000 T=108 (#8)
Dec 13 14:14:15 cockpit kernel: Packet log: input ACCEPT eth1 PROTO=1 194.230.177.147:0 193.40.223.98:0 L=28 S=0x00 I=50513 F=0x0000 T=109 (#8)

Maskeraadiga seotud read tunneb ära nime 'Pacet log' järgi. Näiteks esimene rida tähendab järgmist

Dec 13 14:14:14 - sündumuse toimumise aeg

  • cockpit kernel: Packet log: - tegemist on kerneli Packet logiga
  • input ACCEPT eth0 - tegemist on läbi välise võrguseadme siseneda lubatud paketiga
  • PROTO=1 - tegu on ICMP sõnumiga, tõenäoliselt ping (vt. /etc/protocols)
  • 62.254.76.154:0 193.40.223.98:0 - pakett tuli aadressilt 62.254.76.15 ja oli suunatud aadressile 193.40.223.98
  • (#8) - paketile rakendus 24. input ahela reegel

Üks võimalus Linuxi masina kaitstuse üle otsustada on uurides süsteemi logisid.