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:
A kernelbe a következők kellenek:
- Valamilyen linux 8-)
- 2.0.x vagy nagyobb kernel kernel innen letölthető
- ipfwadm 2.0.x kernelhez vagy ipchains a 2.2.x-hez
- Jól beállított ip címek, a helyi hálózaton
- Jól működő kapcsolat az internet szolgáltatóval
* Prompt for development and/or incomplete code/drivers
CONFIG_EXPERIMENTAL* Enable loadable module support- Ez teszi lehetővé a maszkolás későbbi kiválasztását, egyébként nem jelenik meg a menüben
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
- javasolt2.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
- Nézzük meg, hogy van e pppd installálva (which pppd, vagy rpm -qa | grep pppd)
Tegyük setuid-ossá, ha még nem az (chmod +s /usr/sbin/pppd)
- Készítsünk el egy scriptet, amivel a felkapcsolódást intézzük.
#!/bin/bash
exec /usr/sbin/pppd /dev/modem 115200 \
usernev * titok
connect "/usr/sbin/chat \
'' ATZ \
'' ATDT0651201201 \
CONNECT 'Kapcsolat!'" \
noauth noipdefault lock crtscts defaultroute asyncmap 0 user usernev
ISDN kapcsolat esetén , nem reklám, a matáv PAP authentikációt használ.
Ezért kell kitölteni az /etc/ppp/pap-secrets fájlt az alábbi módon:# Secrets for authentication using PAP
# client server secret IP addresses
- Ellenőrizzük az /etc/ppp/options fájlt. A /etc/ppp/ppp-open fájlban megadott opciók az /etc/ppp/options fájlban is megadhatók. A connectd daemon használatához kell még egy -detach opció is.
Az /etc/ppp/ip-up.local scriptet hozzuk létre és írjuk bele a következőt is:
kill -SIGUSR1 `cat /var/run/connectd.pid`
Ez küld egy szignált a connectd-nek, hogy felépült a ppp kapcsolat. A szerző szerint, ha valaki tud jobb megoldást, írja meg neki 8-).
nameserver 145.236.224.248 # ns0.matavnet.hu
- Töltsük fel az /etc/resolv.conf fájlt a szolgáltatónk name servereinek ip címeivel:
nameserver 145.236.224.249 # ns1.matavnet.hu
- Írjuk az /etc/host-ba, hogy order hosts, bind ezzel megmondjuk, hogy először a hosts fájlban keresgélje a címeket, csak azután forduljon a névszerverekhez.
# "Smart" relay host (may be null)
- Tegyünk fel egy smtp (sendmail, smail) és egy pop3 (cucipop, qpopper), kinek mi tetszik, szervert. Ezen keresztül érik majd el felhasználóink az általunk letöltött leveleket és tudnak küldeni általunk. Állítsuk be a sendmailt a következő módon (/etc/sendmail.cf):
DSmail.matav.huTimeout.queuewarn=4h # ha 4 óra múlva nem megy el a levél akkor küld egy figyelmeztetést
Timeout.queuereturn=5d # ha 5 napig nem tudja kézbesíteni a levelet, akkor visszapattan127.0.0.1 localhost localhost.localdomain
Belefutottam egy hibába: A sendmail folyton azért nyavajgott, hogy nem találja a mail.matav.hu-t és visszadobta a leveleket. Persze, hogy nem, mert nincs mindig on-line, hiszen az a feladata, hogyha van az internettel kapcsolat, _akkor_ küldje el a leveleket. A megoldás, némi archívum turkálás után 8-), az /etc/hosts-ba fel kell venni a mail.matav.hu-t és megszűnik a probléma.
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
- Levelek leszedése és küldése a következő scripttel történik (/root/levelek):
/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
waitHelyezzü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ányulIgazá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 realaudioA /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 MASQBeá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
- Készítsünk egy wconnect könyvtárat
- Másoljuk bele és bontsuk ki a cuccokat
- A kettő darab .dll másoljuk a C:\WINNT\System32 könytárba
- Készítsünk egy parancsikont:
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á!
- Ezután próbáljuk ki a kapcsolatot, figyeljük a debug és server status ablakokat.
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