La cererea voastra ne-am mobilizat, si am facut o versiune alfa a acestui tutorial. Daca aveti vreo obiectie/imbunatatire/intrebare va rugam sa contactati autorul.
Termenul de routare este folosit pentru a desemna trecerea pachetelor
dintr-o retea in alta. Ok, pentru a intelege mai bine, trebuie sa stiti ca,
atunci cand te conectezi la internet primesti un IP, si iti este setat automat
un gateway. Acel gateway, este un router, un computer cu un Linux, care are
grija sa routeze ( sa mute ) pachetele tale spre internet. Astfel aveti
intrenet. In mod normal acest proces este realizat prin intermediul unui
dispozitiv numit router hardware ( sau doar router ), dar si orice computer cu
un Linux instalat si cu minim 2 placi de retea poate fi considerat un router. O
definitie a termenului de routare poate fi urmatoarea:
Routarea este procesul prin care, un host cu multiple interfete de retea,
decide unde sa trimita datagramele IP pe care le primeste.
Pentru kernel-urile 2.2.X este indeajuns sa aveti comanda "route", dar pentru kernel-urile 2.4.X este indicat sa instalati pachetul iproute2 (ftp://ftp.inr.ac.ru/ip-routing/). Daca doriti sa faceti routare avansata, sau limitare de banda, atunci trebuie sa activati in kerne urmatoarele optiuni:
CONFIG_PACKET
CONFIG_IP_MULTICAST
CONFIG_IP_ADVANCED_ROUTER
CONFIG_IP_MULTIPLE_TABLES
CONFIG_IP_ROUTE_FWMARK
CONFIG_IP_ROUTE_NAT
CONFIG_IP_ROUTE_MULTIPATH
CONFIG_IP_ROUTE_TOS
CONFIG_IP_ROUTE_VERBOSE
CONFIG_IP_ROUTE_LARGE_TABLES
CONFIG_NET_IPIP
CONFIG_NET_IPGRE
CONFIG_NET_IPGRE_BROADCAST
CONFIG_IP_MROUTE
CONFIG_IP_PIMSM_V1
CONFIG_IP_PIMSM_V2
CONFIG_SYN_COOKIES
Pentru fiecare optiune de mai sus exista ajutor detaliat in kernel. De asemenea...pentru a putea face limitare de banda, este necesar sa aveti si urmatoarele optiuni in kernel:
CONFIG_NET_SCHED
CONFIG_NET_SCH_CBQ
CONFIG_NET_SCH_CSZ
CONFIG_NET_SCH_PRIO
CONFIG_NET_SCH_RED
CONFIG_NET_SCH_SFQ
CONFIG_NET_SCH_TEQL
CONFIG_NET_SCH_TBF
CONFIG_NET_SCH_GRED
CONFIG_NET_SCH_DSMARK
CONFIG_NET_QOS
CONFIG_NET_ESTIMATOR
CONFIG_NET_CLS
CONFIG_NET_CLS_TCINDEX
CONFIG_NET_CLS_ROUTE4
CONFIG_NET_CLS_FW
CONFIG_NET_CLS_U32
CONFIG_NET_CLS_RSVP
CONFIG_NET_CLS_RSVP6
CONFIG_NET_CLS_POLICE
CONFIG_SHAPER
Optiunile de mai sus de gasesc in menu-urile:
Networking Options
Network Device Support
Pentru manipularea tabelelor
cu route se pot folosi 2 comenzi: route (se gaseste in pachetul net-tools) si
ip (sa gaseste in pachetul iproute2). Daca se dorenste numai manipularea
routelor, este recomandata folosirea comenzii route. Mai exact, sa
presupunem ca doriti ca toate pachetele care au destinatia 194.148.0.0/24 sa
fie trimise pe interfata eth1 este necesar sa scrieti comanda urmatoare:
route add -net 194.148.0.0/24 dev eth1 . Pentru a sterge aceasta ruta este
necesar sa tastati urmatoarea comanda: route
Dupa cum vedeti, singura schimbare in comanda este optiunea add care devine
del. Daca aceasta este singura routa din tabela de route ( care se vizualizeaza
cu ajutorul comenzii: route -n ), atunci se poate tasta comanda urmatoare
pentru a o sterge: route
Prototipul comenzii route este urmatorul:
route [-v] [-A family] add [-net|-host] target [netmask Nm] [gw Gw] [metric N] [mss M] [window W] [irtt I] [reject] [mod] [dyn] [reinstate] [[dev] If]
Optiunea -A se foloseste pentru a desemna familia de adrese. Aceasta poate fi inet, inet6 (IPv6), ax25 (AMPR AX.25), netro 24124l113y m (AMPR NET/ROM), ipx (Novell IPX), ddp (Appletalk DDP), x25 (CCITT X.25).
Optiunea -net desemneaza tinta(target) ca fiind o retea, iar -host desemneaza tinta(target) ca fiind un host.
Optiunea natmask este folosita cand se adauga o retea la tabela de routare.
Optiunea gw ii spune kernel-ului sa routeze pachetele printr-un gateway. Este important ca gateway-ul sa fie accesibil. In caz contrar, trebuie setata o ruta statica spre gateway inainte.
Optiunea dev forteaza ruta sa fie asociata cu interfata specificata. In cazul in care aceasta optiune nu este folosita, kernel-ul va descoperi singur interfata ce trebuie folosita.
Restul specificatiilor sunt mai putin importante si se pot afla folosind pagina de manual( man route ).
In principal, este nevoie de 2 lucruri: pachetul iptables, pe care il puteti obtine de la https://netfilter.samba.org/, sau il puteti folosi pe cel gata compilat cu care vine distributia dumneavoastra. Cel de-al II-lea lucru este suportul din kernel, oferit de toate kernel-urile 2.4 . Configurarea kernel-ului.
Pentru a putea folosi comanda iptables, este necesar sa compilati kernel-ul cu urmatoarele optiuni:
CONFIG_PACKET - Aceasta optiune le permite aplicatiilor, si programelor sa lucreze direct cu anumite device-uri de retea. Un exemplu ar fi: tcpdump sau snort.
CONFIG_NETFILTER - Aceasta optiune este necesara daca aveti de gand sa folositi computer-ul ca un firewall sau gateway spre internet. Cu alte cuvinte, aceasta optiune este necesara pentru a functiona ceva din tutorial-ul acesta.
CONFIG_IP_NF_CONNTRACK - Acest modul este folosit pentru a face urmarirea conexiunii. Urmarirea conexiunii este folosita, printre altele, de NAT si Mascaradare. De exemplu, daca vrei sa folositi computer-ul ca firewall pentru o retea, categoric aveti nevoie de acest modul.
CONFIG_IP_NF_FTP - Acest modul este necesar pentru urmarire conexiunii pe conexiuni FTP. Deoarece, pe conexiunile FTP este destul de greu sa faci urmarire de conexiune, in mod normal "conntrack" are nevoie de un ajutator, iar acasta optiune il compileaza. Deci, daca nu adaugati aceasta optiune, nu veti putea folosi FTP-ul printr-un gateway sau firewall.
CONFIG_IP_NF_IPTABLES - Aceasta optiune este necesara pentru a putea face orice tip de filtrare, mascaradare sau NAT-are. Fara aceasta, nu veti putea face nimic cu iptables.
CONFIG_IP_NF_MATCH_LIMIT - Acest modul nu este exact necesar, dar este bun in cazul in care vrei sa limitezi numarul de pachete pe minut. (ex: "-m limit --limit 3/minute" limiteaza nr de pachete pe minut la 3).
CONFIG_IP_NF_MATCH_MAC - Acest modul ne permite potrivirea pachetelor dupa adresa MAC. Cu ajutorul ei, se poate bloca access-ul unui computer dupa adresa MAC. Aceasta este o optiune foarte buna, doarece adresele MAC nu se schimba.
CONFIG_IP_NF_MATCH_MARK - Acest modul ne permite marcarea pachetelor.
CONFIG_IP_NF_MATCH_MULTIPORT - Acest modul ne permite potrivrea pachetelor cu o raza de porturi pentru sursa si destinatie. In mod normal, asa ceva nu este posibil, dar cu acest modul, se poate.
CONFIG_IP_NF_MATCH_TOS - Cu aceasta potrivire putem potrivi pachetele dupa campul lor TOS. TOS vine de la TypeOfService.
CONFIG_IP_NF_MATCH_TCPMSS - Aceasta potrivire ne permite sa potrivim pachetele TCP SYN pe baza campului lor MSS
CONFIG_IP_NF_MATCH_STATE - Aceasta este una dintre cele mai noi lucruri in comparatie cu IPchains. Cu acest modul, putem face potrivire de stare pe pachete.
CONFIG_IP_NF_MATCH_UNCLEAN - Acest modul ne permite sa potrivim pachetele de tip IP/TCP/UDP si ICMP care arata ciudat, sau sunt invalide. De exemplu, putem sa blocam aceste pachete.
CONFIG_IP_NF_MATCH_OWNER - Aceasta optiune ne permite sa facem potrivire dupa proprietar (owner). De exemplu, putem permite numai utilizatorului root sa aibe access la Internet.
CONFIG_IP_NF_FILTER - Acest modul va aduga bazele tabelului FILTER. Aici gasititi 3 lanturi: INPUT, OUTPUT si FORWARD. Acest modul e necesar daca doriti sa filtrati pachetele care vin sau ies din computer.
CONFIG_IP_NF_TARGET_REJECT - Aceasta tinta ne permite sa specificam, ca, un mesaj ICMP trebuie trimis sursei.
CONFIG_IP_NF_TARGET_MIRROR - Acesta permite pachetelor sa fie retrimise sender-ului. Astfel, daca setati ca tinta MIRROR pe un port http, cel care incearca sa se conecteze la http-ul vostru isi vede propria pagina, deoarece pachetele ii sunt retrimise ca si cum ar fi incercat sa se conecteze direct la el.
CONFIG_IP_NF_NAT - Acest modul permite translatarea adresei de retea ( sau NAT ). Cu acest modul putem sa facem inaintare de porturi ( port forwarding ), sau mascaradare.
CONFIG_IP_NF_TARGET_MASQUERADE - Acest modul adauga tina MASQUERADE.
CONFIG_IP_NF_TARGET_REDIRECT - In loc sa lasam un pachet sa treaca prin computer-ul nostru, il remap-am, astfel incat sa vina in calculatorul nostru.
CONFIG_IP_NF_TARGET_LOG - Acest adauga tinda LOC la iptables. Putem folosi acest modul pentru a loga anumite pachete prin syslog, si a le observa.
CONFIG_IP_NF_TARGET_TCPMSS -
CONFIG_IP_NF_COMPAT_IPCHAINS - Adauga un mod de compatibilitate cu vechiul IPchains.
CONFIG_IP_NF_COMPAT_IPFWADM - Adauga un mod de compatibilitate cu vechiu ipfwadm.
Acestea ar fi tot ceea de ce aveti nevoie, dar eu recomand compilarea tuturor modulelor din menu-ul Netfilter Configuration.
In acest capitol se va discuta amanuntit cum sa faceti propriile reguli. Fiecare regula pe care o inserati intr-un lant poate fi considerata o regula. Fiecare regula este o linie la care kernel-ul se uita pentru a sti ce va face cu pachetul. Daca toate criteriile sau potrivirile sunt intalnite, se executa o tinta. In mod normal am scrie o regula astfel:
iptables [table] <command> <match> <target/jump>
Nimic nu spune ca trebuie sa pui tinta ultima, dar ofera o mai buna citire. In schimb comanda trebuie sa fie scrisa prima, sau imediat dupa specificarea tabel-ului.
Optiunea -t specifica ce tabel sa fie folosit. Default este "filter". Urmatoarele optiuni se pot folosi cu comanda -t.
Tabel |
Explicatie |
nat |
Tabelul nat este folosit pentru Translatarea Adresei de Retea. Nu incercati sa faceti nici un fel de filtrare in acest tabel. Aici avem 3 lanturi: PREROUTING [folosit pentru a altera pachetele chiar cand ajung la firewall], OUTPUT [folosit pentru a altera pachetele generate local] si POSTROUTING [folosit pentru a altera pachetele chiar inainte sa iasa]. |
mangle |
Cu ajutorul acestui tabel se pot shimba diferite pachete, si felul in care arata header-ele printre altele. Exemple ar fi schimbarea TTL-ului, TOS-ului sau MARK-ului. Contine 2 lanturi: PREROUTING [folosit pentru a altera pachetele care ating firewall-ul, inainte de a ajunge la decizia de routare] si OUTPUT [folosit pentru alterarea pachetelor generate local inainte de a ajunge la decizia de routare]. |
filter |
Tabelul fiter trebuie folosit pentru a filtra pachetele in general. De exemplu, putem sa DROP, LOG, ACCEPT sau REJECT. Aici exista 3 tabele: FORWARD [folosit pentru toate pachetele generate nelocal], INPUT [pentru toate pachetele care sunt destinate pentru localhost] si OUTPUT [folosit pentru toate pachetele generate local] |
Comanda |
Exemplu |
Explicatie |
-A, --append |
iptables -A INPUT ... |
Aceasta comanda este folosita pentru adougarea regulii la sfarsitul lantului. Regula, cu alte cuvinte, va fi pusa mereu la sfarsitul lantului, si va fi cercetata ultima. |
-D, --delete |
iptables -D INPUT --dport 80 -j DROP |
Aceasta comanda sterge o regula dintr-un lant. Aceasta poate fi facuta in 2 metode: ori prin a pune un -D in loc de -A ( in regula scrisa ), ori prin numarul acesteia -D lant 1 ( sterge regula 1 [aceasta fiind prima de sus in jos]). |
-R, --replace |
iptables -R INPUT 1 -s 192.168.0.1 -j DROP |
Aceasta comanda inlocuieste vechea regula de la acea linie. |
-I, --insert |
iptables -I INPUT 1 --dport 80 -j ACCEPT |
Insereaza o regula in lant. |
-L, --list |
iptables -L INPUT |
Listeaza regulile din lant. |
-F, --flush |
iptables -F INPUT |
Aceasta comanda sterge toate regulile din lant. Aceasta se specifica fara alte optiuni |
-Z, --zero |
iptables -Z INPUT |
Reseteaza toate counte-ele din lantul specificat. |
-N, --new-chain |
iptables -N permis |
Aceasta comanda ii spune kernel-ului sa creeze un nou lant, in tabelul specificat, cu numele specificat. |
-X, --delete-chain |
iptables -X permis |
Aceasta regula sterge un lant. Este necesar ca lantul sa fie gol. |
-P, --policy |
iptables -P INPUT DROP |
Aceasta comanda ii spune kernel-ului sa seteze o tinta default. Toate pachetele carora nu se potriveste nici o regula vor fi trimise catre aceasta tinta default. |
-E, --rename-chain |
iptables -E permis nepermis |
Comanda -E ii spune kernel-ului sa redenumeasca regula permis in nepermis. |
Comanda trebuie sa existe neaparat. Se poate omite numai aunci cand se foloseste optiunea -h pentru a afisa ajutorul.
In aceasta sectiune se va vorbi mai mult despre portiviri ( matches ). Potrivirile se impart in: potriviri generale ( Generic matches ), dupa care mai exista potriviri TCP, UDP si ICMP, potriviri ce pot fi folosite numai pe acele protocoale.
Potriviri Generale
Potrivire |
Exemplu |
Explicatie |
-p, --protocol |
iptables -A INPUT -p tcp |
Protocoalele pachetelor. Acestea pot fi: tcp, udp si icmp |
-s, --source |
iptables -A INPUT -s 192.168.1.1 |
Sursa pachetului. |
-d, --destination |
iptables -A INPUT -d 192.168.1.1 |
Destinatia pachetului. |
-i, --in-interface |
iptables -A INPUT -d 192.168.1.1 |
Interfata pe care intra pachetele. |
-o, --out-interface |
iptables -A FORWARD -o eth0 |
Interfata pe care ies pachetele. |
-f, --fragment |
iptables -A INPUT -f |
Spune ca regula se refera la cel de-al II-lea sau restul pachetelor. |
-c, --set-counters |
iptables -A INPUT --set-counters |
Seteaza counter-ele la un numar de pachete si un numar de biti. |
Potriviri TCP
Potrivire |
Exemplu |
-sport, --source-port |
iptables -A INPUT -p tcp --sport 22 |
-dport, --destination-port |
iptables -A INPUT -p tcp --dport 22 |
--tcp-flags |
iptables -p tcp --tcp-flags SYN,ACK,FIN SYN |
--syn |
iptables -p tcp --syn |
--tcp-option |
iptables -p tcp --tcp-option 16 |
Portiviri UDP
Potrivire |
Exemplu |
--sport, --source-port |
iptables -A INPUT -p udp --sport 53 |
--dport, --destination-port |
iptables -A INPUT -p udp --dport 53 |
Potriviri ICMP
Potrivire |
Exemplu |
--icmp-type |
iptables -A INPUT -p icmp --icmp-type 8 |
Potrivirile explicite sunt potrivirile despre care vorbeam la capitolul Configurarea kernel-ului. Acestea se pot utiliza prin folosirea optiunii -m. Mai jos avem o lista cu potrivirile posibile.
Potriviri MAC
Potrivire |
Exemplu |
--mac-source |
iptables -A INPUT --mac-source |
Potriviri Limit
Potrivire |
Exemplu |
--limit |
iptables -A INPUT -m limit --limit 3/hour |
--limit-burst |
iptables -A INPUT -m limit --limit-burst 5 |
Potriviri Multiport
Potrivire |
Exemplu |
--source-port |
iptables -A INPUT -p tcp -m multiport --source-port 22,53,80,110 |
--destination-port |
iptables -A INPUT -p tcp -m multiport --destination-port 22,53,80,110 |
--port |
iptables -A INPUT -p tcp -m multiport --port 22,53,80,110 |
Potriviri Mark
Potrivire |
Exemplu |
--mark |
iptables -t mangle -A INPUT -m mark --mark 1 |
Potriviri Owner
Potrivire |
Exemplu |
--uid-owner |
iptables -A OUTPUT -m owner --uid-owner 500 |
--gid-owner |
iptables -A OUTPUT -m owner --gid-owner 0 |
--pid-owner |
iptables -A OUTPUT -m owner --pid-owner 78 |
--sid-owner |
iptables -A OUTPUT -m owner --sid-owner 100 |
Potriviri de stare
Potrivire |
Exemplu |
--state |
iptables -A INPUT -m state --state RELATED,ESTABLISHED |
Potriviri Unclean
Potrivire |
Exemplu |
Potriviri TOS
Potrivire |
Exemplu |
--tos |
iptables -A INPUT -p tcp -m tos --tos 0x16 |
Potriviri TTL
Potrivire |
Exemplu |
--ttl |
iptables -A OUTPUT -m ttl --ttl 60 |
ACCPET
DROP
QUEUE
RETURN
LOG
MARK
REJECT
TOS
MIRROR
SNAT
DNAT
MASQUERADE
REDIRECT
TTL
ULOG
Cand un pachet intra in firewall, ajunge la hardware si intra pe driver-ul device-ului din kernel. Dupa care pachetul trece printr-o serie de pasi din kernel pana ce este trimis catre aplicatia corecta ( local ), sau este forward-at catre un alt host. Daca un pachet, destinat pentru o alta masina, ajunge la firewall, trece prin urmatoarele etape:
Pas |
Tabel |
Lant |
Comentariu |
1 |
Pe fir (ex: Internet). |
||
2 |
Intra pe interfata (ex: eth0, ppp0). |
||
3 |
mangle |
PREROUTING |
Aici se schimba valoarea din campul TOS si multe altele. |
4 |
nat |
PREROUTING |
Acest lant este folosit pentru translatarea adresei destinatie de retea (DNAT). |
5 |
Decizia de routare. |
||
6 |
filter |
FORWARD |
Daca doriti sa faceti filtrare, aici este cazul. |
7 |
nat |
POSTROUTING |
Acest lant se foloseste pentru translatarea adresei sursa. |
8 |
Iese pe interfata (ex: eth1, ppp1) |
||
9 |
Pe fir din nou (ex: Internet) |
Daca un pachet, destinat pentu firewall (localhost), ajunge la acesta, trece prin urmatoarele etape:
Pas |
Tabel |
Lant |
Comentariu |
1 |
Pe fir (ex: Internet). |
||
2 |
Intra pe interfata (ex: eth0, ppp0). |
||
3 |
mangle |
PREROUTING |
Aici se schimba valoarea din campul TOS si multe altele. |
4 |
nat |
PREROUTING |
Acest lant este folosit pentru translatarea adresei destinatie de retea (DNAT). |
5 |
Decizia de routare. |
||
6 |
filter |
INPUT |
Aici se va face filtrarea pachetelor ce vin. Toate pachetele (destinate pentru firewall) ce vin, trec prin acest lant indiferent de interfata de pe care vin. |
7 |
Proces local/Aplicatie locala (ex: program client/server). |
Pachetele ce au ca sursa firewalul trec prin urmatoarele etape:
Pas |
Tabel |
Lant |
Comentariu |
1 |
Proces local/Aplicatie locala (ex: progral client/server). |
||
2 |
mangle |
OUTPUT |
Aici se face schimbarea valorii TOS. |
3 |
natfilter |
OUTPUT |
Aici se face filtrarea pachetelor. |
4 |
Decizia de routare. |
||
5 |
nat |
POSTROUTING |
Aici se face translatarea adresei sursa de retea (SNAT). |
6 |
Iese pe o interfata (ex: eth0, ppp0). |
||
7 |
Pe fir (ex: Internet). |
In acest tabel se pot schimba valorile TOS ( Type Of Service ), si multe altele. Nu faceti nici un fel de fitrare aici, si nici SNAT, DNAT sau mascaradare. Singurele tinte aici sunt:
TOS
TTL
MARK
Tinta TOS este folosita pentru a seta/schimba valoarea TOS. Acesta poate fi folosit pentru a seta regulile unei retele in functie de cum trebuie un pachet sa fie routat samd. Aceasta valoare nu se foloseste pe Internet, deci, nu schimbati aceasta valoare pentru pachetele ce pleaca spre Internet, decat daca faceti routare cu iproute2.
Tinta TTL este folosita pentru a schimba valoarea TTL-ului ( Time To Live ). Putem spune pachetelor sa aibe un TTL specific.
Tinta MARK este folosita pentru a seta valori speciale in campul MARK. Aceste insemnari ar putea fi recunoscute de catre programele lui iproute2 pentru a face diferite routari pe baza valorii mark. Putem face limitare de banda si CBQ cu aceasta tinta.
Acest tabel este folosit numai pentru a face translatarea adresei de retea. Nu se va face nici un fel de filtrare. Numai primul pachet (dintr-o succesiune) va ajunge la acest lant, restul li se vor lua aceleasi masuri ca si primul. Tintele acestui lant sunt:
DNAT
SNAT
MASQUERADE
DNAT-ul este folosit in cazuri in care, avem un singur IP, si vrem ca orice conexiune pe portul 80 de pe acel IP, sa fie redirectionata la un computer din reteaua locala.
SNAT-ul este folosit pentru a ascunde reteaua locala. SNAT-ul consuma mai putin procesor, dar este necesar sa ai o adresa IP neroutabila fixa.
Tinta MASQUERADE, este la fel ca si SNAT-ul, numai ca nu este necesar sa stii adresa IP neroutabila. Consuma mai mult procesor, pentru ca, la fiecare pachet redirectioneaza adresa IP neroutabila.
Tabelul filter, este folosit desigur pentru filtrarea de pachete. Are mai multe tine, dar cele mai importante sunt:
ACCEPT
REJECT
DROP
Tinta ACCEPT ii spune kernel-ului sa accepte toate pachetele care intrunesc calitatile.
Tinta REJECT ii spune kernel-ului sa nu accepte nici un pachet care intruneste calitatile, si sa informeze sursa.
Tinta DROP ii spune kernel-ului sa nu accepte nici un pachet care intruneste calitatile, fara a mai informa sursa.
|