A FreeBSD hálózati címfordításért felelős démonprogramja, a natd(8) (Network Address Translation daemon), a beérkező nyers IP csomagokat dolgozza fel, és a helyi gépek forráscímét kicserélve visszailleszti ezeket a csomagokat a kimenő folyamba. A natd(8) mindezt úgy teszi a forrás IP-címekkel és portokkal, hogy amikor az adat visszaérkezik, akkor képes lesz megmondani a csomag eredeti küldőjét és visszaküldeni neki a választ.
A hálózati címfordítást általában az internet-kapcsolatok megosztásánál alkalmazzuk.
Az IPv4 világában egyre jobban fogyó IP-címek és az egyre növekvő számú, nagysebességre vágyó, például kábeles vagy DSL-es fogyasztók miatt az igény is egyre nagyobb az internet-kapcsolatok megosztására. Ha több számítógéppel szeretnénk egyetlen kapcsolaton és egy IP-címen keresztül kapcsolódni az internetre, akkor ehhez a natd(8) tökéletes választás.
Az esetek többségében a felhasználók egy kábeles vagy DSL vonalra csatlakoznak, melyhez egyetlen IP-cím tartozik, és ezen a gépen keresztül szeretnék elérni az internetet a helyi hálózaton levő többi gépről.
Ezt úgy tudjuk elérni, ha az internethez kapcsolódó FreeBSD-s gépet átjárónak állítjuk be. Ebben az átjáróban legalább két hálózati felületnek kell léteznie — az egyikkel az internetes útválasztóhoz, a másikkal pedig a helyi hálózathoz kapcsolódik. A belső hálózaton levő gépek egy hub vagy egy switch segítségével csatlakoznak egymáshoz.
Több módon is el tudjuk érni a belső hálózatról az internetet egy FreeBSD-s átjárón keresztül. Ebben a példában most csak olyan átjárókkal foglalkozunk, amelyekben legalább két hálózati kártya található.
Egy ehhez hasonló beállítás igen gyakori a megosztott internet-kapcsolatok esetében. A helyi hálózat egyik gépe csatlakozik az internetre. A többi gép ezen az „átjárón” keresztül éri el az internetet.
A natd(8) működéséhez
szükséges címfordítási
támogatást a GENERIC
típusú rendszermagok nem tartalmazzák,
viszont a /boot/loader.conf
megfelelő
paraméterezésével a rendszer
betöltése közben ezt hozzá tudjuk
adni:
Valamint a net.inet.ip.fw.default_to_accept
változót állítsuk az 1
értékre.
Ez utóbbi beállítást
leginkább a tűzfal és a
címfordítást végző
átjáró
próbálgatásakor érdemes
alkalmazni. Ilyenkor ugyanis az ipfw(8)
alapértelmezett módon az allow ip from
any to any
(minden forgalom engedélyezett)
szabályt követi, és nem pedig a
kevésbé barátságos deny
ip from any to any
(minden forgalom tiltott)
szabályt. A rendszer
újraindításakor így valamivel
nehezebb lesz kizárnunk magunkat a szabályok
megadása során.
Amikor viszont nincs lehetőségünk modulok használatára, vagy szeretnénk minden igényelt funkciót beépíteni a rendszermagba, akkor a rendszermag beállításait tartalmazó állományban a következőket kell megadnunk:
A fentiek mellett még ezeket a lehetőségeket tudjuk választani:
A tűzfal és a hálózati
címfordítás
beindításához a következőknek
kell az /etc/rc.conf
állományban lennie:
fxp0
" A gépet átjárónak
állítja be. Hatása megegyezik a
| |
A rendszer indításakor engedélyezi
az | |
Egy olyan előre definiált tűzfalat ad
meg, amely alapból mindent beenged. Az
| |
Megadja, hogy melyik felületen továbbítsunk csomagokat az internet felé (ez a felület csatlakozik az internetre). | |
Itt szerepel minden további paraméter, amelyet még az indításkor át kell adnunk a natd(8) démonnak. |
Amikor megadjuk ezeket a beállításokat
az /etc/rc.conf
állományban,
pontosan ugyanaz történik, mintha a natd
-interface fxp0
parancsot adtunk volna ki a rendszer
indításakor. Ez tehát manuálisan is
elindítható.
Ha túlságosan sok paramétert akarunk
egyszerre beállítani natd(8)
használatához, akkor akár egy
külön konfigurációs
állományt is megadhatunk. Ebben az esetben a
konfigurációs állományt a
következő módon kell megjelölni az
/etc/rc.conf
állományban:
Ekkor a /etc/natd.conf
állomány fogja tartalmazni a
beállításokat, soronként egyet.
Például a következő szakaszban ez lesz
a tartalma:
A konfigurációs
állományról és az
-f
opció használatával
kapcsolatban olvassuk el a natd(8) man
oldalát.
A helyi hálózaton mindegyik gépnek az RFC 1918 által megadott privát IP-címterekből származó címet kell használnia, és az alapértelmezett átjárónak mindenhol a natd démont futtató gép IP-címét kell megadni.
Például a belső hálózaton
található A
és
B
kliensek IP-címei rendre 192.168.0.2
és 192.168.0.3
, míg a natd(8)
démont futtató gép belső címe
192.168.0.1
. Az
A
és a B
kliens
alapértelmezett átjáróját a
natd gépre, vagyis a 192.168.0.1
címre kell
beállítanunk. A natd
gép külső, avagy internetes felülete
semmilyen további módosítást nem
igényel a natd(8)
működéséhez.
A natd(8) alkalmazásának hátránya, hogy a belső hálózatra csatlakozó kliensek az internetről nem érhetőek el. Tehát a helyi hálózat kliensei képesek elérni a külvilágot, de az visszafelé már nem igaz. Ez akkor jelent igazából problémát, ha az egyik belső kliensen szolgáltatásokat akarunk futtatni. A probléma egyik egyszerű megoldása, ha a natd használatával az internet felől egyszerűen átirányítunk bizonyos portokat a megfelelő belső kliensre.
Például tegyük fel, hogy az
A
kliens egy IRC szervert, míg a
B
kliens egy webszervert futtat. Ez akkor fog
működni, ha a szolgáltatásokhoz
tartozó 6667 (IRC) és 80 (web) portokat
átirányítjuk a hozzájuk
tartozó gépek felé.
Ehhez a natd(8) démonnak a
-redirect_port
paramétert kell
átadni. A pontos felírás így
néz ki:
protokoll
célIP
:célPORT
[-célPORT
]
[külsőIP
:]külsőPORT
[-külsőPORT
]
[távoliIP
[:távoliPORT
[-távoliPORT
]]]A fenti példában tehát ezt kell megadnunk:
Így az egyes külső tcp portokat átirányítjuk a belső hálózat gépei felé.
A -redirect_port
paraméternek
akár egész porttartományokat is
megadhatunk. Például a tcp
192.168.0.2:2000-3000 2000-3000
megadásával az összes 2000-től 3000-ig
terjedő port csatlakozását
leképezzük az A
kliens 2000
és 3000 közti portjaira.
Ezek a beállítások a natd(8)
közvetlen futtatásakor adhatóak meg, esetleg
az /etc/rc.conf
állományban
az natd_flags=""
opció keresztül,
vagy egy külön konfigurációs
állományban.
A többi beállítási lehetőséget a natd(8) man oldalán ismerhetjük meg.
A címek átirányítása
abban az esetben hasznos, amikor több IP-cím
áll rendelkezésünkre, de ezek egy
géphez tartoznak. Ilyenkor az natd(8) képes
a belső hálózat egyes gépeihez
saját külső IP-címet rendelni. A
natd(8) a belső hálózat kliensei
által küldött csomagokban kicseréli a
címüket a megfelelő külső
IP-címmel, illetve az ezekre a címekre
érkező forgalmat továbbítja a
megfelelő belső kliens irányába. Ezt a
megoldást statikus hálózati
címfordításnak is nevezzük.
Például a 128.1.1.2
és a 128.1.1.3
IP-címek a natd démont
futtató átjáróhoz tartoznak. A
128.1.1.1
cím
használható a natd
alapú átjáró külső
IP-címeként, miközben a 128.1.1.2
és a 128.1.1.3
címeket a belső
hálózaton elérhető A
és B
kliensek felé
közvetítjük.
A -redirect_address
felírása
tehát a következő:
helyiIP
publikusIP
helyiIP | A helyi hálózaton található kliens saját IP-címe. |
publikusIP | A klienshez tartozó megfelelő külső IP-cím. |
Az iménti példában a pontos paraméterek ezek lesznek:
A -redirect_port
opcióhoz
hasonlóan ez is megadható az
/etc/rc.conf
állományban az
natd_flags=""
beállításon keresztül vagy egy
külön konfigurációs
állományban. A címek
átirányításával nincs
szüksége a portok
átirányítására, mivel az
adott IP-címhez tartozó összes forgalmat
átirányítjuk.
A natd démont futtató gépen a külső IP-címeket aktiválni kell és a külső felületéhez kell rendelni. A rc.conf(5) man oldalon járhatunk utána, hogy mindezt hogyan is tudjuk megcsinálni.
Ha kérdése van a FreeBSD-vel kapcsolatban, a
következő címre írhat (angolul):
<questions@FreeBSD.org>.
Ha ezzel a dokumentummal kapcsolatban van kérdése, kérjük erre a címre írjon:
<gabor@FreeBSD.org>.