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

linux на десктопеНемного об iptables

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

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

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

И вот, собственно, что у меня получилось!
Небольшой такой bash скриптик....

[codesyntax lang="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[/codesyntax]

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

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

[codesyntax lang="bash"]sudo iptables -A INPUT -s 195.190.105.235 -j DROP[/codesyntax]

Либо так

[codesyntax lang="bash"]sudo iptables -D INPUT -s 195.190.105.235 -j DROP[/codesyntax]

Здесь, программа запускается от имени администратора ( sudo) В первом случае мы добавляем ( -A) правило запретить ( -j DROP) прием любых пакетов, передаваемых с 195.190.105.235 ( -s 195.190.105.235). Во втором случае мы удаляем это правило ( -D)
Чтобы определить IP адреса, которые принадлежат ненавистному Вконтакту, нужно просто выполнить простую команду
[codesyntax lang="bash"]nslookup vkontakte.ru[/codesyntax]

Которая выдаст нам примерно следующую информацию
_____________________________________
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) с заданными параметрами по всему требуемому диапазону айпи

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

[codesyntax lang="bash"]sudo iptables -L INPUT[/codesyntax]

Которая выдает (довольно медленно) список правил, которые мы добавили в цепочку 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