my first bugyuta firewall script :)

csókolom,

nagyon pirmitív állat vagyok, ha iptables-ről vagy bash scriptekről van szó, de most ezt faragtam így össze, mert ilyesmire volt szükségem.
nézzétek már meg, hogy minden oké-e így! működni működik, de azért lehetnek benne baromságok meg ronda megoldások (amiket IMÁDOK! :D )

ez a szkript rc.local-ból indul, valamint önállóan is meghívható (ezért olyan az eleje, amilyen)

/etc/ipban_script:


#! /bin/sh
IPLISTFILE=/etc/banned_ips

case $(iptables -L -n | grep BANNED) in
	""	) echo "No BANNED chain, creating";
			iptables -N BANNED;
			iptables -A BANNED -j RETURN;
			iptables -A INPUT -j BANNED;;
	*	) echo "Flushing BANNED chain";
			iptables -F BANNED;
			iptables -A BANNED -j RETURN;;
esac

for i in $(cat $IPLISTFILE);
do
	case $i in
		"#"*	) continue;;
		";"*	) continue;;
		""	) continue;;
		*	) iptables -I BANNED -s $i -j DROP; echo "$i banned";;
	esac
done

/etc/banned_ips:


60.217.229.226
200.101.78.136
;123.123.123.123
61.153.176.122

196.15.143.106
#111.222.333.444

kell rajta valamit javítani szerintetek?

Hozzászólások

A sha-bang-ben van egy felesleges szokoz.

Talan ha a for helyett while read-dal dolgozod fel az inputot, elvileg se az ures sorokkal, se a sorkozi space-ekkel sincs gond.
Meg azert nem artana a szokasos valid IP regexppel tesztelni a cimeket.
A biztonsag kedveert a local LAN/trusted IP-kre tennek egy kivetelt.

Abszolut utolso szempont, de a kimenetet logba vagy syslogd-nek ki lehetne tee-zni. Valamint az input file lehetne sort-olva ;-) Meg ugye /etc alatt ne legyen futtathato allomany, az LSB compliance szellemeben ;-)

miaza sha-bang? :) az első sorra gondolsz? a #! és a /bin/sh között?
a valid ip regexp-nek is utánanézek akkor google-n. bár mondjuk a logokban valós ip címek vannak, ezzel nem lehet baj.
logra igazából nincs szükségem, meg amúgy milyen kimenete lenne ennek? ha jól írtam mindent, akkor az iptables nem fog finnyázni, siker esetén meg csak -v -vel adna kimenetet, arra meg nincs szükségem.
az etc alatt amúgy is van futtatható állomány, plédául az rc.local is. de ennek is utánaolvasok azért, bár az ilyen compliance szellemiséget hírből sem ismerem :)

amúgy még azon gondolkoztam (és ez részben a valid ip-hez is kapcsolódhat), hogy a commentezett vagy üres sorok ellenőrzése helyett lehet, hogy úgy csinálom meg, hogy csak azt ellenőrzi, hogy az első karakter szám-e. ezzel kiszűrném kapásból a kommenteket is, üres sorokat is, vagy ha pl. egy sor szóközzel kezdődne valamiért... és akkor csak egy case lenne a 3 helyett.

ja és igazából az lett volna a kérdés, hogy ez a custom chaines megoldás ez mennyire jó/rossz/korrekt/használható? mert nekem így kényelmesnek tűnik, de mivel nem értek hozzá, lehet, hogy valami állati nagy baromságot csinálok (ami azért végső soron működik)

ja és jogos, a sorközi szóköz is megborítja a szkriptet... :)

----------------------------------
feel the beat - it's everywhere!

Bocsi, nem néztem át a scriptedet, szóval remélem semmi harag. :) Úgy értettem, hogy ezzel igazán jó scriptet gyárthatsz rapid módon, persze sorról-sorra át kell nézzed.

********************
"Aki nem backupol az tehetsegtelen :-)"
"...ha nem tévedek!" (Sam Hawkins)
http://holo-media.hu

még egy kérdés:
a rosszindulatú ip címeket átírom úgy, hogy az utolsó oktetet átírom 0-ra és /24, azaz (szerintem) az egész subnetet tiltom így. ez jó, szép, vagy sem? :)

amúgy ez a mostani verzió:


#! /bin/sh
IPLISTFILE=/etc/banned_ips

case $(iptables -L -n | grep BANNED) in
	""	) echo "No BANNED chain, creating";
			iptables -N BANNED;
			iptables -A BANNED -j RETURN;
			iptables -A INPUT -j BANNED;;
	*	) echo "Flushing BANNED chain";
			iptables -F BANNED;
			iptables -A BANNED -j RETURN;;
esac

sort -g -r $IPLISTFILE | while read i;
do
	case $i in
		[0-9]*	) echo -n "Banning $i : "; iptables -I BANNED -s $i -j DROP; if [ $? ]; then echo "OK"; else echo "FAIL"; fi;;
		*	) continue;;
	esac;
done

----------------------------------
feel the beat - it's everywhere!