Internetmegosztás, gateway és tűzfal kialakítás (UHU 1.2)

gatewayMíg az ember egy kis modem végén csücsül addig nincsenek nagy igények. De ahogy bejön egy szélesebb sávú internet akkor ezzel sok sok igény is felmerül. Ilyen például az, hogy meg tudjuk osztani több gép között a netet.

A probléma

A meglévő hálózatunkba kellett beállítanom egy szervert (merthogy nem akartunk routert venni), ami ellátja a következő funkciókat:

  • megosztja az internetet (először ISDN, aztán ADSL)
  • tűzfalként védi a belső hálót
  • naplózza, hogy melyik user mit csinált a neten
  • tartalomszűrés
  • proxy

Ja igen, a probléma az volt, hogy nem értek hozzá. Elkezdtem keresgetni a neten, de nem találtam egyetlen kezdőknek szóló teljes leírást sem. Gondoltam nekifutok és menet közben leírom, hogy mi hogyan sikerült.

Azt hiszen többé-kevésbé a többi Linuxon is így kell beállítani egyébként.

Ami megvolt

Egy 15 gépből álló belső hálózat, melyben vegyesen voltak Windowsos (7 gép XP), Linuxos (6 gép UHU 1.2, 1 gép SUSE 9.1) gépek, és egy belső webszerver (UHU 1.1). Ehhez még időnkét bekapcsolódtak vendég gépek Macintosh, és Win laptopok.

A hálózati címek A osztályú címek a 10.0.0.0 – 10.255.255.255 tartományból, 255.255.0.0 alhálózati maszkkal. A belső webszerver a 10.1.1.1 címet kapta, a tűzfalunk pedig a 10.1.1.2 címet. DHCP szervert nem akartam beüzemelni, mert ahhoz sem értek :-). A kliensek azért, hogy a jogosultságokat könnyen lehessen állítani (ha egyszer kell) csoportokba kerültek, és az ip címük harmadik száma mutatta a csoportot, vagyis 10.1.2.*, 10.1.4.*, 10.1.8.*, stb így néztek ki a csoportok. Persze ennek semmi köze a témánkhoz, de azért leírtam.

Mindezek a gépek egy 24 portos D-link switch-be voltak bedugva. A hálózatunk kisebb-nagyob rakoncátlankodások mellett működött. A mi szempontunkból az a lényeg, hogy fix ip címekkel vannak a kliensek és a tűzfal is megáldva.

Szükséges hardverek

Mivel nem akartunk külön venni egy routert ezért előszedtünk egy régi gépet, amiről csak sejtettem, hogy elég lesz.

  • Celeron 700 MHz processzor
  • 128 MRAM memória
  • 1 GB winchester
  • soros port (az ISDN-hez)
  • egy külső ISDN modem Taicom IS128SS-A TA
  • két hálókártya (az ADSL-hez)
  • CD meghajtó

A szerver telepítése

Oprendszernek az UHU 1.2-t választottam, mert ez volt az egyetlen Linux disztribúció amivel már viszonylag szorosabb barátságot kötöttem. A lenti műveletek végrehajtásához nem árt ha ismered a root jelszót, és rootként próbálod meg őket megcsinálni.

A szükséges csomagok kiválogatása

Egy internetre kitett szervernél nagyon fontos, hogy csak a szükséges csomagok legyenek rajta telepítve. Pl az X.org és minden más grafikus progam biztosan felesleges egy szerverre. Egy tűzfalnál meg főleg fontos, hogy ne legyenek felesleges alkalmazások. Az az általános tanács, hogy tűzfal gépen ne futassunk semmilyen más alkalmazást (pl http szervert).

Én ezeket hagytam fenn, de biztos vagyok benne, hogy még ezek közül is van egy rakás felesleges. Majd alkalomadtán kinyomozom, hogy mi nem kell és kiveszem itt is a listából.

acl, attr, bash, binutils, bzip2, cdcap, coreutils, cpp, cracklib, cron, cyrus-sasl2, db1, db3, db4, diffutils, dosfstools, dpkg, e2fsprogs, ethtool, fbgetty, findutils, gawk, gcc, gcc-lib, gdbm, glib2, glibc, gpm, grep, grub, gzip inputattach, iproute2, iptables, iptables-utils, iputils, kbd, kernel, krb5, ldetect-lst, less, libiodbc, libstdc++5, libuuid, logrotate, mc, mdadm, mii-diag, mkinitrd, mktemp, module-init-to, mysql-common, ncpfs, ncurses, net-tools, openldap, openslp, openssh-common, opensshd, openssl, pam, pciutils, perl, popt, postfix, ppp, procmail, procps, python, readline, rmt, rp-pppoe, sed, shadow, slang, squashfs-tools, strace, stunnel, supermount-rel, sysklogd, sysvinit, tar, tcp-wrappers, terminfo, timeslide, traceroute, udev, uhu-base, uhu-hotplug, uhu-init, uhu-initscript, uhu-netbase, uhu-pkg, uhu-utils, usbutils, util-linux, wvdial, wvstreams, zlib

Na ezekkel lefutott a telepítés. Így összesen 260MB helyet foglalt el a rendszer.

A passwd file javítása

Ezután a /etc/passwd fileban kellett egy kis módosítást végrehajtani. Ezen a gépen két user van, a root és a sajátom. Azért van kettő, mert a root nem tud ssh-val bejelentkezni. Ezen kívül még van a rendszernek egy pár userja, de ezek nem emberi lények, így nem kell nekik shell. Nem is volt nekik adva, kivéve a nobody-t, és az sshd-t. Na ezeknek a shelljét /bin/bash-ról /bin/false-ra állítottam.

A szerver beállítása

Hálókártya beállítás

A következő két file-t kell állítani: (A *** helyére a hálókártya mac címe kerül. Ha a /etc/sysconfig/network/ethernet/ után ütsz egy TAB-ot akkor kiírja, hogy milyen hálókártyákat észlelt.)

/etc/sysconfig/network/ethernet/***/ipv4/address – ide jön a hálózati cím, esetünkben 10.1.1.2, mivel ez a hálókártya fog a belső hálózat felé nézni.

/etc/sysconfig/network/ethernet/***/ipv4/netmask – ide jön az alhálózati maszk, 255.255.0.0

Itt még nem biztos, hogy életre kel a hálókártya, de nem emlékszem, hogy még miket csináltam. ifup, ifconfig, reboot, stb. Tesztelni ugy lehet, hogy az ifconfignak valami ilyesmit kell kiírnia:

eth0 Link encap:Ethernet  HWaddr 00:30:4F:39:66:21
inet addr:10.1.1.2  Bcast:10.255.255.255  Mask:255.255.0.0
UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

RX packets:3131 errors:0 dropped:0 overruns:0 frame:0
TX packets:617 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000

RX bytes:304094 (296.9 Kb)  TX bytes:89251 (87.1 Kb)
Interrupt:11 Base address:0x2000

lo Link encap:Local Loopback
inet addr:127.0.0.1  Mask:255.0.0.0
UP LOOPBACK RUNNING  MTU:16436  Metric:1

RX packets:18040 errors:0 dropped:0 overruns:0 frame:0
TX packets:18040 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0

RX bytes:1172920 (1.1 Mb)  TX bytes:1172920 (1.1 Mb)

Ha hiányzik a lo blokk akkor tényleg nagy gáz van. Ha az eth0 rész hiányzik akkor még kell erőlködni egy kicsit, hogy életre keljen. Ha a /etc/sysconfig/network/ethernet/ könyvtárban nincs semmi akkor meg nem ismerte fel a gép a hálókártyát, be kell szerezni egy újat, vagy szét kell nézni a neten hátha van hozzá driver. Bár ahogy én láttam ahhoz már kernelt kell fordítani és ha valaki tudja, hogy azt hogyan kell akkor biztos nem ezt a leírást olvassa…

Ha valami ilyesmit ír ki az ifconfig, akkor meg lehet pingelni a következőket:

  • A szerverünkön adjuk ki a ping localhost vagy a ping 127.0.0.1 parancsot. Ennek valami ilyesmit kell adnia:
    root@vraja:~# ping localhost
    PING localhost.localdomain (127.0.0.1) 56(84) bytes of data.
    64 bytes from localhost.localdomain (127.0.0.1): icmp_seq=0
      ttl=64 time=0.075 ms
    64 bytes from localhost.localdomain (127.0.0.1): icmp_seq=1
      ttl=64 time=0.085 ms
    64 bytes from localhost.localdomain (127.0.0.1): icmp_seq=2
      ttl=64 time=0.083 ms
    64 bytes from localhost.localdomain (127.0.0.1): icmp_seq=3
      ttl=64 time=0.084 ms
    --- localhost.localdomain ping statistics ---
    4 packets transmitted, 4 received, 0% packet loss, time 2999ms
    rtt min/avg/max/mdev = 0.075/0.081/0.085/0.011 ms, pipe 2

    Control-C-vel meg kell szakítani pár sor után, máskülönben 3 napig fogja kiírkálni a dolgait.

  • Pingeljük meg a gépünket a hálózati kártyája ip címe alapján
    root@vraja:~$ ping 10.1.1.2
    PING 10.1.1.2 (10.1.1.2) 56(84) bytes of data.
    64 bytes from 10.1.1.2: icmp_seq=0 ttl=64 time=0.066 ms
    64 bytes from 10.1.1.2: icmp_seq=1 ttl=64 time=0.048 ms
    64 bytes from 10.1.1.2: icmp_seq=2 ttl=64 time=0.048 ms
    64 bytes from 10.1.1.2: icmp_seq=3 ttl=64 time=0.047 ms
    --- 10.1.1.2 ping statistics ---
    4 packets transmitted, 4 received, 0% packet loss, time 2999ms
    rtt min/avg/max/mdev = 0.047/0.052/0.066/0.009 ms, pipe 2

    Na ez is működik.

  • Ezután megpróbálhatjuk megpingelni a hálózatunk egy másik gépét.
    root@vraja:~# ping 10.1.4.8
    PING 10.1.4.8 (10.1.4.8) 56(84) bytes of data.
    64 bytes from 10.1.4.8: icmp_seq=0 ttl=64 time=0.179 ms
    64 bytes from 10.1.4.8: icmp_seq=1 ttl=64 time=0.151 ms
    64 bytes from 10.1.4.8: icmp_seq=2 ttl=64 time=0.158 ms
    --- 10.1.4.8 ping statistics ---
    3 packets transmitted, 3 received, 0% packet loss, time 1999ms
    rtt min/avg/max/mdev = 0.151/0.162/0.179/0.018 ms, pipe 2

    Ha így néz ki akkor sikerült.

  • Ezután valamelyik kliensről próbáljuk megpingelni a szervert ping 10.1.1.2 – és ennek is valami hasonlókat kell kiírnia.

ADSL esetén ugye van egy másik hálókártyánk is. A szakértelmem azt diktálta, hogy először csak egy hálókártyát szereljek be a gépbe, azt állítsam be, aztán szereljem be a másikat és ekkor már tudni fogom, hogy a két mac cím közül melyik a második hálókártyáé. 🙂 A második hálókártyát, amelyik az internet felé néz nem kell beállítani, mert ennek többnyire dinamikus IP címe lesz és az internet szolgáltatótól fogjuk megkapni minden csatlakozáskor. Vagy valami ilyesmi.

A második hálókártya beszerelése és az adsl kapcsolat létrejötte után az ifconfig-nak ki kell egészülnie egy eth1 és egy ppp0 blokkal.

Nevezzük el a szervert

 

A /etc/hostname file-ba kell beírni a nevet amit szeretnénk a szerverünknek adni. Én azt írtam ide, hogy vraja.

Csatlakozzunk az internetre

ISDN

Mivel először ISDN-re csináltam meg leírom ezt is, hátha valakinek még jó lesz.

Először futtasd a wvdialconf /etc/wvdial.conf parancsot. Ez létrehozza a /etc/wvdial.conf állományt, amiben a tárcsázási parancsok lesznek. Nekem ezt hozta létre:

[Dialer Defaults]
Modem = /dev/ttyS0
Baud = 115200
Init1 = ATZ
;Init2 = ATQ0 V1 E1 S0=0 &C1 &D2 - ezt ki kellett kommenteznem mert valahogy ezzel nem ment
Init2 = ATM1L1 - ezt adtam meg helyette
ISDN = 0
Modem Type = Analog Modem
Phone = 0651601601 - ide jön a szolgáltatód telefonszáma
Username = vraja108 - ide jön a szolgáltatódnál választott userneved
Password = goranga - ide jön az internet csatlakozáshoz szükséges jelszavad

Ezután a wvdial paranccsal tudsz kapcsolatot létesíteni (rootként). Ha sikeres akkor valami ilyesmit fogsz látni:

--> WvDial: Internet dialer version 1.53
--> Initializing modem.
--> Sending: ATZ
ATZ
OK
--> Sending: ATM1L1
ATM1L1
OK
--> Modem initialized.
--> Sending: ATDT0651601601
--> Waiting for carrier.
ATDT0651601601
CONNECT
--> Carrier detected.  Waiting for prompt.
~[7f]}#@!}!;}  }#}$@#}%}&aFih}1}$}%t}3}.}!as0-marcali9b~

És ha minden jól megy akkor interneten vagy. Kipróbálhatod a ping www.axelero.hu paranccsal. Ha az eredmény a szokásos akkor eddig minden stimmel, Control-C-val megszakíthatod a kapcsolatot.

ADSL

Telepítenem kellett az rp-pppoe csomagot, mert az eredeti telepítéskor ezt nem raktam fel. Ebben a csomagban található az adsl-setup, adsl-start, adsl-status és adsl-stop parancs, ami nekünk itt kell.

Először létre kell hozni a ppp eszközfilet. mknod /dev/ppp c 108 0

Ezután futtathatjuk az adsl-setup parancsot, ami szépen beállítja a szükséges dolgokat a /etc/ppp/pppoe.conf és a /etc/ppp/resolv.conf fileokban. A program a következő információkat kéri:

username
itt kell megadni az adsl felhasználói nevet. Valamilyen misztikus okból kifolyólag nem elég sima felhasználói nevet adni, hanem e-mail címet kell. Szóval nekem az került ide, hogy krisnavolgy@t-online.hu
interface
itt kell megadni, hogy melyik hálókártya néz az internete. Nekem eth1 volt.
demand value
ha nincs fix ip címünk, akkor no-t válasszunk.
DNS
névszerver címek. Itt adjuk meg a szolgáltató névszervereinek ip címét. (Nekem 195.228.240.249 és 195.228.242.180)
password
A szolgáltatónál lévő jelszó
firewall
Itt választhatjuk a 0 (NONE), mivel úgyis beállítjuk a saját tűzfalunkat.
Accept settings?
nézzük meg, hogy nem gépeltünk-e el valamit és fogadjuk el a beállításokat.

Ezután ha kiadjuk az adsl-start parancsot, akkor a zserverünknek csatlakoznia kell az internetre.

Az internet megosztása

Az internet megosztása itt azt jelenti, hogy egy bejövő internet vonalat akarunk több gépről használni. Ehhez az internet elérésünket meg kell osztani. Az a gép amibe bejön az internet és ellátja ezt az elosztó/továbbító funkciót az átjáró vagy gateway. Amennyiben nem számítógéppel látjuk el a feladatot, akkor általában a router (egy külön kis doboz pár hálóózati csatlakozóval) ami ezt csinálja.

Szóval a hardverünk megvan a dolgohoz, szoftver szempontjából pedig egy 2.4-es vagy ujabb kernel kell és a netfilter/iptables csomag. Ezt az UHU 1.2 alapból biztosította.

Erre az iptables-t használjuk.
iptables --table nat --append POSTROUTING --out-interface ppp0 -j MASQUERADE

A ppp0 néz az internet felé.

Tűzfal

A tűzfal azt jelenti, hogy valamilyen szabályok szerint korlátozzuk a LAN-ról és a LAN-ra érkező forgalmat. Ez egyrészt védelmet ad az illetéktelen betolakodókkal szemben, akik vagy a mi rendszerünkbe (belső hálózatunkra) akarnak betörni, vagy a mi rendszerünket felhasználva (a mögé bújva) akarnak más rendszerekbe betörni, hogy ha kiderül, akkor úgy nézzen ki, mintha mi voltunk volna a betörők. Másrészt védelmet ad a LAN felhasználói által esetleg elkövetendő hasonló csacskaságok ellen.

E mellett egy jól beállított tűzfallal igen kifinomult szűrést érhetünk el pl, hogy csak a gaura nevű felhasználó ftp-zhessen, csak a 10.1.2.* csoport IRC-zhessen, stb.

Sokféle tűzfal alkalmazás van forgalomban, én a netfilter/iptables csomagot választottam erre a célra. Az új routerek egyébként már ellátnak bizonyos tűzfal funkciókat is.

A továbbiakban ha tűzfalról beszélek, akkor egy számítógépről beszélek amin fut a tűzfal alkalmazás.

Az internetre, LAN-ra irányuló adatok csomagokban utaznak. Minden csomagnak van fejléce és adattaratlma. Általában a csomagok fejlécét vizsgálva hozzuk létre a döntést, hogy mit csinálunk vele.

Netfilter / iptables

A következő leírás Oskar Andreasson Iptables Tutorial-ja alapján készült. Ezer köszönet érte.

A manual szerint az iptables egy adminisztrációs eszköz IPv4 csomagok szűrésére és NAT-olására. 🙂 AZ IPv4 hálózati csomagot jelent, a NAT meg itt alább részletesebben meg lesz magyarázva.

Az iptables egy állapotkövető (connection tracking) alkalmazás, ami azt jelenti, hogy figyeli, hogy egy válsz mely kérésre érkezett, és ezeket automatikusan összepárosítja.

Az iptables töménytelen beállítási lehetősége közül csak azokat fogom megmagyarázni amit használunk a scriptben, a többi megtalálható a fenti tutorialban.

Általános áttekintés

Az itt leírtak igazak általánosságban, de próbálom főleg azokat kiemeleni amik a tűzfalra vonatkoznak. Semmi sem gátol meg bennünket abban, hogy az iptables fusson és szűrjön a LAN-on belüli klienseken, de ez a leírás NEM ezekkel, hanem a tűzfalon futó iptables beállításávbal foglalkozik.

Amikor érkezik a gépünkre egy hálózati csomag akkor az valami ilyesmi utat fut be:

belép az eth0 hálókártyán -> prerouting lánc -> útválasztás -> forward lánc -> postrouting lánc -> kilép az eth1 hálókártyán

Persze ez abban az esetben igaz, ha a gépünk éppen egy átjáró és nem fut rajta semmi megcélozható alkalmazás. Ha esetleg van, pl egy links programmal nézünk valamit közvetlenül a tűzfalról, akkor az út egy kicsit módosul, mert ugye nem kell a csomagot máshova továbbítani:

belép az eth0 hálókártyán -> prerouting lánc -> útválasztás -> input lánc -> megcélzott program (esetünkben a links)

A gépről a kifelé irányuló csomagok pedig a következő utat futják be:

forrásprogram -> output lánc -> postrouting lánc -> kilép az eth0 hálókártyán

Láncok

Szóval az iptables alkalmazás a csomagokat a következő láncokon futtatja végig:

  • INPUT – erre a láncra azok az alkalmazások kerülnek amelyek közvetlenül a tűzfalat célozzák meg.
  • OUTPUT – erre a láncra a tűzfalról induló és kifelé irányuló csomagok kerülnek.
  • FORWARD – erre a láncra kerülnek a továbbítandó csomagok, így az internetről a belső hálózatunk egy gépét megcélzó, és a belső hálózatunk egy gépéről induló és az internetet megcélzó csomagok.
  • PREROUTING – útválasztás előtt alkalmazandó módosítások lánca.
  • POSTROUTING – útválasztás után alkalmazandó módosítások lánca.

Az első három lánc közül (INPUT, OUTPUT, FORWARD) valamelyikre biztosan rákerül minden csomag, a PREROUTING és a POSTROUTING láncra csak akkor kerülnek rá ha mi odaküdjük őket.

Táblák

Az iptables a csomagok kezelésének szabályait 3 táblába csoportosítja, ezek a Filter, a Mangle és a Nat tábla. Nézzük melyik micsoda.

  • FILTER – ebben a táblában történik a csomagok szűrése a megadott feltételek szerint.
  • NAT – Network Address Translation, azaz ebben a táblában történik a csomag forrás vagy cél IP címének átírása. Egy adatfolyamban csak az első csomag kerül erre a láncra, a többi automatikusan azt csinálja mint az első. 3 féle módon tudjuk az IP címet módosítani:
    • DNAT – a csomag cél IP címét módosítja. Pl ha a tűzfalnak fix IP címe van, és a DMZ-ben van egy nyilvános webszerverünk, akkor a bejövő kéréseket át kell irányítanunk oda. Erről ennyit, mert ha valaki nyilvános webszervert üzemeltet, akkor ugyse ezt a leírást olvasgatja…
    • SNAT – a csomag forrás IP címét módosítja. Pl a LAN-ban elhelyezkedő gép le akar tölteni egy weboldalt akkor azt nem teheti a saját IP címét megjelölve forrásként, mivel az egy LAN IP cím, ami az interneten nem érvényes. Az átjáró / tűzfal gépünknek tehát át kell írnia a forrás IP címet. Az SNAT akkor használatos ha fix IP címes kapcsolatunk van.
    • MASQUERADE – hasonlóan az SNAT-hoz a forrás IP címet módosítja. Akkor használjuk ha nem fix IP címes csatlakozásunk van, hanem azt DHCP szerveren keresztül az internet szolgáltatónktól kapjuk. Többnyire ez van, úgyhogy mi is ezt fogjuk használni.
  • MANGLE – “elferdít”, vagyis a csomag bizonyos jellemzőit írja át. TOS (Type of Service – a szolgáltatás típusa), TTL (Time to live – a csomag élettartama) és MARK (különleges jelölések) átírására szolgál. Ezekből a MARK használható pl sávszélesség korlátozásra.
Csomag állapotok

Minden átmenő csomag az alábbi állapotok egyikében lehet:

  • NEW – új ez egy SYN csomag kiküldését jelenti, amelyre egy SYN/ACK válasznak kell érkeznie. Hamis csomagokat lehet szűrni azzal, hogy azt vizsgáljuk, hogy SYN csomag-e és NEW állapotú-e, mert ennek a két dolognak együtt kell járnia.
  • ESTABILISHED – felépült kapcsolat
  • RELATED – kapcsolt pl egy ftp kapcsolatban minden letöltés RELATED lesz az eredeti ftp kapcsolattal
  • INVALID – nem megfeleő
Kapcsolatok

A kapcsolatok lehetnek TCP, UDP és ICMP kapcsolatok.

  • TCP kapcsolatok
  • UDP kapcsolatok
  • ICMP kapcsolatok – ezek csak ECHO, TIMESTAMP, INFORMATION és ADDRESS csomagok, valamint az ezekre jövő válaszok lehetnek. Ilyen például a ping, bagy a DHCP felé az IP cím kérés és az onnan jövő IP cím.
Mit csinálhatunk a csomagokkal?

Az iptables szabályokkal a következő dolgokat tudjuk kezdeni a csomagokkal

  • ACCEPT – elfogadjuk. Ez azt jelenti, hogy EBBEN a láncban elfogadásra került, máshol még eldobásra kerülhet, mivel a csomagok sorban végigvándorolnak az összes szabályon.
  • DROP – eldobjuk minden visszajelzés nélkül
  • REJECT – elutasítjuk és elutasító jelzést küldünk vissza
  • QUEUE – továbbítjuk más program felé
  • REDIRECT – átirányítjuk a gépben máshova pl a proxyra
  • DNAT – átírjuk a cél IP címet
  • SNAT – átírjuk a forrás IP címet (fix IP esetén)
  • MASQUERADE – átírjuk a forrás IP címet (DHCP-s IP esetén)
  • LOG – beleírunk a syslogba
  • MARK – speciális átalakítást végzünk
  • RETURN – a láncokban egyel magasabb szintre lépünk fel, ha nincs már ilyen akkor a policy szerint járunk el.
  • MIRROR, TOS, TTL, ULOG – ilyenek is vannak
A tűzfal script

 

Na, akkor ennyi rizsa után következzen a várva-várt script ami megcsinálja nekünk amit kell. Nézzük, hogy mi micsoda és miért.

#!/bin/sh
ez ugye a shell scriptek első sora, innen tudja a linuxunk, hogy itten egy shell programocska következik
INET_IFACE=”ppp0″
Az INET_IFACE változóban tároljuk el annak a hálókárytának az azonosítóját, ami az internet felé néz. A ppp0 ISDN kapcsolatot jelent, ADSL esetén ez eth0 lesz (vagy eth1, attól függően, hogymelyik néz az internet felé). Azért kell a változó, hogy a script többi részében ezt használhassuk, így egyszerű átalakítani a sciptet ha kell.
DHCP_SERVER=”195.228.240.249″
Mivel nics fix IP címünk az Axelero DHCP szerverétől fogunk IP címet kapni. Az Axelero nameserverének a címe került ebbe a változóba.
LAN_IP=”10.1.1.2″
Ez a változó tárolja a gépünk (mármint a tűzfal) helyi IP címét. Ide persze azt kell beírni amit beállítottunk a szerver beállítása rész szerint.
LAN_IP_RANGE=”10.1.0.0/16″
Ez a helyi hálózatunk címtartománya. A / utáni rész azt jelenti, hogy a rendelkezésre álló 32 bitből (vagyis 255.255.255.255) 16-ot használunk (ami 255.255.0.0-t jelent).
LAN_IFACE=”eth0″
Ez a változó tárolja annak a hálókártyának az azonosítóját, ami a belső hálózat felé néz.
LO_IFACE=”lo”
Ez a loopback eszközünk azonosítója nem kell rajta változtatni.
LO_IP=”127.0.0.1″
Ez a loopback eszközünk IP címe, szintén nem kell módosítani.
IPTABLES=”/usr/sbin/iptables”
Ez a változó tárolja az iptables helyét. UHU 1.2 alatt ez jó lesz, máshol a whereis iptables vagy a which iptables paranccsal tudjuk meg, hogy hol van. De általában ez jó lesz.
/sbin/depmod -a
modul függőségek kezelése. Ha valamelyik lenti modul nem akarna betöltődni, akkor lehet, hogy statikusan bele van fordítva a kernelbe. Érdemes egyszer kézzel végigpötyögni egyszer a következő pár sort, hogy lássuk minden rendben lefut-e. UHU 1.2 alatt nekem az iptable_nat és az iptable_MASQUERADE modulok a következő hibával tértek vissza: iptable_nat, WARNING: Error inserting ipfwadm (/lib/modules/2.6.9-19/kernel/net/ipv4/netfilter/ipfwadm.ko): Device or resource busy. Ettől függetlenül a netmegosztásom és a tűzfalam működik. Valaki megírhatná, hogy mi ez.
/sbin/modprobe ip_conntrack
connection tarcking modul betöltése. Ez teszi elérhetővé a NAT és MASQUERADE szolgáltatásokat
/sbin/modprobe ip_tables
Ez maga az iptables amivel dolgozunk.
/sbin/modprobe iptable_filter
A Filter táblát adja meg
/sbin/modprobe iptable_mangle
A Mangle táblát adja meg.
/sbin/modprobe iptable_nat
A NAT táblát adja meg.
/sbin/modprobe ipt_LOG
Loggolás bekapcsolása
/sbin/modprobe ipt_limit
Limitek (korlátozások) megadása
/sbin/modprobe ipt_MASQUERADE
MASQUERADE 🙂
echo “1” > /proc/sys/net/ipv4/ip_forward
A /proc beállítása ahhoz, hogy kezelje az IP továbbítást
$IPTABLES -P INPUT DROP
Ez az első szabályunk. A -P (–policy) kapcsoló hozza létre a policy-t, vagyis az alapértelmezett műveletet. Mivel a tűzfalon nem akarunk felesleges lyukakat, ezért a policy a DROP (eldobás) lesz az INPUT láncra vonatkozóan. EZ így azt jelenti, hogy minden az INPUT láncra kerülő csomagot dobjunk el ami nem teljesíti a lentebb található feltételek egyikét sem. Vagyis nekünk ekll megnevezni mindent amit engedélyezünk, minden más tiltott és ezért eldobjuk.
$IPTABLES -P OUTPUT DROP
Az OUTPUT lánc plocy-je is DROP lesz ugyanígy.
$IPTABLES -P FORWARD DROP
És a FORWARD láncé is.
$IPTABLES -N bad_tcp_packets
Ezután létrehozunk egy saját láncot, a -N (–new-chain) kapcsolóval és a bad_tcp_packets nevet adjuk neki. Saját láncokat az elején kell létrehozni, hogy már definiálva legyenek amikor valahonnan ide ugrunk. A bad_tcp_packets lánc fogja leellenőrizni, hogy a tcp csomagjaink jók-e vagy nem, vagyis nem támadásról van-e szó.
$IPTABLES -N allowed
Szintén egy saját lánc ami az allowed (engedélyezett) nevet kapja. Ez a lánc fogja kezelni az engedélyezett csomagokat.
$IPTABLES -N tcp_packets
Még egy saját lánc tcp_packets néven, ez fogja a TCP csomagokat ellenőrizni.
$IPTABLES -N udp_packets
Még egy, ez az UDP csomagokat fogja ellenőrizni.
$IPTABLES -N icmp_packets
Éc még egy az ICMP csomagok számára.
$IPTABLES -A bad_tcp_packets -p TCP –tcp-flags SYN,ACK SYN,ACK -m state –state NEW -j REJECT –reject-with tcp-reset
Na ezt egy kicsit részletesebben le kell írni

  • -A bad_tcp_packets : a -A (–append) kapcsolóval adunk hozzá egy új szabályt az eddigiekhez. Ezzel a bad_tcp_packets lánchoz adjuk hozzá a következő szabályt.
  • -p tcp : -p (–protocol) “ha a csomag protokollja tcp”
  • –tcp-flags SYN,ACK SYN,ACK : “és ezekkel a tcp-flag-ekkel rendelkezik”
  • -m state –state NEW : “és a csomag állapota NEW”
  • -j : (–jump) ugorj ide, vagy “ezt csináld:”
  • REJECT –reject-with tcp-reset : “utasísd el egy tcp-reset-tel”
$IPTABLES -A bad_tcp_packets -p TCP ! –syn -m state –state NEW -j LOG –log-prefix “Uj-nak jelolt syn nelkul:”
Újnak mondott a csomag, de hiányzik a syn bit. Ez biztosan valami rosszfiú műve, ezért loggoljuk, aztán…
$IPTABLES -A bad_tcp_packets -p TCP ! –syn -m state –state NEW -j DROP
.. eldobjuk
$IPTABLES -A allowed -p TCP –syn -j ACCEPT
Ezt a szabályt már az allowed lánchoz fűzzük hozzá. Azt jeletni, hogy ha a csomag TCP protokollú, és van neki SYN bitje, akkor fogadjuk el.
$IPTABLES -A allowed -p TCP -m state –state ESTABLISHED,RELATED -j ACCEPT
Ha a csomagunk TCP protokollú és már egy létező adatfolyam része akkor fogadjuk el.
$IPTABLES -A allowed -p TCP -j DROP
Ha nem teljesül a fenti kettő közül egyik sem, akkor a csomag ide kerül, eldobjuk.
$IPTABLES -A tcp_packets -p TCP -s 0/0 –dport 21 -j allowed
Ezt a szabályt a tcp_packets lánchoz fűzzük hozzá. Ha (-p TCP) a protokoll TCP, és (-s 0/0) a csomag forrás IP-je bármi, (–dport 21) és a 21-es portunkat célozza meg, azaz ftp kérés, akkor irányítsuk rá további ellenőrzés céljából az allowed láncra.. Ha a tűzfalunkon nem fut nyilvános ftp szerver (nem kéne, hogy fusson), illetve ha a tűzfalról magáról nem akarunk ftp-vel letölteni semmit, akkor ezt a sort ki kell kommentezni. A következő két sorban a –dport 22 SSH-t jelent, ami szintén nem kell hacsak nem akarjuk engedni, hogy valaki az internet felől a tűzfalunkat állítgassa, a –dport 80 pedig HHTP kérést jelent, ami szintén felesleges hacsak nem fut (nem kéne) valamilyen webszerver (pl Apache) a tűzfalunkon. A portok és a hozzájuk tartozó szolgáltatások listája megtalálható a http://www.iana.org/assignments/port-numbers oldalon és itt is. Ebben a listában nem feltétlenül van meg minden, de a programok honlapján, helpjében mindig benne van, hogy milyen portokon kommunikálnak. Pl a Skype nem volt benne a listában, de a honlap szerint az 1024-es kimenő TCP portot, vagy a 80-as és 443-as kimenő TCP portot kell nyitva hagynunk a tűzfalon a működéséhez.
$IPTABLES -A tcp_packets -p TCP -s 0/0 –dport 113 -j allowed
Ez a 113-as TCP portra irányuló TCP protokollú csomagokat irányítja az allowed láncra. A 113-as TCP port az IDENT szolgáltatást jelenti, ez kell pl az IRC-hez.
$IPTABLES -A udp_packets -p UDP -s 0/0 –sport 53 -j ACCEPT
Ez a szabály az udp_packets lánchoz kerül hozzáfűzésre. Ha a csomag (-p UDP) UDP protokollú, (-s 0/0) bárhonnan jön és (–dport 53) az 53-as portra irányul, akkor fogadjuk el. Az 53-as UDP portot a domain name szerverek használják, szóval ha DHCP-n keresztül kapjuk meg az IP címünket, akkor ez nem árt ha engedélyzeve van.
$IPTABLES -A udp_packets -p UDP -s $DHCP_SERVER –sport 67 –dport 68 -j ACCEPT
DHCP-n keresztüli IP beállítás engedélyezése
$IPTABLES -A udp_packets -p UDP -s 0/0 –sport 123 -j ACCEPT
Órabeállítás engedélyezése
$IPTABLES -A udp_packets -p UDP -s 0/0 –sport 2074 -j ACCEPT
Talán IRC engedélyezés?
$IPTABLES -A udp_packets -p UDP -s 0/0 –sport 4000 -j ACCEPT
ICQ engedélyezés
$IPTABLES -A udp_packets -p UDP -i $INET_IFACE –dport 135:139 -j DROP
A 135-139 portokra irányuló csomagok Microsoft hálózatok NETBIOS lekérései. Na ha ez az internet felől jön (-i $INET_IFACE), akkor kidobhatjuk.
$IPTABLES -A udp_packets -p UDP -i $INET_IFACE -d 255.255.255.255 –dport 67:68 -j DROP
Az internet felől jövő (-i $INET_IFACE) UDP csomagok (-p UDP), melyek a 255.255.255.255 irányába (-d) haladnak a 67-68 portokra (–dport 67:68) szintén NETBIOS lekérések és eldobhatóak.
$IPTABLES -A icmp_packets -p ICMP -s 0/0 –icmp-type 8 -j ACCEPT
$IPTABLES -A icmp_packets -p ICMP -s 0/0 –icmp-type 11 -j ACCEPT
Ez a két sor azt biztosítja, hogy meg lehessen minket pingelni. Ha nemakarjuk kikommentezhetjük.
$IPTABLES -A INPUT -p TCP -j bad_tcp_packets
EZ az INPUT lánc első szabálya. A TCP protokollú csomagokat küldjük vele a bad_tcp_packets láncra ellenőrzés céljából.
$IPTABLES -A INPUT -p ALL -i $LAN_IFACE -s $LAN_IP_RANGE -j ACCEPT
Minden protokokollú csomag, mely a LAN felé néző hálókártyáról érkezik és a LAN felé irányul elfogadva.
$IPTABLES -A INPUT -p ALL -i $LO_IFACE -j ACCEPT
A loopback-ről érkező minden csomag elfogadva.
$IPTABLES -A INPUT -p UDP -i $LAN_IFACE –dport 67 –sport 68 -j ACCEPT
UDP csomagok a LAN interfészünk 68-as portjáról a 67-es portra elfogadva. Ezek a helyi hálózatunk broadcast üzenetei.
$IPTABLES -A INPUT -p ALL -i $INET_IFACE -m state –state ESTABLISHED,RELATED -j ACCEPT
Minden protokollú csomag az internet felől ami más egy létező adatfolyam része legyen elfogadva.
$IPTABLES -A INPUT -p TCP -i $INET_IFACE -j tcp_packets
Az internet felől érkező TCP csomagok menjenek a tcp_packets láncra.
$IPTABLES -A INPUT -p UDP -i $INET_IFACE -j udp_packets
UDP csomagok az udp_packets láncra.
$IPTABLES -A INPUT -p ICMP -i $INET_IFACE -j icmp_packets
ICMP csomagok az icmp_packets láncra.
$IPTABLES -A INPUT -i $INET_IFACE -d 224.0.0.0/8 -j DROP
Külső Microsoft hálózatok broadcast üzeneteinek eldobása.
$IPTABLES -A INPUT -m limit –limit 3/minute –limit-burst 3 -j LOG –log-level DEBUG –log-prefix “IPT INPUT csomag kimúlt: “
  • -j LOG : loggoljuk a syslogba azokat a csomagokat amik nem feleltek meg az INPUT láncunk egyik szabályának sem a következők szerint
  • -m limit –limit 3/minute : percenként három LOG bejegyzés legyen maximum
  • –limit-burst 3 : maximum 3 csomagról
  • –log-level DEBUG : a log-level lehet: DEBUG, INFO, NOTICE, WARNING, ERR, CRIT, ALERT, és EMERG. A /var/log/syslog-ba kerül.
  • –log-prefix “IPT INPUT csomag kimúlt: ” : ez a szöveg legyen a LOG bejegyzés elején. Ez azért jó, mert később pl grep-pel a logbejeygzések jobban áttekinthetőek lesznek.
$IPTABLES -A FORWARD -p TCP -j bad_tcp_packets
A FORWARD láncunk első szabálya. Küldjük a TCP csomagokat ellenőrzésre a bad_tcp_packets láncra.
$IPTABLES -A FORWARD -i $LAN_IFACE -j ACCEPT
A helyi hálóra néző hálókártyáról érkező csomagokat fogadjuk el.
$IPTABLES -A FORWARD -m state –state ESTABLISHED,RELATED -j ACCEPT
A már élő adatfolyamokban érkező csomagokat fogadjuk el.
$IPTABLES -A FORWARD -m limit –limit 3/minute –limit-burst 3 -j LOG –log-level DEBUG –log-prefix “IPT FORWARD csomag kimúlt: “
Loggoljuk a fura csomagokat amik nem feleltek meg az eddigi FORWARD beli szabályoknak.
$IPTABLES -A OUTPUT -p TCP -j bad_tcp_packets
Az OUTPUT láncunk első szabálya a szokásos. TCP csomagok ellenőrzésre a bad_tcp_packets láncra zavarva.
$IPTABLES -A OUTPUT -p ALL -s $LO_IP -j ACCEPT
Minden csomag a loopbackről elfogadva.
$IPTABLES -A OUTPUT -p ALL -s $LAN_IP -j ACCEPT
Minden csomag a LAN felé néző hálókártyánkról elfogadva.
$IPTABLES -A OUTPUT -p ALL -o $INET_IFACE -j ACCEPT
Minden csomag az internet felé néző hálókártyánkról elfogadva.
$IPTABLES -A OUTPUT -m limit –limit 3/minute –limit-burst 3 -j LOG –log-level DEBUG –log-prefix “IPT OUTPUT csomag kimúlt: “
Ha a csomag nem felelt meg az OUTPUT láncunk egyik szabályának sem akkor loggoljuk.
$IPTABLES -t nat -A POSTROUTING -o $INET_IFACE -j MASQUERADE
Ha a csomagunk az internetre néző hálókártyánkon lép ki, akkor maszkolnunk kell. Ez gondoskodik a netmegosztásról, ettől a sortól működik a tűzfalunk átjáróként és ez teszi lehetővé a LAN számára az internet elérését. A szabályunk a NAT táblába kerül (-t NAT) és az útválasztás után lesz alkalmazva (POSTROUTING).

Ennyi. Ezután ha kiadunk egy iptables -L parancsot akkor egy szép karácsonyfát kapunk, ami a szabályainkat mutatja.

A tűzfal automatikus indítása a számítógép elindításakor

Ezt az iptables utasítást a gépünk nem fogja megjegyezni, ezért külön gondoskodnunk kell róla, hogy minden rendszerindításkor lefusson egy script ami ezeket az utasításokat tartalmazza. Ezt úgy tehetjük meg, hogy a /etc/runlevel.d/default könyvtárba beteszünk egy tuzfal.service nevű file-t a következő tartalommal.

Summary=Firewall
A szolgáltatás leírása angolul.
Summary[hu]=Tűzfal
A szolgáltatás leírása magyarul.
Description=Firewall by iptables
A szolgáltatás leírása angolul (részletes).
Description[hu]=Tűzfal iptables-szel
A szolgáltatás leírása magyarul (részletes).
Script=/etc/init.d/tuzfal
A scriptünk helye.
SupportsReload=no
Nem támogatjuk a reload-ot.
Runlevels=2345
A 2-5 futási szinteken fusson a tűzfal.
Sequence=99
99-es prioritással.

A /etc/runlevel.d/custom könyvtarba beteszunk szintén egy tuzfal.service nevű file-t ami üres.
Ezután a scriptünket be kell másolni a /etc/init.d alá tuzfal neven, és futtathatóvá kell tenni. Ha minden stimmel akkor következő rendszerindításkor a scriptünk automatikusan le fog futni beállítva ezzel a netmegosztást, tűzfalat.

Az ADSL kapcsolat automatikus létrehozása rendszerindításkor

A /etc/runlevel.d/custom/adsl.service fileba írjuk bele, hogy Runlevels=5

Tartalomszűrés

http://www.privoxy.org, http://philtron.sourceforge.net, http://dansguardian.org vagyis hamarosan…

Proxy

A proxy (gyorsító) szerepe az, hogy ha a helyi hálózatunkban több felhasználó látogatja ugyanazt az oldalt, tölti le ugyanazt a file-t, akkor ne rabolják ezzel a sávszélességet, hanem el tudják érni egy helyi (proxy-nak nevezett) szerverről.

A squid egy elterjedt, jól konfigurálható proxy, az UHU része. További előnye, hogy lehet hozzá naplózó és tartalomszűrő segédprogramokat találni. Telepítés után a /etc/squid/squid.conf file-ban a következőket kell beállítani:

acl our networks src
Ide kell betenni a helyi hálózatunk IP címeit, pl 10.1.0.0/16
http_access allow our_network
Ezzel meg engedélyezzük, hogy kijussanak a netre.

Ezután kell egy squid -z parancs a cache könyvtárak aktiválásához, valamint a /etc/runlevel.d/custom/squid.service file-ba be kell írni, hogy Runlevels=2345, és már gondoskodtunk is arról, hogy minden rendszerindításkor elinduljon a proxy szerverünk is.

Ezután nem árt a proxyt transzparensé tenni. Ez azért kell, hogy a klienseknek ne kelljen a böngészőben semmit se beállítaniuk. Erről van töb leírás is a weben, ezért itt nem írom le.

A userek tevékenységének naplózása

A squid telepítése után a sarg programmal tudunk emberi lények számára is emészthető formátumú kimutatásokat készíteni a squid access.log-jából. A sarg html formátumú jelentéseket készít. Ez nem automatikus, ezért érdemes rá egy cron feladatot létrehozni ami mondjuk hetente megcsinálja.

A kliensek beállítása

Linux kliensek

  • Másoljuk át a szerverről a /etc/resolv.conf file-t a kliensekre a /etc könyvtárba. Ennek a filenak így kell kinéznie:
    nameserver 195.228.240.249
    nameserver 195.228.242.180

    Persze az ip címek eltérhetnek szolgáltatónként.

  • Meg kell adni alapértelmezett átjáróként a szerverünket. UHU vezérlőpult -> Hálózati kártyák -> Átjáró – ezt kipipáljuk és beírjuk, hogy 10.1.1.2 Ez a /etc/sysconfig/network/ethernet/***/ipv4/gateway filet hozza létre, és beleírja a szerver IP címét.

Ha a linux kliensen is fut iptables, akkor alaposan nézzük át, nehogy ütközzön a szerverrel és ne engedje ki vagy be a csomagokat. A szerveren lévő tűzfal elvileg elég, szóval a klienseken ki is lehet kapcsolni.

Windows kliensek

Mivel a Microsoft előszerettel titkolja el, hogy melyik alkalmazás hol tárolja a szükséges információkat, így itt csak az “ide kattints, aztán idekattints” tipusú leírást tudom adni.

  • Vezérlőpult -> Hálózati kapcsolatok -> Helyi kapcsolat-on jobb katt -> Tulajdonságok -> TCP/IP protokoll -> Tulajdonságok-nál ugy elvileg már be van állítva az IP cím (modjuk 10.1.4.8) és az alhálózati maszk(255.255.0.0)
  • Alapértelmezett átjáró: 10.1.1.2
  • Elsődleges DNS kiszolgáló: 195.228.240.249
  • Másodlagos DNS kiszolgáló: 195.228.242.180 (persze ha a resolv.conf-ban más volt akkor ide azt kell írni)

Persze a wines klienseken nem árt ha futtatunk valamilyen víruskeresőt.

Tesztelés

Az automatikus indítás tesztelése

Indítsuk újra a szervert és amint beléptünk adjuk ki az iptables -L parancsot. Ha a szokásos karácsonyfát kapjuk akkor ez rendben van.

Ping, böngészés, ftp, IRC, Skype, stb – azaz gateway teszt

A kliensekről meg kell tudnod pingelni a szervert (ez már eddig is ment elvileg) és a külső IP címeket (pl www.axelero.hu) egyaránt. Ha ez utóbbi megy, akkor működik a névfeloldás is. Ebben az esetben előveheted a kedvenc böngésződet és annak is működnie kell.

Nekem a fenti programok egyikével sem volt probléma, nem kellett hozzájuk semmilyen extra beállítást megtenni.

Tűzfal teszt

A biztonsági beállításokat a Wigwam oldalon tudod tesztelni.

Levelezés teszt

Aki Outlookot használ annak át kell állítania minden e-mail hozzáféréséhez, hogy ne az eddigi modemes kapcsolatot használja, hanem a LAN-t.

Ja és a szokásos: semmi garancia, meg a többi…

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöljük.