Блокировка сайтов на Desktop без squid

Материал из Belgorod Linux User Group - Белгород

Перейти к: навигация, поиск

Блокировка сайтов на Desktop без squid

Установил Debian на домашнем ПК и сразу возник вопрос о том как ограничить доступ к некоторым сайтам своим детям.
Можно было поднять сквида, но ведь это же домашний комп!

И по этой причине делаем всё через скрипт прописывающий правила в firewall посредствам iptables.
Скажу сразу, что самый простой способ заблокировать пару сайтов - это вписать их имена в /etc/hosts
для примера заблокируем одноклассников. Из консоли с правами root даём ниже указанную команду.

 # echo "127.0.0.1 odnoklassniki.ru" >> /etc/hosts


Далее скрипт более сложный

Предназначен для простейшей защиты Desktop-а от сетевых атак,
а также для блокировки сайтов по URL и IP-адресу из чёрного списка.


Чёрный список - это обычный текстовый файл в каталоге /etc/firewall
Список URL - файл black_url
Список IP-адресов - файл black_ip


Синтаксис файлов black_ip и black_url одинаков и прост:
одна строка - один ip-адрес или URL
Лишние пробелы и пустые строки скрипт убирает сам при инициализации.


Установка:


Скопируйте скрипт в каталог /etc/init.d
Если необходимо измените сетевые параметры в скрипте
т.е. сетевой интерфейс (здесь eth0) и ip-адреса доверенных машин из
локальной сети (здесь 192.168.1.xxx).
Назначте права на скрипт chmod 750 /etc/init.d/firewall
Создайте каталог /etc/firefall и в нём два файла
black_ip и black_url
Назначте права chmod 750 -R /etc/firewall
Включите скрипт firewall в автозагрузку системы:
update-rc.d -f firewall defaults
Добавьте, если необходимо, блокируемые URL и IP-адреса в чёрные списки
После изменения чёрных списков скрипт необходимо рестартовать!


Использование:


Запуск скрипта firewall происходит вместе с операционной системой.
Если необходимо стартовать скрипт вручную, то синтаксис таков:
/etc/init.d/firewall start
Ручной стоп:
/etc/init.d/firewall stop
Перезапуск:
/etc/init.d/firewall restart
Вывод справки:
/etc/init.d/firewall --help


Скрипт firewall

#!/bin/sh
### BEGIN INIT INFO
# Provides:          iptables
# Required-Start:    $syslog $network $time
# Required-Stop:     $syslog $network
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start iptables at boot time
# Description:       Enable service provided by iptables.
### END INIT INFO

# Задаем некоторые переменные:

# Переменная, задающая путь к файлу запуска iptables.

IPT="/sbin/iptables"

# Ваш сетевой интерфейс. Это нужно, чтобы не писать в правилах одно и тоже.
INET_IFACE="eth0"

# Функция задающая правила для firewall по средствам iptables

start_fw()
{
# Включить перенаправление пакетов через ядро.
echo 1 > /proc/sys/net/ipv4/ip_forward

# Сбросить правила и удалить цепочки.
$IPT -F
$IPT -X

# Политики по умолчанию.
$IPT -P INPUT DROP
$IPT -P FORWARD ACCEPT
$IPT -P OUTPUT ACCEPT


# Запрещаем сайты из чёрного списка хранящегося в файле /etc/firewall/black_url

if [ -f /etc/firewall/black_url ] ;
then
# удаляем все пробелы, табуляцию и пустые строки
cat < /etc/firewall/black_url | sed 's/^[ \t]*//;s/[ \t]*$//;/./!d' > /tmp/firewall.tmp
rm /etc/firewall/black_url
mv /tmp/firewall.tmp /etc/firewall/black_url
cat /etc/firewall/black_url | while read line
do
$IPT -A INPUT -m string --string "$line" --algo kmp --to 65535 -j DROP
done
fi

# Запрещаем сайты по ip-адресу из чёрного списка в файле /etc/firewall/black_ip

if [ -f /etc/firewall/black_ip ] ;
then
# удаляем все пробелы, табуляцию и пустые строки
cat < /etc/firewall/black_ip | sed 's/^[ \t]*//;s/[ \t]*$//;/./!d' > /tmp/firewall.tmp
rm /etc/firewall/black_ip
mv /tmp/firewall.tmp /etc/firewall/black_ip
cat /etc/firewall/black_ip | while read line
do
$IPT -A INPUT -s $line -j DROP
done
fi

# Разрешаем прохождение любого трафика по интерфейсу обратной петли.
$IPT -A INPUT -i lo -j ACCEPT
$IPT -A OUTPUT -o lo -j ACCEPT

# Отбрасывать все пакеты, которые не могут быть идентифицированы и поэтому
# не могут иметь определенного статуса.
$IPT -A INPUT   -m state --state INVALID -j DROP
$IPT -A FORWARD -m state --state INVALID -j DROP

# Принимать все пакеты, которые инициированы из уже установленного соединения,
# и имеющим признак ESTABLISHED.
# Состояние ESTABLISHED говорит о том, что это не первый пакет в соединении.
$IPT -A INPUT   -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT


# Разрешаем весь трафик внутри вашего ПК и между вашим ip-адресом и некоторыми адресами
# локальной сети
$IPT -A INPUT -s 127.0.0.1 -j ACCEPT # ip-адрес локальной петли - ваш ПК
$IPT -A INPUT -s 192.168.1.1 -j ACCEPT # этот ip и три снизу - это адреса локалки можно
# дописывать по аналогии
$IPT -A INPUT -s 192.168.1.2 -j ACCEPT
$IPT -A INPUT -s 192.168.1.3 -j ACCEPT
$IPT -A INPUT -s 192.168.1.4 -j ACCEPT

# ICMP - перенаправление
# ICMP - сообщение указывает системе изменить содержимое таблиц маршрутизации с тем,
# что бы направлять пакеты по более короткому маршруту. Может быть использовано
# взломщиком для перенаправления вашего трафика через свою машину.
$IPT -A INPUT --fragment -p ICMP -j DROP
$IPT -A OUTPUT --fragment -p ICMP -j DROP

# Разрешаем  ICMP соединение. Значительная часть ICMP используется для передачи сообщений о
# том, что происходит с тем или иным UDP или TCP соединением.
$IPT -A INPUT -p icmp -m icmp -i $INET_IFACE --icmp-type source-quench -j ACCEPT
$IPT -A OUTPUT -p icmp -m icmp -o $INET_IFACE --icmp-type source-quench -j ACCEPT

# Разрешаем прохождение DHCP запросов через iptables. Нужно, если IP адрес динамический.
#$IPT -A OUTPUT -p udp -m udp -o $INET_IFACE --dport 67 --sport 68 -j ACCEPT
#$IPT -A INPUT -p udp -m udp -i $INET_IFACE --dport 68 --sport 67 -j ACCEPT

$IPT -A INPUT -i $INET_IFACE -j DROP

}

case "$1" in
start)	echo -n "Starting firewall: iptables"
	start_fw
        echo "."
	;;
stop)	echo -n "Stopping firewall: iptables"
	iptables -F
	iptables -X
        echo "."
        ;;
restart) echo -n "Restarting firewall: iptables"
	iptables -F
	iptables -X
	start_fw
        echo "."
        ;;
--help) echo "Скрипт firewall"
	echo
	echo " Предназначен для простейшей защиты Desktop-а от сетевых атак,"
	echo " а также для блокировки сайтов по URL и IP-адресу из чёрного списка."
	echo
	echo " Чёрный список - это обычный текстовый файл в каталоге /etc/firewall"
	echo " Список URL - файл black_url"
	echo " Список IP-адресов - файл black_ip"
	echo
	echo " Синтаксис файлов black_ip и black_url одинаков и прост:"
	echo "  одна строка - один ip-адрес или URL"
	echo " Лишние пробелы и пустые строки скрипт убирает сам при инициализации."
	echo
	echo "Установка:"
	echo
	echo " Скопируйте скрипт в каталог /etc/init.d"
	echo " Если необходимо измените сетевые параметры в скрипте"
	echo " т.е. сетевой интерфейс (здесь eth0) и ip-адреса доверенных машин из"
	echo " локальной сети (здесь 192.168.1.xxx)."
	echo " Назначте права на скрипт chmod 750 /etc/init.d/firewall"
	echo " Создайте каталог /etc/firefall и в нём два файла"
	echo " black_ip и black_url"
	echo " Назначте права chmod 750 -R /etc/firewall"
	echo " Включите скрипт firewall в автозагрузку системы:"
	echo "  update-rc.d -f firewall defaults"
	echo " Добавьте, если необходимо, блокируемые URL и IP-адреса в чёрные списки"
	echo " После изменения чёрных списков скрипт необходимо рестартовать!"
	echo
	echo "Использование:"
	echo
	echo " Запуск скрипта firewall происходит вместе с операционной системой."
	echo " Если необходимо стартовать скрипт вручную, то синтаксис таков:"
	echo "  /etc/init.d/firewall start"
	echo " Ручной стоп:"
	echo "  /etc/init.d/firewall stop"
	echo " Перезапуск:"
	echo "  /etc/init.d/firewall restart"
	echo " Вывод справки:"
	echo "  /etc/init.d/firewall --help"
	echo
	;;
*)	echo "Использование: /etc/init.d/firewall start|stop|restart"
	echo "Чёрный список блокируемых URL находится в /etc/firewall/black_url"
	echo "Чёрный список блокируемых IP-адресов находится в /etc/firewall/black_ip"
	echo "Вывод справки:"
	echo " /etc/init.d/firewall --help"
	echo
        exit 1
        ;;
esac
exit 0


Вот, собственно и всё! Было бы интересно увидеть доработки, как идея - это белый список.

Личные инструменты