IP-Masquerade "Villám" Hogyan v 0.2

 
Pár szóban arról, hogy mi is az az ip-maszkolás és mire akarjuk használni valójában.

Ip-maszkolás vagy NAT(Network Address Translation) az szolgáltatás, ami több gép számára biztosít egyetlen ip címen keresztüli kapcsolódást az internethez vagy más szolgáltatáshoz. Két jellemző felhasználása van ennek a
szolgáltatásnak. Az egyik például lehet az, hogy a sulinetes progam keretén belül, ha nem kapott az iskola megfelelő mennyiségű ip címet, a másik pedig az, ha kapcsolt vonalon keresztül csatlakozunk az internetre és szeretnénk hozzáférést biztosítani hálózatunk többi gépe számára is. Biztosan van még jónéhány terület, ahol lehet alkalmazni, de én most csak az utóbbi beüzemelését próbálom ismertetni.
 

Először is a hozzávalók:

  1. Valamilyen linux 8-)
  2. 2.0.x vagy nagyobb kernel kernel innen letölthető
  3. ipfwadm  2.0.x kernelhez vagy  ipchains  a 2.2.x-hez
  4. Jól beállított ip címek, a helyi hálózaton
  5. Jól működő kapcsolat az internet szolgáltatóval
A kernelbe a következők kellenek:

  * Prompt for development and/or incomplete code/drivers
           CONFIG_EXPERIMENTAL

- Ez teszi lehetővé a maszkolás későbbi kiválasztását, egyébként nem jelenik meg a menüben
         * Enable loadable module support
           CONFIG_MODULES
           - lehetővé teszi a kernel modulok betöltését (fontos!)

         * Networking support
           CONFIG_NET

         * Network firewalls
           CONFIG_FIREWALL

         * TCP/IP networking
           CONFIG_INET

         * IP: forwarding/gatewaying
           CONFIG_IP_FORWARD

         * IP: firewalling
           CONFIG_IP_FIREWALL

         * IP: masquerading (EXPERIMENTAL)
           CONFIG_IP_MASQUERADE

         * IP: ipautofw masquerade support (EXPERIMENTAL)
           CONFIG_IP_MASQUERADE_IPAUTOFW
           - javasolt

         * IP: ICMP masquerading
           CONFIG_IP_MASQUERADE_ICMP
           - opcionális.

         * IP: always defragment
           CONFIG_IP_ALWAYS_DEFRAG
           - felettébb javasolt

         * Dummy net driver support
           CONFIG_DUMMY
           - javasolt

2.1.x-es kernelnél a CONFIG_IP_FIREWALL és a CONFIG_IP_FIREWALL_CHAINS  opció is szükséges.

A kernelfordítás mikéntjére nem térek ki. A moduloknál még meg kell jegyezni azt, hogy bizonyos szolgáltatások működéséhez külön modulok kellenek.
Ilyen, hogy csak a legfontosabbakat említsem, az ftp es az irc. Lásd még a firewall részt.
 

Lássunk is egy gyakorlati példát (IP-Masquerade-HOWTO-ból ollózva):

      +----------+
      |          |  Ethernet
      | gép1     |::::::
      |          |2    :192.168.1.x
      +----------+     :
                       :   +----------+ PPP
      +----------+     :  1|  Linux   | link
      |          |     ::::| masq-gate|::::: Zyxel Omnit TA 128===Internet
      | gép2     |::::::   |          |       termináladapter
      |          |3    :   +----------+
      +----------+     :
                       :
      +----------+     :
      |          |     :
      | gép3     |::::::
      |          |4
      +----------+
 Ebben a példában egy négy gépből álló hálózatot látunk. Három munkaállomással és egy szerverrel. A gépeknek C osztályú IP címek vannak kiosztva. A munkaállomások Windows NT 4.0 workstationok illetve Windows 95-ök.(Nem kell a flame manapság ez a jellemző felállás 8-). A linux szerver egy ISDN vonalon kapcsolódik az internet szolgáltatóhoz. Feladata, többek között, a levelek le- és feltöltése, POP3 illetve SMTP szolgáltatás nyújtása a kliens gépeknek.
A szerveren fut egy connectd nevű démon, ami az igény szerinti betárcsázást végzi a szolgáltatóhoz. A kliens gépeken wconnect fut. Azért nem diald választottam, mert kellett az a feature, hogy rögtön bontsa le a kapcsolatot, ha valaki le akarja bontani illetve egészen addig tartsa fenn, míg egyetlen kliens is igényli azt.
Létezik még egy masqdialer nevű program, ami sokkal többet tud, van hozzá mindenféle plattformra kliens, le is tud bontani, ha kérem, DE ha bárki kéri a bontási kérelmet a többiek alól is kirántja a kapcsolatot! Hogy kinek melyik alkalmasabb azt a helyzet dönti el.
 

A ppp kapcsolat beállítása:
 

Először is próbáljuk elérni azt, hogy a linuxunk képes legyen gond nélkül kapcsolódni az internet szolgáltatónkhoz, tudjon levelet küldeni és fogadni.
 

    /etc/ppp/ppp-open

    #!/bin/bash

                   usernev           *         titok
                   nameserver 145.236.224.248    # ns0.matavnet.hu
                 nameserver 145.236.224.249    # ns1.matavnet.hu
                   # "Smart" relay host (may be null)
                    DSmail.matav.hu
 
    Timeout.queuereturn=5d  # ha 5 napig nem tudja kézbesíteni a  levelet, akkor visszapattan
              Timeout.queuewarn=4h  # ha 4 óra múlva nem megy el a levél  akkor küld egy figyelmeztetést             127.0.0.1 localhost localhost.localdomain
            192.168.1.3 bs3.bluesyst.hu bs3    # enyém linux 8-)
            145.236.224.244 mail.matav.hu      # matáv mail szerver
 
Kell még engedélyezni azt, hogy lehessen relay-ozni a sendmail-unkon keresztül, tehát lehessen levelet küldeni _rajtunk keresztül_ más domainnévhez tartozó címekre is. Ki kell tölteni az /etc/mail/ip_allow fájlt azon gépek ip címeivel, amik relay-ozhatnak rajtunk keresztül (pl: 192.168.1) tehát mindenki a mi subnet-ünkben.
          #!/bin/bash
           /usr/sbin/sendmail -q -v &  # levelek elküldése
           for i in user1 user2 user3;do  # levelek leszedése a 3 user részére
                su - $i -c "/usr/bin/fetchmail -v"  2>>/var/log/fetchmail.log
           done
           wait
 Helyezzük el a /root/levelek script hívását az /etc/ppp/ip-up.localscriptben.
 Ez fogja biztosítani, hogy minden egyes felkapcsolóđáskor egyben a levelezést is elintézzük. Nekem itt egy fakebo is szaladgál  a háttérben (paranoia rulez). Így azért nagyobb biztonságban érzem a windózokat.
 
  • Próbáljuk ki a kapcsolatot, indítsuk el a tárcsázó scriptet és figyeljük, mi történik: tail -f /var/log/messages. Ha ott olyat látunk, hogy local ip: xxx.yyy.xxx.yyy és remote ip:zzz.jjj.zzz.jjj, akkor nyert ügyünk van. Próbáljuk ki mondjuk a ping ftp.kfki.hu-t vagy böngésszünk egyet.

  • Amint jónak ítéljük a beállításokat nekiállhatunk a végső a connectd, az ipfwadm illetve a kliensek konfigurálásának.
     

    A connectd konfigurálása:
     

    Szerintem eléggé triviális a configja. A 1414-es porton hallgatózik, meg kell még adni a tárcsázó scriptet és készen is vagyunk.

    # Config file for connect/connectd
    #
    # Syntax:
    # keyword [=] value
    #
    # Keywords are case-insensitive
    # You may use the '=' sign or not
    # '#' starts comment ('til the end of the line)

    # server IP address (used by connect client)
    server 192.168.1.3

    # port (used by connect & connectd)
    PORT 1414

    #
    #### followings are only used by connectd
    #
    # ppp open script location
    ppp-open-script = /etc/ppp/ppp-open

    # run connectd in debug mode
    #debug yes

    # timeout
    # if ppp link is not used for more than timeout seconds
    # it will be closed
    timeout = 500

    # logfile (where to log open/close times)
    logfile /var/log/connectd_log

    # pidfile (where to publish pid)
    pidfile /var/run/connectd.pid

    # ppp-pidfile (where pppd publish its pid)
    ppp-pidfile /var/run/ppp0.pid
     

    Előfordulhat, hogy valaki olyan rövid ideig van fenn a neten, hogy a sendmail nem tudja elküldeni illetve a fetchmail nem tudja leszedni a leveleket. Ennek a problémának az elkerülésére szúrjuk be a következő két sort az /etc/ppp/ip-up.local elejére illetve végére:

    connect mail open
    connect mail close

    Így csak akkor bont le, ha már sikeresen végetért a levélváltás. A connect  innét   tölthető le.
     

    Az ip-maszkolás és a tűzfal szabályok konfigurálása (/etc/rc.d/rc.firewall):
     

    /sbin/ipfwadm -F -f   #minden eddigi szabályt törlünk

    /sbin/ipfwadm -F -p reject #alapértelmezett szabály, mindent eldobunk

    /sbin/ipfwadm -F -a m -S 192.168.1.0/24 -D 0.0.0.0/0 #maszkolás bekapcsolása a 192.168.1.0 subnetre

    /sbin/ipfwadm -I -a reject -W ppp0 -P tcp -D 0.0.0.0/0 1414
                                                # minden próbálkozást tiltunk
                                                # ami befelé jön és a 1414-es
                                                # portra irányul

    Igazából a harmadik sor is elég ahhoz, hogy működjék a maszkolás, de nem lehetünk eléggé paranoiásak.
    Az ftp és az irc használatához külön modulok kellenek, ezeket töltsük be minden szerver induláskor. Tegyük bele a fenti scriptbe az alábbi sorokat:

    /sbin/modprobe ip_masq_ftp
    /sbin/modprobe ip_masq_irc
    /sbin/modprobe ip_masq_raudio # esetleg realaudio

    A /etc/rc.d/rc.firewall scriptet az /etc/rc.d/rc.local-ból hívjuk meg.

    A 2.2.x-es kernel sorozathoz ipchains kell, amit hasonlóképpen kell használni, mint az ipfwadm-ot. A paraméterek különbségéről  itt lehet olvasni. Ugyanaz a funkció megvalósítása így néz ki ipchains-el:

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

    ipchains -A forward -s 192.168.1.0/24 -d 192.168.1.0/24 -j ACCEPT
    ipchains -A forward -s 127.0.0.0/8 -d 127.0.0.0/8  -j ACCEPT
    ipchains -A forward -s  192.168.1.0/24 -d 0.0.0.0/0 -j MASQ

    Beállítások a Windows klienseken:

     Ugorjunk a 'Control Panel'/'Network (Vezérlőpult/ Hálózatok' -ra.

    1. Adjunk hozzá 'TCP/IP protokollt'  ha még nem szerepel

    2. Adjunk meg IP címnek 192.168.1.x, (1 < x < 255), és állítsuk be a  netmaskot 255.255.255.0 -ra

    3. Adjuk meg a 192.168.1.3 -at (linux) az alapértelmezett átjáróként.

    4. A DNS konfiguráció alatt adjuk meg az internet szolgáltatónk DNS címeit

    5. OK, majd indítsuk újra a gépet

    6. Ping-essük meg a linuxot  'Start/Futtatás', ping 192.168.1.3

    7. Létrehozatunk még opcionálisan a C:\WINDOWS könyvtárban egy hosts nevű  fájlt. Ebben, hasonlóan a linuxhoz, felsorolhatjuk a hálózatunkban lévő gépeink nevét és címét.
     

    A wconnect kliens:
     

    Ezzel tudunk kapcsolódni a connectd-hez és ennek segítségével jutunk ki a netre. Eléggé primitív, nem tud dial on demandot, de fejlődik 8-).

        c:\wconnect\wconnect.exe /s 192.168.1.3 /u teuserneved Nyissunk egy dos ablakot és pingessünk meg valakit a külvilágban. Ha ez rendben van, akkor működik az ip-maszkolásunk. Hurrá!
    Tapasztalataim szerint kb. 20%-os sebességnövekedés volt észrevehető a mono gép+windows felállással szemben. Hát ennyi lett volna. Remélem valaki hasznát veszi.
     
     
     

    A dokumentum 8-) szabadon felhasználható elektronikus, nyomtatott vagy bármilyen formában. Szabadon módosítható, ha ezeket a sorokat benne hagyod. A leírtakat mindenki a saját felelősségére használja ! Az esetleges hibákból eredő kárért semmilyen felelősséget nem vállalalok. Tehát ha hónap végén kapsz egy 20e Ft-os telefonszámlát ne engem okolj 8-)! Egyébként pedig minden hasznos és haszontalan észrevételt szívesen fogadok ezen  a címen.
     

    1999. szeptember 06.   Fehér Sándor