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.
Megjegyzés: 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:
ipfw_load="YES" ipdivert_load="YES"
Valamint a net.inet.ip.fw.default_to_accept
változót állítsuk az 1 értékre.
net.inet.ip.fw.default_to_accept="1"
Megjegyzés: 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:
options IPFIREWALL options IPDIVERT
A fentiek mellett még ezeket a lehetőségeket tudjuk választani:
options IPFIREWALL_DEFAULT_TO_ACCEPT options IPFIREWALL_VERBOSE
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:
gateway_enable="YES" firewall_enable="YES" firewall_type="OPEN" natd_enable="YES" natd_interface="fxp0" natd_flags=""
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ó.
Megjegyzés: 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:
natd_flags="-f /etc/natd.conf"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:
redirect_port tcp 192.168.0.2:6667 6667 redirect_port tcp 192.168.0.3:80 80A 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:
-redirect_port 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:
-redirect_port tcp 192.168.0.2:6667 6667 -redirect_port tcp 192.168.0.3:80 80
Í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ő:
-redirect_address 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:
-redirect_address 192.168.0.2 128.1.1.2 -redirect_address 192.168.0.3 128.1.1.3
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): <freebsd-questions@FreeBSD.org>.
Ha ezzel a dokumentummal kapcsolatban van kérdése,
kérjük erre a címre írjon: <gabor@FreeBSD.org>.