ot Fahri Hasan(22-01-2017)

reiting (24)   [ dobre ]  [ zle ]

Printer Friendly Variant za otpechatvane

Podrobno rukovodstvo za ipfw nat

Originalna statiia: Podrobnoe rukovodstvo po ipfw nat
Avtor: terminus

Po stranno stechenie na obstoiatelstvata v internet se namirat mnogo malko rukovodstva, koito opisvat vuzmozhnostite i stsenarii za prilozhenie na ipfw nat, vupreki fakta, che se poddurzha ot dulgo vreme - FreeBSD versiia 7.0. Nai-obidno e, che man sektsiiata posvetena na ipfw nat izglezhda glupavo. I v deistvitelnost ot tam zapochva da chete vseki, koito iska da nastroi "in-kernel nat", i tova e estestveno - ne vseki razbira. V rezultat na tova horata preminavat kum natd, niakoi ludi glavi dori zapochvat da izpolzvat alternativni zashtitni steni kato pf/ipf. TSelta na tova rukovodstvo e podrobno opisanie na ipfw nat i izpolzvaneto na tozi instrument v razlichni mrezhovi konfiguratsii. V tazi statiia shte ima mnogo smislovi prepratki kum prekrasnata statiia ot Vadim Goncharov (nuclight), kudeto podrobno opisa vutreshnata struktura na ipfw i mrezhoviia stek na FreeBSD.

Primerite v moiata statiia sa probvani na FreeBSD 7.2-STABLE.


Predi vsichko e neobhodimo da se opishe detailno dvizhenieto na trafika v mrezhoviia steka na FreeBSD. Bez tova razbirane tsialostnata kartina na "tova, koeto pravim", niama da bude pulna. Na figuri 1-a i 1-b e pokazana hipotetichna sistema na dva mrezhovi adaptera fxp0 i fxp1. Shema 1-a pokazva fizicheskata vruzka, a shema 1-b e logicheskata vruzka. Nas ni interesuva poveche logicheskata - na neia shte vidim, che vuv vsiaka mrezhova vruzka trafika ima dva putia - IN i OUT. Kakto lesno mozhe da se dosetite, prez put IN postupva trafik, idvasht kum nas ot mrezhata, a prez put OUT preminava trafika, koito e adresiran da napusne mrezhata, kum koiato e svurzana mrezhoviiat adapter. Po tozi nachin, vrushtaiki se kum primera na sistema s dve mrezhovi karti, mozhem da vidim, che tia ima chetiri putia za trafika. Kogato dobavim kum sistemata dopulnitelni mrezhovi adapteri shemata se razshiriava.

No predishnata shema ne e glavna. Vsushtnost shemata na trafika prez mrezhoviia stek na FreeBSD ima samo edna logicheska strana s putishta IN i OUT, nezavisimo ot broia na mrezhovi adapteri. Prosto pri dvizhenieto na trafika prez steka, operatsionnata sistema izbira samostoiatelno put IN i/ili OUT da bude zadeistvan pri predavaneto na trafika. V suotvetstvie s tova, v paketa se namira vutreshna informatsiia (hedur) za mrezhovata podsistema, dobaviat se otmetki, ukazvashti prez koi put IN (konkreten mrezhovi adapter) e doshul trafika i chrez koi OUT mrezhovi adapter shte izleze ot mashinata.



Ukazanite putishta IN i OUT sa vazhni, zashtoto pri postupvaneto na mrezhoviia trafika v tiah, toi popadat v zashtitnata stena, kudeto preminava prez pravila za filtrirane na ipfw. Po tozi nachin, trafika preminavasht prez marshrutizatora, popada v pravilata na ipfw dva puti – purvo v put IN na mrezhovi adapter, chrez koito e bil poluchen, i v put OUT na mrezhovi adapter, chrez koito shte bude prepredaden (sega ne razglezhdame sluchaia s vklyuchena filtratsiia na nivo Ethernet - v tozi sluchai, trafika preminava prez ipfw chetiri puti). Kakto izhodiashtiia trafik ot samiia marshrutizator, ima svoi put OUT, taka i trafika adresiran neposredstveno kum marshrutizatora, idva prez svoi put IN.

Po-dolu predstaviam chast ot statiiata na Vadim Goncharov – chastta v koiato se obiasniava dvizhenieto na trafika chrez shema 2. Hubavoto na tozi avtor e, che v statiiata e vklyuchi tova mnogo, mnogo podrobno obiasnenie.

Dopuskame, che naborut ot pravilata pri nas e sledniiat:

ipfw add 1 deny tcp from any to any 135,445
ipfw add 2 divert 8668 all from any to any via ext0
ipfw add 3 count icmp from any to any
ipfw add 4 allow all from any to any
# v 65535 po podrazbirane deny

Kogato paketa preminava prez mashinata, sistemata prikrepia kum sudurzhanieto mu dopulnitelna informatsiia, vidimo s tcpdump. Naprimer na koi interfeis e bil poluchen, chrez koi se izprashta i t.n. Tova mozhe da se proveri sus suotvetnite optsii v pravilata na ipfw, na risunkata sa pokazani mestata, kudeto shte srabotiat suotvetnite ukazaniia in/out i recv/xmit za mrezhata.

Da razgledame po-podrobno tochkite s funktsii, koito se povikvat v iadroto na rutera - shema 2. Vsushtnost, tochkite s funktsii na figurata po-gore niamat dve strani, tia e samo edna, i se razlichava po parametrite - obraboteni ot mrezhovata karta.

Tova oznachava, che paketa na vhoda se predava na draivera v ether_demux(), sled tova popada v ip_input(), v tochka (2), kudeto se izpulniavat osnovni proverki za korektnostta na paketa, sled koeto paketa pristiga v ipfw - funktsiia ipfw_chk(). Dopuskame che, pravilata sa prosti, bez zadeistvaneto na drugi podsistemi. Togava, sled kato bude vurnat ot ipfw, paketa produlzhava dvizhenieto si po ip_input(), koiato sledi, dali paketa e prednaznachen za nashata mashina ("to me" ot gledna tochka na ipfw), ili niakoi drug. Ako e za nas, paketa otiva do tochkata (3), kudeto shte se reshi na koi soket i koia programa shte go izprati.

Ako paketa ne e prednaznachen za nas, ot ip_input() shte otide kum tochkata (4), kudeto ip_forward() shte proveri v sysctl, pozvoleno li e prenasochvane, shte snizhi TTL i drugi deistviia, sled koeto paketa idva v tochka (6), funktsiia ip_output(). Tuk popada direktno, i kogato niakoia programa reshi da izprati neshto kum mrezhata i predade danni kum iadroto.

Funktsiia ip_output() purvo proveriava v tablitsata za marshrutizatsiia i opredelia shlyuz, i na koi interfeis se namira. S tazi informatsiia, paketa se predava otnovo v ipfw i preminava prez tsialata poreditsata ot pravila. Posle izliza ot ipfw_chk() i se vrushta v ip_output(), ako iadroto e kompilirano sus suotvetnata optsiia, se proveriava dali ne e bil promenen v ipfw_chk() - ako e da, otnovo se proveriava tablitsata za marshrutizatsiia, za da se poluchi MAC adresa na noviia shlyuz. Sled tova v tochkata (7) paketa napuska ip_output() i se predava po- nadolu v Layer 2, i kum draivera na interfeisa.

Tova beshe vsichko v sluchaia s prostite pravila na zashtitnata stena. Sega da predpolozhim, che tam se poiaviava divert, da razgledame primera na goreopisanite pravila. Paket, koito shte otide v internet na port 80, kogato pristigne na vutreshniia interfeis v tochka (1), preminava purvonachalna ip_input() proverka v (2), predava se v ipfw_chk() i zapochva proverka po pravilata. Toi ne popada v 1-vo pravilo, pod 2-ro sushto, tam ima interfeis na imeto int0, pravilo 3 otnovo ne srabotva, no pravilo 4 podhozhda na vsichki paketi, i toi izliza ot ipfw_chk() i se vrushta v ip_input(). Tam se iziasniava, kude v internet e prednaznachen da otide, sledovatelno paketa popada v tochkata (4) i sled tova (6), kudeto ip_output() opredelia adresa na shlyuza i che interfeisut shte e ext0, s tazi informatsiia paketa popada otnovo v ipfw_chk() i nanovo preminava po pravilata. Pravilo 1 otnovo ne se vpisva, no uslovieto na pravilo 2 srabotva - "via ext0, premini prez interfeis ext0 v pravilnoto destinatsiia".

I tuk raboti divert - paketa ot ipfw_chk() se predava v tochka (8), v podsistemata divert, s predvaritelno prikrepena metainformatsiia s posoka (out), interfeis (ext0) i nomera na pravilo 2. Podsistema divert predava paketa v ukazaniia v praviloto port (8668), na koito v nashiiat sluchai raboti natd. Toi obrabotva paketa, metainformatsiiata sushtoto i vrushta promeneniia paket v podsistema divert, kakto sledva (taka postupvat povecheto divert demoni, vupreki che vseki ot tiah mozhe da promeni tazi informatsiia, i paketa shte bude izpraten na drugo miasto).

Podsistemata divert prehvurlia polucheniia paket ot natd ot tochki (9) v tochkata (6). Oburnete vnimanie - paketa popada v ip_output() OTNOVO! Tova e neobhodimo, zashtoto demonut mozhe da vurne paketa s napulno razlichen adres ili dori da suzdadete nov paket. No v nashiia sluchai, paketa nosi divert tag, metainformatsiia, nai-vazhnata chast ot koiato e nomera na praviloto. Pri vlizane v ipfw_chk() paketa purvoto se proveriava za nalichieto na tozi marker. Ako bude otkrit i sudurzha nomer na pravilo (v sluchaia 2), ipfw_chk() propuska proverkata na pravila 1 i 2, i zapochva s tsifrata 2 + 1, t.e. 3 (ako proverkata na paketa zapochne ot praviloto s ukazaniiat nomer, a ne ot sledvashtoto, toi otnovo shte popadne na divert, t.e. shte se poluchi bezkraen tsikul).

Na tozi etap paketa produlzhava dvizhenieto po pravilo 3 i sled tova otiva v tochka (7) v mrezhata. Po tozi nachin, vupreki fakta, che paketa e popadnal v ip_output() dva puti, ot gledna tochka na potrebitelia tova izglezhda, siakash paketa e bil tam vednuzh i ne e izlizal izvun zashtitnata stena - prosto na pravilo 2 se poluchava magicheski nachin za promiana adresa i porta.

Po analogichen nachin, paketa koito se vrushta ot internet na interfeis ext0, preminava prez mashinata po putia (1) - (2) - nachaloto na ipfw_chk() - pravilo 1 - pravilo 2 – (8) - divert - natd - (9) - (2) - proverka v ipfw_chk() - pravilo 3 - pravilo 4 - (4) - (6) - nachaloto na ipfw_chk() - pravilo 1 - pravilo 2 - pravilo3 - pravilo 4 - (7) - izprashtane prez interfeis int0.

Podobno e povedenieto na paketa sled obrabotka ot ipfw v druga podsistema – to ne e unikalno za divert, tova e obshta shema na rabota na FreeBSD steka. Naprimer, deistviia pipe i queue v dummynet predavat paketa v netgraph (i taka se poiaviava v 7.0 ipfw nat) deistva na tozi printsip. Razlikata obache e, che v tazi podsistema paketa ostava v iadroto, ne se predava na demon. Zatova na purvo miasto v po-gornata podsistema vmesto nomera na praviloto se zapazva pulniiat ukazatel, i paketa se vrushta neposredstveno kum sledvashtoto pravilo, dazhe i da ima sushtiiat nomer. Na vtoro miasto, za takiva podsistemi deistva nastroikata one_pass v sysctl - ako e vklyuchena, pri povtorno vlizane na paketa v ipfw, sled zavrushtaneto si ot podsistema dummynet (netgraph), ipfw_chk() vednaga vrushta paketa bez da premine prez pravilata, siakash kum paketa e prilozhen allow. Tova povedenie pozvoliava oprostiavane pravilata na zashtitnata stena, kogato e izvestno, ako paketa popadne v trubata (pipe), toi se otpravia napred i ne e neobhodimo sled vsiako pipe pravilo da se postavia allow (za da ne popadne paketa v sledvashto pravilo i sledvashtite pipe/queue). Ako konfiguratsiiata iziskva, purvo triabva da se ogranichi trafika i sled tova da se razberat slozhnite iziskvaniia, za niakoi shte bude razresheno, a za niakoi zabraneno, za oprostiavaneto na pravilata, pravilniiat nabor shte bude vklyuchvane na one_pass - vmesto allow, do pipe pravilata, bi triabvalo da se napravi skipto.

I taka, kakto veche beshe kazano, paketa preminava prez poreditsata ot pravila posledovatelno, vuv vuzhodiasht red na pravilata. Poreditsata ot pravilata mozhe da se razglezhda kato tablitsa s tri koloni: nomer, deistvie (i negovite parametri, kato log), kakto i usloviiata, pri koito edin paket otgovaria na praviloto (naprimer ot adres 1.1.1.1 do adres 2.2.2.2). Tablitsata se razglezhda otgore nadolu, paketa se sravniava s usloviiata. Pri purvo suvpadenie po stulbitsata, se izpulniava deistvie i spirame nablyudenieto ...

Veche znaem, v kakva posledovatelnost izliza paketa prez mrezhoviia stek na FreeBSD, nie mozhem da pristupim kum izuchavane pravilata na ipfw nat.

Mehanizma ipfw nat mozhe da se razgleda kato svoeobrazen filtur – preobrazuvatel na trafika. V zavisimost ot tova kak e nastroen nat i ot tova kakvi IP adresi na podatel i poluchatel, shte budat predadeni chrez nego, nat shte preobrazuva IP adresa na podatelia ili IP adresa na poluchatelia, ili prosto shte othvurli paketa. Vazhno e da zapomnite, che nat razdelia trafika na izhodiasht (takuv, koito se maskira) i vhodiasht (takuv, koito se demaskira) v zavisimost ot tova prez kakuv put (OUT ili IN) e bil poluchen. Taka che, trafika popadnal v nat prez put OUT triabva da se maskira (zamenia se IP adresa na podatelia s IP adresa na nat mashinata), a trafikut koito idva prez put IN da se demaskira. Za da razberem tova povedenie, mozhe da izpolzvate direktivata revers - togava tsialoto povedenie shte se promeni i mozhe da bude pusnat nat na vunshniia mrezhovi interfeis (koito sledi v internet) i na vutreshniia (koito sledi v lokalnata mrezha). Podrobno opisanie za tova kak raboti mehanizma na nat, veroiatno e izlishno. Za povedenieto na mehanizma na nat vliiae nastroikata na parametura one_pass - v zavisimost ot nego, trafika preminavasht prez nat mozhe da se vurne v zashtitnata stena, ot kudeto e bil izpraten v nat ili da izleze ot zashtitnata stena. Tazi guvkavost pozvoliava da se napraviat mnogo interesni neshta s trafika. ipfw nat vi pozvoliava da startirate mnogo svoite kopiia, vseki ot koito ima svoi nat tablitsi i nastroiki. Ne triabva, da se obediniavat niakolko kopiia, za da se izpolzva obshtata nat tablitsa.

Vuzmozhnosti i optsii za konfigurirane na ipfw nat

ipfw nat e baziran na koda na bibliotekata libalias. Na neia e izgraden kakto natd taka i ng_nat. Funktsionalnostta na libalias e prenesena v ipfw nat, prakticheski napulno povtaria vsichko, koeto ima v natd s izklyuchenie na niakoi spetsifichni neshta. Za suzhalenie man stranitsata za ipfw nat dava mnogo oskudno opisanie na vuzmozhnostite mu, za tova pri izuchavane na optsiite za konfigurirane, mozhe da izpolzvate man stranitsata na natd.

man natd

Primeri i stsenarii za prilozhenie na ipfw nat mehanizma

Sled kato se zapoznahme s printsipa na predvizhvane na trafika prez steka, kakto i optsiite za konfigurirane mehanizma na ipfw nat, mozhe da pristupim kum suzdavaneto na pravila i da razgledame tiahnata rabota. Dolnite primeri, shte budat osnovani na printsipa "zadacha - reshenie", i taka na tozi printsip postepenno, shte se uslozhniava konfiguratsiiata s podrobno opisanie i shte budat obiasneni predpolagaemite resheniia. Ako ima mneniia, spomagashti po-lesno da se razbere izuchavaniia material, v tova chislo i primeri, mogat da se izpolzvat v rabotata.

Vklyuchvane na ipfw nat i Dummynet

Prekompilirane na iadroto s dopulnitelnite parametri:
options IPFIREWALL
options IPFIREWALL_VERBOSE
options IPFIREWALL_VERBOSE_LIMIT=50
options IPFIREWALL_nat
options LIBALIAS
options ROUTETABLES=2
options DUMMYNET
options HZ="1000"

Ili vklyuchvane bez prekompilirane (no s po-malko vuzmozhnosti za konfigurirane)

/etc/rc.conf
firewall_nat_enable="YES"
dummynet_enable="YES"


Primer 1

Prost sluchai: ruter s dva mrezhovi adaptera vklyucheni v lokalnata mrezha i v internet. Adres na lokalnata mrezha 192.168.1.1 (mrezhovi adapter fxp0), adres v internet 1.2.3.4 (mrezhovi adapter em0).
Zadacha: „razdavane na internet“ za lokalna mrezha, obezpechen pri povikvane na port za vutreshni adresi, razreshavane preminavaneto na trafika prez otdelnite portove na tozi rutera.


Konfiguratsiia:

/etc/rc.conf
gateway_enable="YES"
ifconfig_em0="inet 1.2.3.4 netmask 255.255.255.0 -rxcsum"
ifconfig_fxp0="inet 192.168.1.1 netmask 255.255.255.0"
defaultrouter="1.2.3.254"
firewall_enable="YES"
# Belezhka: razgledaite /etc/defaults/rc.conf i /etc/rc.firewall vuv FreeBSD 11
firewall_type="/etc/firewall"

/etc/sysctl.conf

net.inet.ip.fw.one_pass=1

/etc/firewall
# pravila razreshavashti trafik prez lokalniia interfeis lo0
# shte budat dobaveni avtomatichno pri startirane na zashtitnata stena
# ipfw add 100 allow ip from any to any via lo0
# ipfw add 200 deny ip from any to 127.0.0.0/8
# ipfw add 300 deny ip from 127.0.0.0/8 to any

# razreshavame vsichko prez interfeisa za lokalnata mrezha
ipfw add 1040 allow ip from any to any via fxp0

# boim se ot neizvestni
ipfw add 1050 deny ip from any to 192.168.0.0/16 in recv em0
ipfw add 1060 deny ip from 192.168.0.0/16 to any in recv em0
ipfw add 1070 deny ip from any to 172.16.0.0/12 in recv em0
ipfw add 1080 deny ip from 172.16.0.0/12 to any in recv em0
ipfw add 1090 deny ip from any to 10.0.0.0/8 in recv em0
ipfw add 10100 deny ip from 10.0.0.0/8 to any in recv em0
ipfw add 10110 deny ip from any to 169.254.0.0/16 in recv em0
ipfw add 10120 deny ip from 169.254.0.0/16 to any in recv em0

# nastroika na nat.
# optsiiata za prenos na nov red "\", triabva da se otstrani, vsichko triabva da e na edin red
# optsiite redirect_port sa primerni - kak da se napravi "prenasochvane na port"
ipfw nat 1 config log if em0 reset same_ports deny_in \
redirect_port tcp 1.2.3.4:6881 6881 \
redirect_port udp 1.2.3.4:4444 4444 \
redirect_port tcp 192.168.1.24:25 25

# prenasochvame vsichko, koeto preminava prez vunshniia interfeis kum nat
ipfw add 10130 nat 1 ip from any to any via em0

# boim se ot neizvestni
# Belezhka: vuv FreeBSD 11 modula ipfw e kompiliran, po podrazbirane s deny
ipfw add 65534 deny all from any to any


Detailno opisanie za preminavaneto na trafika prez zashtitnata stena v dadenata konfiguratsiia:

Za rutera:

Trafika initsializiran neposredstveno ot rutera v tochka (5) - risunka 2, preminava v tochka (6). Popadnal v ip_output(), shte mu bude prisvoen shlyuz po podrazbirane s mrezhovi interfeis em0, prez koito e dluzhen da izleze v internet (via em0, po-tochno xmit em0). Kogato trafika vleze v zashtitnata stena, zapochva da minava prez poreditsata ot pravila. Trafika idva do pravilo 10130 i biva predaden v tochka (8), ako se obrabotva v nat kato izhodiasht trafik, shte postupi v put OUT. V podsistema nat za trafika, shte bude suzdaden zapis za suotvetstvie v tablitsata za suedineniia, kakto sledva: lokalno_IP:port otdalecheno_IP:port. Posle v tochka (9) trafika izliza ot podsistema nat i se predava za obrabotka v tochka (6), otnovo popada v ip_output(). Ako one_pass ima stoinost 1 (vklyuchen), trafika izliza ot ipfw (siakash kum nego e prilozheno pravilo allow) i otiva v internet prez em0.

Trafika, koito se vrushta kato otgovor, otiva v tochka (1) i popada v put IN, imeto na tozi mrezhoviia interfeis e em0 (via em0, po-tochno recv em0), prez koito e poluchen. Po-natatuk trafika otiva v tochka (2) i popada vuv funktsiia ip_input(), posle otiva v zashtitnata stena i zapochva da minava prez poreditsata ot pravila. Trafika idva do pravilo 10130 i biva predaden v tochka (8), ako se obrabotva v nat kato vhodiasht trafik, shte postupi v put IN. V podsistema nat za trafika, shte bude nameren po-rano suzdadeniia zapis za suotvetstvie ot tablitsata za suedineniia, kakto sledva: lokalno_IP:port otdalecheno_IP:port, sled koeto shte se demaskira (v tozi sluchai niama da ima deistvitelni izmenia, tui kato maskirane/ demaskirane na adresa e edno i sushto – lokalen/1.2.3.4). Posle v tochka (9) trafika izliza ot podsistema nat i se predava za obrabotka v tochka (2), otnovo popada v ip_input(). Ako one_pass ima stoinost 1 (vklyuchen), trafika izliza ot ipfw (siakash kum nego e prilozheno pravilo allow) i otiva v lokalniia soket, na koito raboti programa za ranno initsializirane na suedineniiata.

Ako ot internet doide trafik, za koito niama zapis za suotvetstvie v tablitsata za suedineniia, pri postupvane v nat, toi shte bude othvurlen, siakash nat e nastroen s parametur deny_in.

Ako ot internet pristigne trafik adresiran za tcp 1.2.3.4:6881, toi shte doide do tochka (8) i shte popadne v nat, kudeto shte bude uspeshno demaskiran, v tablitsata za nego shte ima statichen zapis suotvetstvasht na 1.2.3.4:6881 otdalecheno_IP:otdalechen_port. Posle kakto e v sluchaia s trafik, koito se vrushta kato otgovor ot internet, shte bude priet i shte postupi v lokalniia soket na port 6881. Suotvetno, izhodiashtiia trafik ot tozi soket preminava prez statichnoto pravilo i shte bude obraboten uspeshno, kakto e v sluchaia s izhodiashtiia trafik kum internet.

Za mrezha 192.168.1.0/24:

Trafika initsializiran ot host 192.168.1.56, ot mrezha 192.168.1.0/24, shte vleze v rutera prez mrezhovi interfeis fxp0, v tochka (1) poluchava tag na mrezhovi interfeis fxp0 (via fxp0, po-tochno recv fxp0), prez koito e poluchen. Posle trafika otiva v tochka (2) i popada vuv funktsiia ip_input(), sled tova vliza v zashtitnata stena i zapochva da minava prez poreditsata ot pravila. Trafika idva do pravilo 1040 i se predava v put IN na zashtitnata stena, i popada obratno v ip_input(), kudeto shte bude prieto reshenie, che toi ne e za nas, sledovatelno triabva da se izprati v tochka (4), vuv funktsiia ip_forward(). Kogato popadne v ip_forward(), shte se snizhi TTL-a na IP trafika, osven tova shte se proveri, dali e razresheno izvurshvaneto na marshrutizatsiia (ustanoviavane na suotvetnite stoinost v sysctl, koito se prilagat v rc.conf chrez gateway_enable="YES"), togava shte bude predaden v tochka (6), vuv funktsiia ip_output(). Popadnal v ip_output() na nego shte bude prisvoen shlyuz po podrazbirane i tag na mrezhovi interfeis em0, prez koito e dluzhen da izleze v internet (via em0, po-tochno xmit em0). Trafika vliza v zashtitnata stena i zapochva da minava prez poreditsata ot pravila. Trafika idva do pravilo 10130 i biva predaden v tochka (8), ako se obrabotva v nat kato izhodiasht trafik, shte postupi v put OUT. V podsistema nat za trafika, shte bude suzdaden zapis za suotvetstvie v tablitsata za suedineniia, kakto sledva: 192.168.1.56:port 1.2.3.4:port otdalecheno_IP:port, a originalniia adres na podatelia (192.168.1.56) v hedura, shte bude zamenen s IP adresa ukazan v parametur „if“ v nastroika nat. Posle v tochka (9) trafika izliza ot podsistema nat i se predava za obrabotka v tochka (6), otnovo popada v ip_output(). Ako one_pass ima stoinost 1 (vklyuchen), trafika izliza ot ipfw (siakash kum nego e prilozheno pravilo allow) i otiva v internet prez em0 s IP adres na podatel 1.2.3.4.

Trafika, koito se vrushta kato otgovor, otiva v tochka (1) i popada v put IN, imeto na tozi mrezhoviia interfeis e em0 (via em0, po-tochno recv em0), prez koito e poluchen. Po-natatuk trafika otiva v tochka (2) i popada vuv funktsiia ip_input(), posle otiva v zashtitnata stena i zapochva da minava prez poreditsata ot pravila. Trafika idva do pravilo 10130 i biva predaden v tochka (8), ako se obrabotva v nat kato vhodiasht trafik, shte postupi v put IN. V podsistema nat za trafika, shte bude nameren po-rano suzdadeniia zapis za suotvetstvie ot tablitsata za suedineniia, kakto sledva: 192.168.1.56:port 1.2.3.4:port otdalecheno_IP:port, sled koeto shte se demaskira – adresa na poluchatelia v hedura, shte bude zamenen ot 1.2.3.4 na 192.168.1.56. Posle v tochka (9) trafika izliza ot podsistema nat i se predava za obrabotka v tochka (2), otnovo popada v ip_input(). Ako one_pass ima stoinost 1 (vklyuchen), trafika izliza ot put IN na zashtitnata stena (siakash kum nego e prilozheno pravilo allow) i popada obratno v ip_input(), kudeto shte bude prieto reshenie, che toi ne e za nas, sledovatelno triabva da se izprati v tochka (4), vuv funktsiia ip_forward(). Kogato popadne v ip_forward(), shte se snizhi TTL-a na IP trafika, osven tova shte se proveri, dali e razresheno izvurshvaneto na marshrutizatsiia (ustanoviavane na suotvetnite stoinost v sysctl, koito se prilagat v rc.conf chrez gateway_enable="YES"), togava shte bude predaden v tochka (6), vuv funktsiia ip_output(). Popadnal v ip_output() na nego shte bude prisvoen shlyuz po podrazbirane i tag na mrezhovi interfeis fxp0, prez koito e dluzhen da otidete v lokalnata mrezha (via fxp0, po-tochno xmit fxp0). Trafika vliza v zashtitnata stena i zapochva da minava prez poreditsata ot pravila. Trafika idva do pravilo 1040. Posle tozi trafik izliza ot ipfw i otiva v lokalnata mrezha prez fxp0 s IP adresa na poluchatelia 192.168.1.56.

Ako ot internet doide trafik, za koito niama zapis za suotvetstvie v tablitsata za suedineniia, pri postupvane v nat, toi shte bude othvurlen, siakash nat e nastroen s parametur deny_in.

Ako ot internet pristigne trafik adresiran za tcp 1.2.3.4:25, toi shte doide do tochka (8) i shte popadne v nat, kudeto shte bude uspeshno demaskiran, v tablitsata za nego shte ima statichen zapis suotvetstvasht na 192.168.1.24:25 1.2.3.4:25 predpochitan_IP:predpochitan_port. Posle kakto e v sluchaia s trafika, koito se vrushta kato otgovor ot internet, shte bude priet i shte premine po sushtiia marshrut prez IN i OUT, shte otide v lokalnata mrezha na host s IP 192.168.1.24. Suotvetno, izhodiashtiia trafik ot IP 192.168.1.24, preminava prez statichnoto pravilo i shte bude obraboten uspeshno, kakto e v sluchaia s izhodiashtiia trafik kum internet.

Nadolu pri razglezhdaneto na drugite konfiguratsii, az poveche niama da opisvam detailno vsichki sluchai. Za razbiraneto na tozi mehanizum, dolnoto opisanie shte bude dostatuchno i mozhe da preminem kum ostanalite konfiguratsii. Detailnite opisaniia shte budat tam, kudeto e neobhodimo.

Primer 2

Edin po-slozhen sluchai: ruter s dva mrezhovi adaptera vklyucheni v lokalnata mrezha i v internet. Adres na lokalnata mrezha 192.168.1.1 (mrezhovi adapter fxp0), adres v internet 1.2.3.4 i 1.2.3.5 (mrezhovi adapter em0).

Zadacha: „razdavane na internet“ za lokalna mrezha, obezpechen pri povikvane na port za vutreshni adresi, razreshavane preminavaneto na trafika prez otdelnite portove na tozi rutera, a glavno – izpolzvane na sheipur Dummynet, za da osiguri spravedlivo razpredelenie na propuskatelnata sposobnost mezhdu klientite v lokalnata mrezha. Da se osiguri prenasochvane na tseliia trafik kum 1.2.3.5 na 192.168.1.36 s izpolzvane na redirect_addr.



/etc/rc.conf


gateway_enable="YES"
ifconfig_em0="inet 1.2.3.4 netmask 255.255.255.0 -rxcsum"
ifconfig_em0_alias0="inet 1.2.3.5 netmask 255.255.255.255"
ifconfig_fxp0="inet 192.168.1.1 netmask 255.255.255.0"
defaultrouter="1.2.3.254"
firewall_enable="YES"
firewall_type="/etc/firewall"


/etc/sysctl.conf

net.inet.ip.fw.one_pass=0


/etc/firewall

ipfw add 1040 allow ip from any to any via fxp0

ipfw add 1050 deny ip from any to 192.168.0.0/16 in recv em0
ipfw add 1060 deny ip from 192.168.0.0/16 to any in recv em0
ipfw add 1070 deny ip from any to 172.16.0.0/12 in recv em0
ipfw add 1080 deny ip from 172.16.0.0/12 to any in recv em0
ipfw add 1090 deny ip from any to 10.0.0.0/8 in recv em0
ipfw add 10100 deny ip from 10.0.0.0/8 to any in recv em0
ipfw add 10110 deny ip from any to 169.254.0.0/16 in recv em0
ipfw add 10120 deny ip from 169.254.0.0/16 to any in recv em0

ipfw pipe 1 config bw 10Mbit/s queue 60 gred 0.002/10/30/0.1
ipfw queue 1 config pipe 1 queue 60 mask src-ip 0xffffffff gred 0.002/10/30/0.1

ipfw pipe 2 config bw 10Mbit/s queue 60 gred 0.002/10/30/0.1
ipfw queue 2 config pipe 2 queue 60 mask dst-ip 0xffffffff gred 0.002/10/30/0.1

ipfw nat 1 config log if em0 reset same_ports deny_in \
redirect_port tcp 1.2.3.4:6881 6881 \
redirect_port udp 1.2.3.4:4444 4444 \
redirect_port tcp 192.168.1.24:25 25

ipfw nat 2 config log same_ports redirect_addr 192.168.1.36 1.2.3.5

ipfw add 10130 skipto 10190 ip from 192.168.1.36 to any out xmit em0
ipfw add 10140 skipto 10210 ip from any to 1.2.3.5 in recv em0

ipfw add 10150 queue 1 ip from any to any out xmit em0
ipfw add 10160 nat 1 ip from any to any via em0
ipfw add 10170 queue 2 ip from any to any in recv em0

ipfw add 10180 allow all from any to any

ipfw add 10190 queue 1 ip from any to any out xmit em0
ipfw add 10200 nat 2 ip from 192.168.1.36 to any out xmit em0
ipfw add 10210 nat 2 ip from any to 1.2.3.5 in recv em0
ipfw add 10220 queue 2 ip from any to any in recv em0

ipfw add 10230 allow all from any to any

ipfw add 65534 deny all from any to any

Detailno opisanie za preminavaneto na trafika prez zashtitnata stena v dadenata konfiguratsiia:

Nastroikata na parametura queue mask 0xffffffff e ukazan za tova, che dinamichnite redove shte budat suzdavani vuz osnova na razlikata na predpochitanite bitove ot IP adresa na podatelia ili poluchatelia. Skorostta na izhodiashtiia i vhodiashtiia trafik, shte bude ogranichena pod 10 Mbit/s.

Za rutera:

Trafika initsializiran neposredstveno ot rutera preminava prez poreditsata ot pravila na ipfw v put OUT do pravilo s nomer 10150. Trafika popada v Dummynet i otiva v dinamichno suzdadenata opashka i truba, v rezultat na koeto skorostta na izhodiashtiia trafik se ogranichava do 10Mbit/s. Sled kato izleze ot Dummynet trafika se vrushta v zashtitnata stena (tui kato e izklyuchen parametura one_pass) i popada v pravilo 10160. Sled kato premine prez nat, trafika otnovo se vrushta v zashtitnata stena i idva do pravilo 10180, izliza ot zashtitnata stena i otiva vuv vunshnata mrezha.

Otvetniia trafik preminava prez put IN na zashtitnata stena do pravilo 10160, kudeto popada v nat i se demaskira (v dolniia sluchai e nesushtestveno) i se priema v nat, tui kato veche ima aktivno suedinenie. Izlizaiki ot nat, trafika popada v pravilo 10170 i se predava v Dummynet i otiva v dinamichno suzdadenata opashka i truba, v rezultat na koeto skorostta na vhodiashtiia trafik se ogranichava do 10Mbit/s. Sled kato izleze ot Dummynet trafika se vrushta v zashtitnata stena i popada v pravilo 10180, kudeto shte bude razreshen i shte izleze ot zashtitnata stena v soket programa initsializirashta suedineniiata.


Ako v rutera doide sluchaen trafik ot internet, toi shte premine prez pravilo 10160 i shte bude othvurlen, siakash nat e nastroen s parametur deny_in.

Trafik idvasht na port 6881, 4444 i 25, shte bude zaveden v nat na pravilo 10160, posle v Dummynet na pravilo 10170, a sled tova se propuska ili do samiia ruter, ili do host 192.168.1.24 suotvetno.

Za IP adresi 192.168.1.36 i 1.2.3.5

Trafika idvasht ot internet na vunshen IP adres 1.2.3.5 e dluzhen da bude prenasochen kum 192.168.1.36. Kogato takuv trafik premine prez put IN na zashtitnata stena, toi shte bude obraboten v pravilo 10140, koeto shte prehvurli obrabotkata na 10210 – trafika shte bude predaden vuv vtoro kopie na nat, kudeto shte se izvurshi demaskirane (IP adres 1.2.3.5 na poluchatelia, shte bude zamenen s 192.168.1.36). Posle tozi trafik se vrushta v zashtitnata stena i prez pravilo 10220 popada v Dummynet. Izlizaiki ot tam se vrushta v zashtitnata stena i idva do pravilo 10230, posle izliza to put IN na zashtitnata stena i otiva v put OUT, kudeto idva do pravilo 1040 i se priema, izliza ot zashtitnata stena, i se izprashta na 192.168.1.36.

Otvetniia trafik (kakto i drug predpocheten izhodiasht trafik) ot 192.168.1.36 preminava prez 1040 v put IN, sled tova v put OUT prez 10130, 10190, 10200 i 10230, posle otiva vuv vunshnata mrezha.

Za mrezha 192.168.1.0/24:

Trafik idvasht ot mrezhata 192.168.1.0/24 (naprimer ot host s IP 192.168.1.24), shte mine prez mrezhov adapter fxp0 v put IN na zashtitnata stena i shte doide do pravilo 1040, posle shte izleze ot IN i shte bude pozvolen. Trafika shte otide v put OUT, kudeto shte premine prez pravilata do 10150. Trafika popada v Dummynet i otiva v dinamichno suzdadenata opashka i truba, v rezultat na koeto skorostta na izhodiashtiia trafik shte se ogranichi do 10Mbit/s. Sled kato izleze ot Dummynet trafika se vrushta v zashtitnata stena (tui kato parametur one_pass e izklyuchen) i popada v pravilo 10160. Sled kato premine prez nat, trafika se vrushta v zashtitnata stena i idva do pravilo 10180, kudeto izliza ot zashtitnata stena i otiva vuv vunshnata mrezha.

Otvetniia trafik preminava prez put IN na zashtitnata stena do pravilo 10160, kudeto popada v nat i se demaskira i se priema v nat, tui kato veche ima aktivno suedinenie. Izlizaiki ot nat, trafika popada v pravilo 10170 i se predava v Dummynet, i otiva v dinamichno suzdadenata opashka i truba, v rezultat na koeto skorostta na vhodiashtiia trafik shte se ogranichi do 10Mbit/s. Sled kato izleze ot Dummynet trafika se vrushta v zashtitnata stena i popada v pravilo 10180, kudeto shte bude razreshen i shte izleze ot put IN na


<< | Mikrotik + Openvpn + android >>