<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>safemode &#187; Scripturi</title>
	<atom:link href="http://safemode.ro/category/sisteme-de-operare/scripturi/feed/" rel="self" type="application/rss+xml" />
	<link>http://safemode.ro</link>
	<description>Just another WordPress weblog</description>
	<lastBuildDate>Wed, 21 Apr 2010 14:11:48 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Introducere in iptables &#8211; Linux firewall</title>
		<link>http://safemode.ro/2010/04/21/introducere-in-iptables-linux-firewall/</link>
		<comments>http://safemode.ro/2010/04/21/introducere-in-iptables-linux-firewall/#comments</comments>
		<pubDate>Wed, 21 Apr 2010 13:54:44 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Computer Security]]></category>
		<category><![CDATA[Linux OS]]></category>
		<category><![CDATA[Network Security]]></category>
		<category><![CDATA[Protocoale]]></category>
		<category><![CDATA[Scripturi]]></category>
		<category><![CDATA[Securitatea in Linux]]></category>
		<category><![CDATA[Server Security]]></category>
		<category><![CDATA[adresa]]></category>
		<category><![CDATA[conexiune]]></category>
		<category><![CDATA[firewall]]></category>
		<category><![CDATA[ip]]></category>
		<category><![CDATA[iptables]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[mac]]></category>
		<category><![CDATA[nat]]></category>
		<category><![CDATA[pachet]]></category>
		<category><![CDATA[policy]]></category>
		<category><![CDATA[port]]></category>
		<category><![CDATA[reguli]]></category>
		<category><![CDATA[Securitate]]></category>

		<guid isPermaLink="false">http://safemode.ro/?p=75</guid>
		<description><![CDATA[Introducere
Linux OS are un firewall de baza extrem de puternic, denumit iptables/netfilter. Iptables este modulul prin care utilizatorul, interactionand cu linia de comanda, introduce reguli de firewall în tabele predefinite. Netfilter este un modul construit în kernel, care executa de fapt filtrarea. Exista multe interfete GUI pentru iptables care permit utilizatorilor sa adauge sau sa [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Introducere</strong></p>
<p>Linux OS are un firewall de baza extrem de puternic, denumit iptables/netfilter. Iptables este modulul prin care utilizatorul, interactionand cu linia de comanda, introduce reguli de firewall în tabele predefinite. Netfilter este un modul construit în kernel, care executa de fapt filtrarea. Exista multe interfete GUI pentru iptables care permit utilizatorilor sa adauge sau sa defineasca reguli cu ajutorul click-urilor, dar acestea de multe ori lipsesc utilizatorul de flexibilitatea oferita de linie de comanda si limiteaza întelegerea a ceea ce se întâmpla cu adevarat.</p>
<p>Inainte de a avansa in cunoasterea iptables, trebuie sa avem o intelegere de baza a modului în care functioneaza. Iptables utilizeaza conceptul de adrese IP, protocoale (TCP, UDP, ICMP) si porturi.</p>
<p>Iptables incarca regulile în lanturi predefinite (INPUT, OUTPUT si FORWARD), care sunt verificate cu orice tip de trafic de retea (pachete IP) relevante pentru aceste lanturi si este luata o decizie cu privire la ce sa faca cu fiecare pachet pe baza rezultatelor acestor reguli, si anume acceptarea sau renuntarea la pachet. Aceste actiuni sunt mentionate ca target-uri, dintre care, cele mai comune sunt DROP (se renunta la un pachet) sau ACCEPT (se accepta un pachet).</p>
<p><strong>Chains (lanturi)</strong></p>
<p>Exista 3 lanturi predefinite în tabelul de filtrare la care putem adauga reguli pentru prelucrarea pachetelor IP. Aceste lanturi sunt:</p>
<ul>
<li><strong>INPUT </strong>- Toate pachetele destinate pentru computerul gazda.</li>
<li><strong>OUTPUT </strong>- Toate pachetele provenind de la computerul gazda.</li>
<li><strong>FORWARD </strong>- Toate pachetele care doar trec prin (dirijate de catre) computerul gazda. Acest lant este folosit la utilizarea computer-ului ca un router.</li>
</ul>
<p>Cea mai mare atentie o vom acorda lantului de INPUT, pentru a filtra pachetele ce intra in sistemul nostru.</p>
<p>Regulile sunt adaugate într-o lista pentru fiecare lant. Un pachet este verificat pentru fiecare regula in parte, pornind de la prima de sus, si daca se potriveste unei reguli, atunci se iau masuri, cum ar fi acceptarea (ACCEPT) sau renuntarea (DROP) la pachet. Odata ce o regula a fost potrivita si o masura luata, pachetul este procesat în conformitate cu rezultatele din aceasta regula si nu este verificat de celelalte reguli ramase în lant. Daca un pachet trece prin toate regulile din lant si ajunge în partea de jos, fara a fi potrivit cu nici o regula, atunci actiunea implicita pentru acel lant este luata. Acest lucru este mentionat în continuare ca politica implicita ce poate fi setata pe ACCEPT sau DROP.</p>
<p>Conceptul de politica implicita în cadrul lanturilor ridica doua posibilitati fundamentale care trebuie examinate mai întâi, înainte de a decide cum vom organiza firewall-ul nostru.</p>
<ul>
<li>Putem stabili o politica implicita de DROP pentru toate pachetele de date si apoi sa adaugam reguli pentru a permite (ACCEPT) în mod specific pachete care provin de la adrese IP sigure, sau pentru anumite porturi petru care avem servicii active, cum ar fi: server FTP, Web Server, server de fisiere, etc</li>
<li>Putem stabili o politica implicita de ACCEPT pentru toate pachetele de date si apoi sa adaugam reguli pentru a bloca (DROP) în mod specific pachete de la anumite adrese IP necunoscute sau intervale de adrese, sau pentru anumite porturi pentru care nu avem servicii active.</li>
</ul>
<p>În general, optiunea 1 de mai sus este folosita pentru lantul INPUT pentru a controla accesul in sistemul nostru si optiunea 2 ar fi de ales pentru lantul OUTPUT deoarece avem incredere in validitatea datelor care pleaca din sistemul nostru.</p>
<p><strong>Chestii de baza</strong></p>
<p>Lucrul cu iptables din linia de comanda necesita privilegii de root, deci va fi nevoie de a va loga ca si root pentru cele mai multe lucruri pe care le vom face.</p>
<p>Puteti verifica daca iptables este instalat pe sistemul dvs. prin comanda:</p>
<p>$ rpm -q iptables<br />
iptables-1.3.5-1.2.1</p>
<p>Si pentru a vedea daca iptables chiar ruleaza activ, putem verifica daca modulele iptables sunt încarcate si putem  folosi atributul -L pentru a inspecta regulile încarcate în prezent:</p>
<p># lsmod | grep ip_tables<br />
ip_tables              29288  1 iptable_filter<br />
x_tables               29192  6 ip6t_REJECT,ip6_tables,ipt_REJECT,xt_state,xt_tcpudp,ip_tables</p>
<p># iptables -L</p>
<p>Chain INPUT (policy ACCEPT)<br />
target     prot opt source               destination<br />
RH-Firewall-1-INPUT  all  &#8211;  anywhere             anywhere<br />
Chain FORWARD (policy ACCEPT)<br />
target     prot opt source               destination<br />
RH-Firewall-1-INPUT  all  &#8211;  anywhere             anywhere<br />
Chain OUTPUT (policy ACCEPT)<br />
target     prot opt source               destination<br />
Chain RH-Firewall-1-INPUT (2 references)<br />
target     prot opt source               destination<br />
ACCEPT     all  &#8211;  anywhere             anywhere<br />
ACCEPT     icmp &#8212;  anywhere             anywhere            icmp any<br />
ACCEPT     esp  &#8211;  anywhere             anywhere<br />
ACCEPT     ah   &#8212;  anywhere             anywhere<br />
ACCEPT     udp  &#8211;  anywhere             224.0.0.251         udp dpt:mdns<br />
ACCEPT     udp  &#8211;  anywhere             anywhere            udp dpt:ipp<br />
ACCEPT     tcp  &#8211;  anywhere             anywhere            tcp dpt:ipp<br />
ACCEPT     all  &#8211;  anywhere             anywhere            state RELATED,ESTABLISHED<br />
ACCEPT     tcp  &#8211;  anywhere             anywhere            state NEW tcp dpt:ssh<br />
REJECT     all  &#8211;  anywhere             anywhere            reject-with icmp-host-prohibited</p>
<p>Daca iptables nu ruleaza il puteti porni utilizand comanda:</p>
<p># service iptables start<br />
# service iptables stop (pentru a opri serviciul)<br />
# service iptables restart (pentru a restarta serviciul)</p>
<p><strong>Scrierea unui set de reguli de baza</strong></p>
<p>In acest moment vom sterge (flush) regulile de baza. Daca sunteti conectat remote prin ssh la server sunt sanse mari sa nu mai aveti acces dupa aceasta operatiune. Trebuie sa configurati politica implicita de INPUT (default input policy) pe ACCEPT inainte de stergerea regulilor curente si sa adaugati apoi o regula pentru a va permite accesul.</p>
<p>Vom aborda comenzile iptables folosind exemple pentru a fi mai usor de inteles. In acest prim exemplu vom creea un set de reguli pentru a configura un firewall pentru Stateful Packet Inspection (SPI) care va permite toate conexiunile outgoing si va bloca toate conexiunile incoming nedorite.</p>
<p># iptables -P INPUT ACCEPT<br />
# iptables -F<br />
# iptables -A INPUT -i lo -j ACCEPT<br />
# iptables -A INPUT -m state &#8211;state ESTABLISHED,RELATED -j ACCEPT<br />
# iptables -A INPUT -p tcp &#8211;dport 22 -j ACCEPT<br />
# iptables -P INPUT DROP<br />
# iptables -P FORWARD DROP<br />
# iptables -P OUTPUT ACCEPT<br />
# iptables -L -v</p>
<p>care va da urmatorul output:</p>
<p>Chain INPUT (policy DROP 0 packets, 0 bytes)<br />
pkts bytes target     prot opt in     out     source               destination<br />
0     0 ACCEPT     all  &#8211;  lo     any     anywhere             anywhere<br />
0     0 ACCEPT     all  &#8211;  any    any     anywhere             anywhere            state RELATED,ESTABLISHED<br />
0     0 ACCEPT     tcp  &#8211;  any    any     anywhere             anywhere            tcp dpt:ssh<br />
Chain FORWARD (policy DROP 0 packets, 0 bytes)<br />
pkts bytes target     prot opt in     out     source               destination<br />
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)<br />
pkts bytes target     prot opt in     out     source               destination</p>
<p>Sa studiem acum fiecare din aceste 9 comenzi pentru a intelege ce s-a intamplat:</p>
<p><strong>iptables -P INPUT ACCEPT<br />
<span style="font-weight: normal;">Daca suntem conectati remote trebuie sa setam temporar politica implicita a lantului de INPUT pe ACCEPT pentru a nu ajunge in situatia de a nu ne mai putea loga dupa ce facem flush la regului.</span></strong></p>
<p><strong>iptables -F<br />
<span style="font-weight: normal;">Am folosit -F pentru a face flush la reguli.</span></strong></p>
<p><strong>iptables -A INPUT -i lo -j ACCEPT<br />
<span style="font-weight: normal;">Acum adaugam reguli noi. Folosim -A (add) pentru a adauga o regula la un anumit lant, in acest caz lantul de INPUT. Folosim apoi atributul -i (interfata) pentru a specifica pachete pentru sau cu destinatia lo (localhost, 127.0.0.1). In final utilizam atributul -j (jump) pentru a specifica actiunea (target-ul) pentru pachetele care se potrivesc regulii. In acest caz actiunea este de ACCEPT. Asadar aceasta regula va permite acceptarea tuturor pachetelor cu destinatia interfata localhost. Aceasta regula este in general necesara, ea fiind utilizata de multe aplicatii software.</span></strong></p>
<p><strong>iptables -A INPUT -m state &#8211;state ESTABLISHED,RELATED -j ACCEPT<br />
<span style="font-weight: normal;">Din nou adaugam (-A) aceasta regula la lantul de INPUT (chain). Folosim -m pentru a incarca un modul ce examineaza starea unui pachet si determina daca este NEW, ESTABLISHED sau RELATED. NEW se refera la pachetele de incoming care fac parte din conexiuni noi care nu au fost initiate de sistemul gazda. ESTABLISHED si RELATED se refera la pachetele de incoming care fac parte sau au legatura cu o conexiune ce este deja stabilita cu sistemul gazda.</span></strong></p>
<p><strong>iptables -A INPUT -p tcp &#8211;dport 22 -j ACCEPT<br />
<span style="font-weight: normal;">Prin aceasta regula permitem conexiunile SSH pe portul tcp 22. Este utila in cazul lucrului remote pe un server.</span></strong></p>
<p><strong>iptables -P INPUT DROP<br />
<span style="font-weight: normal;">Atributul -P seteaza politica implicita pe un anumit lant. Asadar punem politica implicita pe lantul de INPUT ca fiind DROP. Orice pachet care nu indeplineste una dintre regulile urmatoare este refuzat. Daca suntem conectati remote si nu am fi adaugat regula anterioara cu SSH acum am fi ramas blocati in afara serverului si fara posibilitatea de a mai ne loga.</span></strong></p>
<p><strong>iptables -P FORWARD DROP<br />
<span style="font-weight: normal;">Similar setam politica implicita pe lantul de FORWARD ca fiind DROP deoarece nu folosim sistemul ca router si nu dorim sa treaca pachetele prin calculatorul nostru.</span></strong></p>
<p><strong>iptables -P OUTPUT ACCEPT<br />
<span style="font-weight: normal;">Punem politica implicita la lantul de OUTPUT pe ACCEPT deoarece vrem sa permitem tot traficul de outgoing.</span></strong></p>
<p><strong>iptables -L -v<br />
<span style="font-weight: normal;">Listam (-L) regulile recent introduse.</span></strong></p>
<p>Ultimul lucru care trebuie facut este sa salvam regulile pentru ca data viitoare cand pornim sistemul ele sa fie reincarcate:</p>
<p># /sbin/service iptables save</p>
<p>In acest fel se executa scriptul de init iptables, care ruleaza /sbin/iptables-save si scrie configuratia curenta in /etc/sysconfig/iptables. La reboot scriptul de init aplica din nou regulile salvate in iptables ruland comanda /sbin/iptables-restore.</p>
<p>Daca aveti mai multe reguli si cand firewall-ul este mai complex acest proces de introducere al regulilor din linia de comanda poate deveni greoi. Cea mai simpla metoda de a lucra cu iptables este folosind scripturi care vor face treaba in locul nostru. Toate comenzile de mai sus pot fi scrise intr-un editor de text si salvate, de exemplu sub numele myfirewall:</p>
<p>#!/bin/bash<br />
# iptables example configuration script<br />
# Flush all current rules from iptables<br />
iptables -F<br />
# Allow SSH connections on tcp port 22<br />
# This is essential when working on remote servers via SSH to prevent locking yourself out of the system<br />
iptables -A INPUT -p tcp &#8211;dport 22 -j ACCEPT<br />
# Set default policies for INPUT, FORWARD and OUTPUT chains<br />
iptables -P INPUT DROP<br />
iptables -P FORWARD DROP<br />
iptables -P OUTPUT ACCEPT<br />
# Set access for localhost<br />
iptables -A INPUT -i lo -j ACCEPT<br />
# Accept packets belonging to established and related connections<br />
iptables -A INPUT -m state &#8211;state ESTABLISHED,RELATED -j ACCEPT<br />
# Save settings<br />
/sbin/service iptables save<br />
# List rules<br />
iptables -L -v</p>
<p>Acum faceti scriptul executabil prin comanda:</p>
<p># chmod +x myfirewall</p>
<p>Pentru a-l executa din linia de comanda folositi comanda:</p>
<p># ./myfirewall</p>
<p><strong>Interfete</strong></p>
<p>In exemplul anterior am vazut cum putem accepta toate pachetele de incoming pe o anumita interfata, in acel caz localhost:</p>
<p>iptables -A INPUT -i lo -j ACCEPT</p>
<p>Sa presupunem ca avem doua interfete (placi de retea), eth0, interfata cu reteaua interna LAN si eth1, interfata externa folosita la conexiunea la internet. Vrem sa acceptam toate pachetele de incoming ce vin dinspre reteaua interna(eth0) dar sa refuzam pachetele de incoming dinspre reteaua externa(eth1). Pentru aceasta folosim regulile:</p>
<p>iptables -A INPUT -i lo -j ACCEPT<br />
iptables -A INPUT -i eth0 -j ACCEPT</p>
<p><strong><span style="color: #ff0000;">Trebuie sa fim foarte atenti la regulile pe interfata externa. Daca acceptam toate pachetele de incoming pe interfata externa este ca si cum am da disable la firewall!!!:</span></strong></p>
<p><span style="color: #ff0000;">iptables -A INPUT -i eth1 -j ACCEPT</span></p>
<p><strong>Adrese IP</strong></p>
<p>Acceptarea pachetelor pe o anumita interfata poate sa nu fie suficient de sigur si poate doriti mai mult control in ce acceptati sau rejectati. Sa presupunem ca acem o mica retea care folosesc subreteaua 192.168.0.x. Ne putem deschide firewall-ul doar pentru o singura adresa IP, sa zicem 192.168.0.4:</p>
<p># Accept packets from trusted IP addresses<br />
iptables -A INPUT -s 192.168.0.4 -j ACCEPT</p>
<p>Adaugam (-A) o regula la lantul de INPUT prin care acceptam (ACCEPT) toate pachetele ce au ca adresa IP sursa (-s) 192.168.0.4.</p>
<p>Daca dorim sa adaugam o regula care sa permita acceptarea pachetelor de la mai multe adrese IP aflate in aceeasi retea atunci putem scrie cate o regula de acceptare pentru fiecare adresa sau, varianta mai simpla, sa scriem o singura regula pentru toate. Pentru a specifica aceste adrese ne folosim de netmask sau de o notatie standard. Daca dorim sa deschidem firewall-lul pentru toate adresele IP ce provin din subreteaua 192.168.0.x putem folosi una dintre urmatoarele doua metode:</p>
<p># Accept packets from trusted IP addresses</p>
<ul>
<li>iptables -A INPUT -s 192.168.0.0/24 -j ACCEPT</li>
<li>iptables -A INPUT -s 192.168.0.0/255.255.255.0 -j ACCEPT</li>
</ul>
<p>Pe langa faptul ca putem specifica adresa IP sursa a unui pachet se poate specifica si adresa MAC intr-o regula. Putem scrie o regula care sa permita acceptarea pachetelor de incoming doar pentru cele care au ca sursa un anumit IP si o anumita adresa MAC. Pentru aceasta trebuie sa incarcam modulul de mac la fel cum anterior am incarcat modul de stare pentru a verifica daca un pachet face parte dintr-o conexiune ESTABLISHED sau RELATED:</p>
<p># Accept packets from trusted IP addresses<br />
iptables -A INPUT -s 192.168.0.4 -m mac &#8211;mac-source 00:50:8D:FD:E6:32 -j ACCEPT</p>
<p>Folosim -m mac pentru incarcarea modulului si &#8211;mac-source pentru a specifica adresa MAC a ip-ului (192.168.0.4). Pentru a filtra dupa MAC prima data trebuie sa aflati adresa MAC a unui computer; puteti face acest lucru pe linux folosind comanda ifconfig ca si root. Pe Windows utilizati din linia de comanda comanda ipconfig /all.</p>
<p>Filtrarea dupa MAC poate preveni spoofingul adresei IP adica folosirea adresei IP de catre o persoana/statie neautorizata. Din pacate aceasta filtrare nu functioneaza in internet dar este foarte utila pentru o retea locala (LAN).</p>
<p><strong>Porturi si protocoale</strong></p>
<p>Daca inainte am vazut cum se face filtrarea pentru anumite adrese IP sau adrese MAC acum vom aprofunda realizarea firewall-ului prin prezentarea filtrarii pe porturi si protocoale pentru a controla mai amanuntit traficul in sistemul nostru.</p>
<p>Inainte de a face o astfel de filtrare trebuie sa cunoastem ce protocol si ce port foloseste un anumit serviciu pe care dorim sal acceptam sau sa-l rejectam. Sa luam ca exemplu serviciul de bittorrent care utilizeaza protocolul tcp si portul 6881. Dorim asadar sa acceptam toate pachetele tcp care au ca si destinatie portul 6881 al masinii noastre:</p>
<p># Accept tcp packets on destination port 6881 (bittorrent)<br />
iptables -A INPUT -p tcp &#8211;dport 6881 -j ACCEPT</p>
<p>Adaugam (-A) regula pentru lantul de INPUT valabila la pachetele protocolului tcp (-p tcp) care acceseaza computerul nostru pe portul 6881 (&#8211;dport 6881).</p>
<p><strong>Combinarea regulilor</strong></p>
<p>Un serviciu foarte utilizat in linux este secure shell (SSH) care permite logarea remote la un statie sau server. Implicit acest serviciu merge peste protocolul tcp si utilizeaza portul 22. Asadar ca sa acceptam logarea remote va trebui sa acceptam conexiuni tcp pe portul 22:</p>
<p># Accept tcp packets on destination port 22 (SSH)<br />
iptables -A INPUT -p tcp &#8211;dport 22 -j ACCEPT</p>
<p>Aceasta comanda deschide portul 22 pentru toate conexiunile tcp de incoming indiferent de sursa lor, ceea ce poate prezenta un pericol de risc deoarece multi atacatori pot incerca fortarea acestui port pentru eventuale conturi cu parole nesigure. De aceea daca stim adresa sursa de unde se doreste conectarea remote prin ssh o putem specifica in regula, scutindu-ne astfel de eventuale surprize. De exemplu daca dorim sa deschidem portul 22 doar pentru conexiuni de incoming avand ca adresa sursa pe oricine din subreteaua (192.168.0.x):</p>
<p># Accept tcp packets on destination port 22 (SSH) from private LAN<br />
iptables -A INPUT -p tcp -s 192.168.0.0/24 &#8211;dport 22 -j ACCEPT</p>
<p>In acest fel portul 22 va aparea ca find inchis pentru oricine nu face parte din aceasta subretea. Chiar si verificarea cu un port scanner va returna portul ca fiind inchis (closed) daca nu este facuta de pe o adresa sursa acceptata.</p>
]]></content:encoded>
			<wfw:commentRss>http://safemode.ro/2010/04/21/introducere-in-iptables-linux-firewall/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

