Freesco, NND, CDN, EOS
http://forum.freesco.pl/

Ograniczenie netu przy za dużej liczbie połączeń
http://forum.freesco.pl/viewtopic.php?f=35&t=10726
Strona 1 z 1

Autor:  Kipa [ sobota, 14 stycznia 2006, 17:19 ]
Tytuł:  Ograniczenie netu przy za dużej liczbie połączeń

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.

Autor:  szmajso [ sobota, 28 stycznia 2006, 14:36 ]
Tytuł:  Pytanie - Ograniczenie netu przy za dużej liczbie połączeń

Witam

Wygląda na to, że Twoje rozwiązanie pomogłoby mi ograniczyć "pazernych" userów. Niestety moja wiedza na temat Freesco ogranicza się do instalacji gotowych pakietów.
Prosiłbym o instrukcję "krok po kroku" jak bałwan jestem podane skrypty (gdzie je umieścić, jakie nazwy nadać, jakie uprawnienie na plikach).
Ewentualnie gdybyś miał odrobinę czasu, czy nie mógłbyś zrobić z tego paczki.

Z góry dziękuje.

Autor:  aruro [ piątek, 22 grudnia 2006, 13:09 ]
Tytuł: 

Witam

Chciałem zastosować to w praktyce ale utknąłem przy komendzie f_blok - której opisu nie mogę znaleźć w tym poście

pozdr
aruro

Autor:  Kipa [ piątek, 22 grudnia 2006, 16:40 ]
Tytuł: 

Ja stosuję przekirowanie z skrypt wygląda tak:
: [/] [] ()
#
# Przekierowanie pakietów z podanego IP na port servera 85.
# w celu wyświetlenia komunikatu.
#
blokuj() {
  if [ "$2" ];then
    par="-i"
  else
    par="-d"
  fi
  # $1 oznacza IP lub nazwe kompa
    ipfwadm -I $par accept -b -S $1 -P tcp -r 85  2>/dev/null
    # jeżeli ma być jakaś zewnętrzna sieć dostępna
    ipfwadm -I $par accept -b -S $1 -P tcp -D <adres_dostępnej_sieci>/<nr_maski>  2>/dev/null
}

if [ $1 ]; then
  blokuj $1
  if [ $2 ]; then
    blokuj $1 $2
    echo "Zablokowano $1 z komunikatem"
  else
    echo "Odblokowano $1 po ostrzeżeniu"
  fi
else
  echo "Brak IP lub nazwy komputera"
fi

Strona 1 z 1 Strefa czasowa UTC+2godz.
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/