Блог - Linux, программирование, Я!

linux и системное администрированиеНемного об iptables

Ну достали меня соседи и все тут….

В общаге в блоке один компьютер на 5 человек и тот мой Вот и приходится отбиваться каждый день от желающих посидеть…..

Вконтакте!(((

Но, благодаря некоторым фишкам linux эта проблема меня вряд-ли будет волновать теперь ]:->

И так, немного поковырявшись в просторах интернета, полистав умных книжек и посоветовавшись с парой несомненно продвинутых в этом деле товарищей, принялся ваять….



И вот, собственно, что у меня получилось!

Небольшой такой bash скриптик….

#!/bin/sh
echo "Проверка.."

ping -c3 vkontakte.ru
echo
echo "Запретить/разрешить вконтакт"
echo "Используйте 1 -разблокировать, 0 - блокировать"
read wtd

case "$wtd" in
        1)
                act="-D"
                mesage="Разблокировано!"
        ;;
        0)
                act="-A"
                mesage="Заблокировано!"
        ;;
        *)
                echo "Usage: {start|stop}"
                sleep 5
                exit 1
        esac

ip=235
while [ $ip -le 242 ] ; do

        sudo iptables $act INPUT -s 195.190.105.$ip -j DROP
        echo "iptables $act INPUT -s 195.190.105.$ip -j DROP  / $mesage"
        ip=$(($ip+1))

done;

echo "Ready!"
sleep 5

Теперь о том, что все это значит…..

Для начала, немного о функциях iptables, которые здесь используются…

Эта утилита вызывается так

sudo iptables -A INPUT -s 195.190.105.235  -j DROP

Либо так

sudo iptables -D INPUT -s 195.190.105.235  -j DROP

Здесь, программа запускается от имени администратора ( sudo) В первом случае мы добавляем ( -A) правило запретить ( -j DROP) прием любых пакетов, передаваемых с 195.190.105.235 ( -s 195.190.105.235). Во втором случае мы удаляем это правило ( -D)

Чтобы определить IP адреса, которые принадлежат ненавистному Вконтакту, нужно просто выполнить простую команду

nslookup vkontakte.ru

Которая выдаст нам примерно следующую информацию

_____________________________________

seriy@seriy-desktop:~$ nslookup vkontakte.ru

Server: 172. ##.##.##

Address: 172. ##.##.####



Non-authoritative answer:

Name: vkontakte.ru

Address: 195.190.105.239

Name: vkontakte.ru

Address: 195.190.105.240

Name: vkontakte.ru

Address: 195.190.105.241

Name: vkontakte.ru

Address: 195.190.105.242

Name: vkontakte.ru

Address: 195.190.105.235

Name: vkontakte.ru

Address: 195.190.105.236

Name: vkontakte.ru

Address: 195.190.105.237

Name: vkontakte.ru

Address: 195.190.105.238

--------------------------------------------

Как видим, эти адреса получены из DNS сервера моего провайдера (Адреса этих DNS

Server: 172.##.##.##

Address: 172.##.##.####

не стал показывать, зачем они вам :) ))

Собственно, есть команда, с помощью которой можно заблокировать доступ определенному IP и есть диапазон IP



По большому счету, этого бы нам уже хватило, но хочется чтобы все делалось автоматически да еще и красиво-аккуратно….

Так-что попробуем поизвращаться!

Запускаем мы наш скрипт, он пингует Вконтакт 3 раза ( ping -c3 ) (думаю вполне достаточно) и выводит информацию о доступности сервера (на случай, если он был заблокирован ранее а вы об этом того… забыли в общем), затем просит ввести команду : заблокировать ( 0) или разблокировать ( 1) сайт. Если введен " 0", то в качестве аргумента $act будет подставлен -A , если " 1", то подставится -D а если напечатать какую-нить хрень, то вылезет предупреждающее сообщение и скрипт закроется.

А цикл While позволяет прогнать команду iptables (и заодно контрольного вывода echo) с заданными параметрами по всему требуемому диапазону айпи

Кстати, для проверки "успешности" наших действий можно запустить команду

sudo iptables -L INPUT

Которая выдает (довольно медленно) список правил, которые мы добавили в цепочку INPUT. Если после блокирования сайта выдала что-то вроде этого:

____________________________________

~$ sudo iptables -L INPUT

[sudo] password for seriy:

Chain INPUT (policy ACCEPT)

target prot opt source destination

DROP 0 -- 195.190.105.235 anywhere

DROP 0 -- 195.190.105.236 anywhere

DROP 0 -- 195.190.105.237 anywhere

DROP 0 -- 195.190.105.238 anywhere

DROP 0 -- 195.190.105.239 anywhere

DROP 0 -- 195.190.105.240 anywhere

DROP 0 -- 195.190.105.241 anywhere

DROP 0 -- 195.190.105.242 anywhere

----------------------------------------------------------------

Значит все прошло успешно.

Ну, собственно все! Соседи – берегитесь)))

P.S.: В принципе, все строчки, начинающиеся со слова ping, echo и sleep можно удалить без ущерба работоспособности скрипта, т.к. они добавлены только для удобства работы с ним.

P.P.S.: Вот так выглядит вывод командной строки после запуска скрипта на блокирование сайта:

-------------------------------------

Проверка….

PING vkontakte.ru (195.190.105.235) 56(84) bytes of data.

64 bytes from 195.190.105.235: icmp_seq=1 ttl=55 time=27.1 ms

64 bytes from 195.190.105.235: icmp_seq=2 ttl=55 time=18.5 ms

64 bytes from 195.190.105.235: icmp_seq=3 ttl=55 time=22.9 ms

--- vkontakte.ru ping statistics ---

3 packets transmitted, 3 received, 0% packet loss, time 10049ms

rtt min/avg/max/mdev = 18.533/22.855/27.113/3.507 ms

Запретить/разрешить вконтакт

Используйте 1 -разблокировать, 0 – блокировать

0

iptables -A INPUT -s 195.190.105.235 -j DROP / Заблокировано!

iptables -A INPUT -s 195.190.105.236 -j DROP / Заблокировано!

iptables -A INPUT -s 195.190.105.237 -j DROP / Заблокировано!

iptables -A INPUT -s 195.190.105.238 -j DROP / Заблокировано!

iptables -A INPUT -s 195.190.105.239 -j DROP / Заблокировано!

iptables -A INPUT -s 195.190.105.240 -j DROP / Заблокировано!

iptables -A INPUT -s 195.190.105.241 -j DROP / Заблокировано!

iptables -A INPUT -s 195.190.105.242 -j DROP / Заблокировано!

Ready!

  1. 9i
    2009-04-05 21:36:31 | #

    в топу контакт , аха +1000

  2. 2009-05-29 16:45:10 | #

    > sudo iptables -L INPUT

    > Которая выдает (довольно медленно) список правил

    Это он пытается чего то там ресолвить. Если всякие человекочитабельности не критичны, то можно использовать опцию -n. Тогда выдаётся весьма быстро.

    sudo iptables -L -n INPUT