ot Vladsun(24-10-2006)

reiting (12)   [ dobre ]  [ zle ]

Printer Friendly Variant za otpechatvane

1. Uvod

Statiiata ima za tsel da populiarizira izpolzvane na moshtniia instrument za filtrirane v iptables - ipset. Blagodaria na Nasko (atanas __tochka__ tsonkov (a) gmail __tochka__ com) za nasokata, koiato mi dade v edna moia predishna statiia.
Obiasneniia po otnoshenie na IPMARK i suotvetniiat nachin na polzvaneto mu suvmestno s tc mozhete da namerite v Optimizatsiia na iptables i tc pravila.
Poveche informatsiia za vuzmozhnostite na ipset mozhete da namerite v http://ipset.netfilter.org ili "man ipset".
Predimstvoto pri polzvane na ipset, suvmestno s iptables, se izraziava v povishenata proizvoditelnost pri edni i sushti sistemni resursi. Tova se dulzhi na fakta, che ipset izpolzva heshirane za da opredeli dali daden adres (src/dst) na konkreten paket se namira v opredeleno mnozhestvo ili ne. Pri iptables tova stava s lineino tursene, koeto e mnogo neefektivno.
Predimstvata pri izpolzvane na ipmark, suvmestno s tc, sa razgledani v gorespomenatata statiia.

2. Instalatsiia

Sledvaite instruktsiite dadeni v http://ipset.netfilter.org/install.html i traditsionnoto pachvane s PoM - ./runme IPMARK. Pri men sled niakolko opita vsichko (iptables, ipset i ipmark) mina dobre s iadro 2.6.15.7. Sled uspeshniia opit ne sum pravil proverka, dali s drugi, po-novi iadra kompilatsiiata minava dobre.

3. Prilozhenie

3.1. Razdeliane/markirane na mezhdunaroden i bulgarski trafik

V skriptove izpolzvani s tazi tsel, koito sum vizhdal, ne se izpolzva IPSET (osven v primerite na Nasko). Vednaga davam primer kak da stane tova:
Primeren kod
 # Init iptables
 # eth0 - external interface
 # eth1 - internal interface
 
 iptables -F -t filter
 iptables -F -t nat
 iptables -F -t mangle
 iptables -F -t raw
 
 iptables -X -t filter
 iptables -X -t nat
 iptables -X -t mangle
 iptables -X -t raw
 
 iptables -Z -t filter
 iptables -Z -t nat
 iptables -Z -t mangle
 iptables -Z -t raw
 
 # Init ipset
 ipset -F
 ipset -X
 
 #Set default policy for chain FORWARD to DROP
 iptables -P FORWARD DROP
 
 #Create empty user defined chains
 iptables -N TRAF_IN -t mangle
 iptables -N TRAF_OUT -t mangle
 
 iptables -N BG_IN -t mangle
 iptables -N BG_OUT -t mangle
 
 iptables -N INT_OUT -t mangle
 iptables -N INT_IN -t mangle
 
 # Mark all packets MARK 1
 iptables -A FORWARD -t mangle -j MARK --set-mark 1
 
 iptables -t mangle -A FORWARD -i eth1 -o eth0 -j TRAF_OUT
 iptables -t mangle -A FORWARD -i eth0 -o eth1 -j TRAF_IN
 # Local traffic is considered BG
 iptables -t mangle -A FORWARD -i eth1 -o eth1 -j BG_IN
 iptables -t mangle -A FORWARD -i eth1 -o eth1 -j BG_OUT
 
 
 ipset -N BG_NETS nethash
 for i in `cat /etc/bgnets`; do
 ipset -A BG_NETS $i
 done
Purvo initsializirahme iptables tablitsite i ipset spisutsite. Sled tova suzdadohme verigi za vhodiasht/izhodiasht trafik, suotvetno mezhdunaroden/bulgarski trafik.
Suzdadohme adresen spisuk na prefiksite na mrezhite v bulgarskoto Internet prostranstvo.
Sledvashtata stupka e da markirame trafika na vseki otdelen potrebitel. Neka imame sluchai s edna S-klas mrezha:
Primeren kod
$ipt="iptables"
 $ips="ips"
 
 #####################################################################################################################
 #       BG Traffic
 #####################################################################################################################
 
 $ipt -t mangle -A TRAF_IN -m set --set BG_NETS src -j BG_IN
 $ipt -t mangle -A TRAF_OUT -m set --set BG_NETS dst -j BG_OUT
 
 $ipt -A BG_IN -t mangle -d 90.0.0.0/24 -j IPMARK --addr=dst --and-mask=0xff --or-mask=0x10100
 $ipt -A BG_OUT -t mangle -s 90.0.0.0/24 -j IPMARK --addr=src --and-mask=0xff --or-mask=0x10200
 
 # Global BG traffic
 $ipt -A BG_OUT -t mangle -j RETURN
 $ipt -A BG_IN -t mangle -j RETURN
 
 #####################################################################################################################
 #       International Traffic
 #####################################################################################################################
 
 $ipt -A TRAF_IN -t mangle -m mark --mark 1 -j INT_IN
 $ipt -A TRAF_OUT -t mangle -m mark --mark 1 -j INT_OUT
 
 $ipt -A INT_IN -t mangle -d 90.0.0.0/24 -j IPMARK --addr=dst --and-mask=0xff --or-mask=0x10300
 $ipt -A INT_OUT -t mangle -s 90.0.0.0/24 -j IPMARK --addr=src --and-mask=0xff --or-mask=0x10400
 
 # Global INT traffic
 $ipt -A INT_OUT -t mangle -j RETURN
 $ipt -A INT_IN -t mangle -j RETURN
S tova vsichkite neobhodimi deistviia za markirane na upload/download, bulgarski/mezhdunaroden trafik za vsako otdelno IP ot edna S-klas mrezha. S neobhodimite filtri i klasove v tc (kakto e opisano v dadenata po-gore statiia) tsialata sistema za ogranichavane na trafika e zavurshena.

3.2. Kontrol vurhu Internet dostupa

V tazi chast shte razgledame kak da kontrolirame Internet dostupa na vseki potrebitel. Otnovo shte izpolzvame ipset:
Primeren kod
#####################################################################################################################
 #        FORWARD Chain
 #####################################################################################################################
 # Accept packets between local nets
 $ipt -A FORWARD -i eth1 -o eth1 -j ACCEPT
 
 $ips -N FW_90_0_0_0 ipmap --network 90.0.0.0/24
 
 $ipt -A FORWARD -m set --set FW_90_0_0_0 src -j ACCEPT
 $ipt -A FORWARD -m set --set FW_90_0_0_0 dst -j ACCEPT
Suzdadohme adresen spisuk, koito za momenta e prazen i dostuput do Internet na vsichki IP-ta ot tazi mrezha e zabranen.
Razreshavaneto na dostupa do Internet za IP ot tazi mrezha stava chrez edna edinstvena komanda:
Primeren kod
$ips -A FW_90_0_0_0 90.0.0.XXX
Edin "trik" izpolzvan ot mnogo Internet dostavchitsi e da prenasochvat port 80 kum tehen Web surver za da pokazhat tiahna stranitsa na potrebitelia prikanvasht go kum podnoviavane na abonamenta. Tova pak stava izklyuchitelno lesno s izpolzvaneto na IPSET:
Primeren kod
### Always allow our servers ###
 $ips -N PRE_ACCEPT iphash
 $ips -A PRE_ACCEPT 90.0.0.1 ### ISP's WWW server
 
 $ipt -t nat -A PREROUTING -i eth1 -m set --set PRE_ACCEPT dst -j ACCEPT
 
 $ips -N PRE_90_0_0_0 ipmap --network 90.0.0.0/24
 
 $ipt -t nat -N WARNPAGE
 $ipt -t nat -A WARNPAGE -p tcp --dport 80 -j DNAT --to 90.0.0.1:80
 $ipt -t nat -A WARNPAGE -j DROP
 
 ### Account check ###
 $ipt -t nat -A PREROUTING -i eth1 -m set --set PRE_90_0_0_0 src -j WARNPAGE
Tozi put deistvieto za "razreshavane" na IP e obratno - triabva da go niama v spisuka PRE_90_0_0_0. Za zabrana izpolzvame:
Primeren kod
$ips -A PRE_90_0_0_0 90.90.0.HHH


3.3. MAC/IP filtrirane

IPSET pozvoliava suzdavane na spisuk ot IP/MAC chiftove. Po tozi nachin mozhem da kontrolirame (v izvestna stepen) korektnoto izpolzvane na Internet dostupa ot vseki potrebitel. V primera otnovo e izpolzvano prenasochvane na trafika za port 80 kum definirana ot vas stranitsa.
Primeren kod
#####################################################################################################################
 #        PREROUTING Chain
 #####################################################################################################################
 
 $ips -N MACS_90_0_0_0 macipmap --network 90.0.0.0/24
 
 ### MAC/IP check ###
 $ipt -t nat -N MACIPS
 
 $ipt -t nat -A PREROUTING -i eth1 -s 90.0.0.0/24 -j MACIPS
 
 $ipt -t nat -A MACIPS -i eth1 -m set --set MACS_90_0_0_0 src -j RETURN
 
 $ipt -t nat -A MACIPS -m limit --limit 1/m --limit-burst 2 -j LOG --log-level info --log-prefix ' ### MAC-IP ### '
 $ipt -t nat -A MACIPS -j WARNPAGE

Vuv faila /var/log/messages shte namerite suobshteniiata za nesuotvetstvashtite IP/MAC chiftovete. Dobaviane na MAC/IP chift stava po sledniia nachin:
Primeren kod
$ips -A MACS_90_0_0_0 90.0.0.IP%MAC

V statiiata ne sa razgledani vuzmozhnostite na IPSET za suzdavane na adresni spisutsi svurzani sus spisutsi na portove. Tova ostaviam na vas :P.



<< Domashnata bezzhichna mrezha i ADSL na BTK | Dostup do ueb resursi chrez H.509 identifikatsiia >>