IP masquerading



1. Mi is az IP masquerading?

Ez egy lehetõség, melyet a linux kernele (is) képes biztosítani számunkra. Segítségével például egy regisztrált IP-vel rendelkezõ gépen keresztül a hozzá lokális hálozaton kapcsolódó gépek számára is elérhetõvé válhat az internet szolgáltatásainak nagy része.

Az IP masquerading-et végzõ gép a belsõ háló felõl érkezõ IP csomagokat úgy továbbítja, mintha azok forrása õ maga lenne, a válaszcsomagokat pedig továbbadja a kapcsolatot valójában kezdeményezõ, belsõ hálon lévõ gép felé.


2. Egy egyszerû példa

Azt hiszem legegyszerûbb, egy példán keresztül bemutatni a szükséges beállítások elvégzésének mikéntjét.

Adott egy lokális hálozat a 192.168.1.x tartományból kiosztott, csak lokálisan érvényes IP címekkel. Emellett van egy modemes ppp kapcsolat, amely a 192.168.1.1-as lokális IP-vel ellátott gépen elérhetõ.

        |
        | ppp0 (195.70.50.1)
  +-----+-----+
  |           |  gateway, amely a masqueradinget végzi
  |           |
  +-----+-----+
        | eth0 (192.168.1.1) 
        |
    ----+--------+-------------------------+----  lokális Ethernet hálozat
                 |                         |
                 | eth0(192.168.1.2)       | eth0(192.168.1.3)
           +-----+-----+             +-----+-----+
           |           |             |           |
           |           |             |           |
           +-----------+             +-----------+

3. A beállítások

    1. Kernel oldali támogatás biztosítása
    2. Masquerading beállítása az átjáróként használt gépen
    3. Speciális eseteket kiszolgáló kernelmodulok betöltése
    4. A forwarding engedélyezése
    5. Az alapértelmezett átjáró beállítása a belsõ háló gépein


3.1. Kernel oldali támogatás biztosítása

A kernel fordítása során az alábbi opciók kiválasztása szükséges, illetve célszerû. (Az egyébként is szükséges opciókon felül!) A disztribúciók alapkernelei általában tartalmazzák ezeket.

Networking options --->

        [*] Network firewalls
        ...
        [*] IP: firewalling
        [*] IP: always defragment (required for masquerading)
        [*] IP: masquerading (NEW)
        [*] IP: ICMP masquerading (NEW)
        [*] IP: masquerading special modules support (NEW)
        <*> IP: ipautofw masq support (EXPERIMENTAL) (NEW)
        <*> IP: ipportfw masq support (EXPERIMENTAL) (NEW)
        ...


3.2. Masquerading beállítása az átjáróként használt gépen

Ehhez mindõssze két ipchains parancsot szükséges kiadnunk az átjároként használt gépen.

ipchains -P forward DENY
ipchains -A forward -j MASQ -s <belsõ háló címe>

Az elsõ tilt minden forwardingot, amit külön nem engedélyeztünk. A második pedig a lokális háló felõl engedélyezi a masqueradinget.

A fenti példánál maradva ez így néz ki:

ipchains -A forward -j MASQ -s 192.168.1.0/24

A /24 itt a 255.255.255.0 netmask rövidebb formában történõ megadása.

A beállításokat az "ipchains -L" paranccsal tekinthetjük meg, hibás beállítás esetén az "ipchains -F" kiadása után indulhatunk újra tiszta lappal.

A forward chain-nek esetünkben így kell kinéznie:

Chain forward (policy DENY):
target     prot opt     source                destination           ports
MASQ       all  ------  192.168.1.0/24        anywhere              n/a


3.3. Speciális eseteket kiszolgáló kernelmodulok betöltése

Speciális esetek alatt általánosan azokat értem, amelyekben az IP csomagokon forrás-, illetve célcímén kivül egyéb módosítás elvégzése is szükséges. Ezen módosításokat külön betölthetõ kernelmodulok végezhetik el. Ezek mindenképp modulként fognak lefordulni, és nem töltödnek be automatikusan, hisz speciális eseteket kezelnek le, amelyeket egyáltalán nem biztos, hogy szándékunkban áll kezeltetni.

Ilyen eset például, az irc-n használatos dcc kapcsolat létrehozása. A problémát az okozza, hogy a dcc kapcsolat létrehozásához az irc kliensnek egy IP címet, illetve egy kapcsolódási portszámot kell közölnie a túloldallal az irc szerveren keresztül. Ennek a lehetõsége azonban a masquerading miatt nem áll fenn. Emiatt egy speciális modulra van szükség ehhez is.

A szükséges modulok betöltése pl. az /etc/rc.d/rc.local scriptbõl célszerû.

modprobe ip_masq_ftp
modprobe ip_masq_raudio
modprobe ip_masq_irc

A modulok nevük alapján könnyedén, és egyértelmûen azonosíthatóak, de akár mindet betõlthetjük egy egyszerû for ciklussal. A modulok a /lib/modules/<kernelverzió>/ipv4/ alatt találhatóak (ip_masq_*.o).

A modulok betöltöttségét az lsmod paranccsal ellenõrizhetjük.

Ha valamely szolgáltatás nem müködik, akkor érdemes lehet a neten speciális modult keresni hozzá.

pl. ICQ modul: http://members.tripod.com/~djsf/masq-icq/

A legtöbb masq modulnak különbözõ opciók is adhatóak. Így a leírásuk elolvasása meglehetõsen ajánlott.


3.4. A forwarding engedélyezése

Alapállapotban a kernelben minden forwarding le van tiltva, így a beállított masqerading sem mûködik, amíg nem engedélyezzük az ip csomagok továbbítását. Ezt az alábbi paranccsal tehetjük meg.

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

Ugyanitt lehet ellenõrizni is a "kapcsoló" állását. (1 = engedélyezett, 0 = tiltott)

cat /proc/sys/net/ipv4/ip_forward


3.5. Az alapértelmezett átjáró beállítása a belsõ háló gépein

A lokális hálózat többi gépével csupán annyit kell tudatnunk, hogy minden 192.168.1.x címtõl eltérõ IP-t a ppp kapcsolattal rendelkezõ gépen keresztül kell megpróbálni elérnie. Azaz ez lesz számukra az alapértelmezett átjáró (default gateway).

A routing táblában az alábbi paranccsal állíthatjuk be ezt a lokális hálózat gépein:

route add default gw 192.168.1.1

A tábla megtekintése a route parancs paraméterek nélküli kiadásával lehetséges, megfelelõ beállítás esetén körülbelül eképpen festene:

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.1.0     *               255.255.255.0   U     0      0        0 eth0
127.0.0.0       *               255.0.0.0       U     0      0        0 lo
default         bubukapcje      0.0.0.0         UG    0      0        0 eth0
A bubukapcje jelen esetben a 192.168.1.1 iphez tartozó név, mely az /etc/hosts file-ban van hozzárendelve. :)

(A route -n paraméterével kizárolag ip cimeket írna ki, de a nevekkel talán szemléletesebb.)


4. A belsõ hálózat elérhetõsége

Az IP masquerading miatt a lokális gépek a külsõ hálozat felõl nem elérhetõek, ez voltaképp nagyon kellemes, hisz semminemû támadás nem érheti õket közvetlenül. Néha azonban mégis szükségét érezhetjük, hogy a belsõ hálozaton lévõ gép bizonyos szolgáltatása elérhetõ legyen kivûlrõl is. Erre biztosít lehetõséget az ún. port forwarding, azaz a gateway bizonyos portjára érkezõ kérést az képes a belsõ háló valamely gépének bizonyos portjára továbbítani.

Legyen például egy http szerver a 192.168.1.2 IP-jû gép 80-as portján, amit szeretnénk, hogy az internet felõl is elérhetõ legyen.

Ennek beállításához az ipmasqadm programra van szükségünk, ami az alábbi címrõl letölthetõ:

http://juanjox.linuxhq.com/

A gatewayen a következõ parancs kiadása szükséges:

ipmasqadm portfw -a -P tcp -L <helyi cím> <portszám> -R <távoli cím> <portszám>

Esetünkben ez eképpen fest:

ipmasqadm portfw -a -P tcp -L 195.70.50.1 80 -R 192.168.1.2 80

Eképpen az internetrõl a 195.70.50.1 (gateway) gép 80-as portjára érkezõ kérések a 192.168.1.2 címû gép 80-as portjára továbbítódnak.


5. Végszó

Ha valami megjegyzésed, vagy meglátásod van a fenti irománnyal kapcsolatban, azt a lenti mail címen jelezheted. De vedd ezt a szösszenetet annak, aminek szántam. A #linux.hu irc csatornán napjában 2-3 ember is érdeklõdik eziránt, így nem átfogó leírás készítése volt a célom, csupán egy kicsit segíteni kívántam a hozzánk forduló kezdõket ezzel.

A fentemlitett irc csatornán néha cHrLee nick alatt megtalálható vagyok. Sok sikert!

cHarley
charley@interware.hu