Napisałem taki skrypcik, aby dać szansę normalnym użytkownikom sieci na korzystanie z internetu.
Tym którzy nie liczą się z innymi, net jest czasowo blokowany, więc po pewnym czasie zmieniają ustawienia swoich programów P2P.
Na początek skrypcik który zamieni nazwę użykownika na IP wg hosts
nazwa:
f_ip <nazwa_kompa>
# by KIPA :-)
# Jakie IP ma dany komputer na podstawie hosts.
#
# zwraca IP
i=8 # --- nr linii od której zaliczać hosts
s=3 # --- ile pustych lini na stop
. /etc/system.cfg
f=$s # --- liczenie pustych lini od nowa
while [ "$f" -gt 0 ]; do # --- do odczytu tylu pustych ile podaje stop
i=$(expr $i + 1) # --- nastepna linia
l=`sed -n $i,//l /etc/hosts` # --- czytaj linie
[ "$l" ] || f=$(expr $f - 1) # --- zalicz pusta
ii=0 # --- wyzeruj licznik wyrazow
for w in $l; do # --- wyrazy w linii
ii=$(expr $ii + 1) # --- kolejny wyraz
case $ii in
1)
# --- nr IP
[ "$w" = "#" ] && ii=3 # --- przeskocz komentarz
if [ "$w" -eq "$NETWORK1" ]; then else ii=3; fi # --- przeskocz inne IP
komp=$w
;;
2)
# --- nazwa kompa
if [ "$1" = $w ]; then
echo $komp
fi
f=$s # --- pełna wartosc stop, linia niepusta
;;
esac
done
done
Jak mamy IP możemy policzyć ile dane IP ma otwartych połączeń, jest to wrtość chwilowa, ale wg mnie wystarczy.
nazwa:
f_ilesock <IP_kompa># by KIPA :-)
# Ile dany komputer ma otwartych połączeń w sieci.
#
# zwraca ilosc_połączeń
if [ $1 ]; then
ii=0
l_komp=0
for i in `ipfwadm -Mln`; do
ii=$(expr $ii + 1)
case $ii in
3)
if [ "$i" = $1 ]; then
l_komp=$(expr $l_komp + 1)
fi
ii=0
;;
esac
done
# wynik sprawdzenia $l_komp
echo $l_komp
else
echo "Brak IP lub nazwy komputera"
fi
No to przyda się test ile który komp pootwierał połączeń (produkt uboczny)
nazwa:
f_lsock <nazwa_kompa># --- Wyświetla na podstawie /etc/hosts
# czytanego linijka po linijce
# ilość otwartych połączeń w danej chwili
# by Kipa :-)
i=8 # --- nr linii od której zaliczać hosts
s=3 # --- ile pustych lini na stop
. /etc/system.cfg
f=$s # --- liczenie pustych lini od nowa
while [ "$f" -gt 0 ]; do # --- do odczytu tylu pustych ile podaje stop
i=$(expr $i + 1) # --- nastepna linia
l=`sed -n $i,//l /etc/hosts` # --- czytaj linie
[ "$l" ] || f=$(expr $f - 1) # --- zalicz pusta
ii=0 # --- wyzeruj licznik wyrazow
for w in $l; do # --- wyrazy w linii
ii=$(expr $ii + 1) # --- kolejny wyraz
case $ii in
1)
# --- nr IP
[ "$w" = "#" ] && ii=3 # --- przeskocz komentarz
if [ "$w" -eq "$NETWORK1" ]; then else ii=3; fi # --- przeskocz inne IP
ls=`f_ilesock $w`
;;
2)
# --- nazwa kompa
komp=$w
if [ "$ls" -gt 0 ]; then
echo "$komp - $ls połączeń"
fi
f=$s # --- pełna wartosc stop, linia niepusta
;;
esac
done
done
Wracając do tematu coś co okresowo blokuje, czyli wywołuje funkcję
f_blok <nazwa_kompa> [on] wraz z zapisem w logach.
nawa:
fork f_tblok <nazwa_kompa> [<sek>]# by KIPA :-)
# czasowo blokuje kompa - ochrona sieci.
# parametr $1 - nazwa kompa
# parametr $2 - czas blokowania
# parametr $3 - ile połączeń
# ustalenie wartości domyślnych
if [ "$2" ]; then
t_user=$2
else
t_user=360
fi
if [ $1 ]; then
T=`/bin/date +%X" "%d.%m.%Y`
echo "$T $1 $3 połączeń blok na $2 sek.">>/mnt/router/log/blok
f_blok $1 on 2>/dev/null
sleep $2
f_blok $1 2>/dev/null
fi
Teraz okresowo uruchomiony taki skrypt i zadanie wykonane. Komputery do sprawdzenie wg listy w pliku
/etc/kaza.komp gdzie 50 to limit połączeń. Można to wsadzić do parametru i wartość domyśłną, ale powyżej są takie przykłdy więc każdy może przerobić i nazwać procedurę. Ja to wsadziłem do swich
rules więc ma taką postać.
for komp in `cat /etc/kaza.komp`; do
ip=`f_ip $komp`
ls=`f_ilesock $ip`
if [ "$ls" -gt 50 ]; then
fork f_tblok $komp 360 $ls 2>/dev/null
fi
done
Napisałem, bo kiedyś ktoś pytał, więc może się przyda.