Posted by Peter

Dzisiaj zajmiemy się kwestią czasem bardzo potrzebną, to znaczy blokowaniem użytkownikom sieci lokalnej dostępu do konkretnych serwisów internetowych. Chodzi o sytuację, kiedy chcemy zablokować możliwość “wchodzenia” tylko na niektóre strony a nie odwrotnie, to znaczy zezwolić tylko na niektóre, a zablokować domyślnie wszystkie.

Dodatkowym założeniem naszego projektu będzie to, że ruch zostanie przekierowany i użytkownik zamiast trafić na stronę typu chomikuj.pl trafi na inną, zdefiniowaną przez nas, np. google.pl lub naszą stronę firmową.

Można to osiągnąć za pomocą tablicy PREROUTING w iptables:

iptables -t nat -A PREROUTING -p tcp -s JAKAŚSIEĆLOKALNA \
-d ADRESDOCELOWY --dport 80 -j DNAT --to ADRESPRZEKIEROWANIA:80
i teraz tak:

JAKAŚSIEĆLOKALNA - nasza siec lokalna, np. 192.168.1.0/24 ADRESDOCELOWY - adres IP strony, na która chce wejść użytkownik ADRESPRZEKIEROWANIA - adres IP, na jaki dostanie się użytkownik w wyniku działania naszej regułki

Wszystko pięknie i w ogóle, ale jak to zrobić jeśli adres, np rapidshare.com ma więcej niż jeden adres IP? tutaj z pomocą przychodzi BASH i skrypt w nim napisany, który wykonuje 2 rzeczy:

  1. zamienia adres domeny ( taki słowny ) na adres IP ( lub więcej adresów, jeśli takowe występują ). Czyni tę magię za pomocą polecenia host -t a NAZWA_DOMENY oraz pętli FOR
  2. dla każdego odnalezionego adresu stosuje regułkę, którą opisałem wcześniej, również za pomocą pętli FOR Żeby Was nie męczyć postanowiłem taki skrypt w BASH'u przygotować. Nie jest może perfekcyjny, ale z pewnością spełnia swoje przeznaczenie i jest wygodny w użyciu :) ( dla chętnych skrypt można ściągnąć tutaj ). Skrypt zamieszczam do wglądu poniżej, ale radzę nie kopiować ( albo robić to rozważnie), ponieważ mogą powstać nieścisłości wynikające z operacji kopiuj/wklej…
    #!/bin/bash

TRYB=$1

zmienne skryptu

SIEC="192.168.1.0/24" #siec lokalna, ktora ma nie meic dostepu do nizej wymienionych stron PORT="80"

port 80 = WWW

PRZEKIEROWANIENA="209.85.135.147" #ustawilem domyslne przekierowanie na strone Google PORTNA="80" #jak wyzej LISTA_STRON="chomikuj.pl wrzuta.pl rapidshare.com megaupload.com" #lista oddzielona spacjami

domyslnie nie sa wyswietlane reguly w czasie dzialania programu

VERBOSE="0"

if [ -n $2 ]; then VERBOSE=$2 fi

case $TRYB in "on") if [ -n "$LISTASTRON" ]; then for STRONY in ${LISTASTRON}; do if [ "$VERBOSE" = "1" ]; then echo $STRONY fi ADRESY=$(host -t a $STRONY | awk '{ printf "%s ", $4 }')

if [ -n "$ADRESY" ]; then for STRONYIP in ${ADRESY}; do if [ "$VERBOSE" = "1" ]; then echo "iptables -t nat -A PREROUTING -p tcp -s $SIEC -d $STRONYIP --dport $PORT -j DNAT --to $PRZEKIEROWANIENA:$PORTNA" fi iptables -t nat -A PREROUTING -p tcp -s $SIEC -d $STRONYIP --dport $PORT -j DNAT --to $PRZEKIEROWANIENA:$PORTNA done fi if [ "$VERBOSE" = "1" ]; then echo "" fi done fi ;; "info") iptables --list PREROUTING -t nat ;; "off") iptables --flush PREROUTING -t nat ;; "-h") echo "Program przyjmuje zmienne: " echo "-h pomoc" echo "on wlaczenie regul" echo "off wylaczenie regul" echo "info informacje o regulach" echo "0/1 w trybie 'on' ukrywanie/wyswietlanie komunikatow" echo "usage: ./blokowaniestron on 1" ;;

*) echo "Nie podano zmiennej trybu. (on/off/info)" exit ;; esac