LinuxForum.Fans
Тема

Как ограничить из сети доступ в Интернет по времени?

Автор: smola 14 сообщений 1813 просмотров
27.12.2020 07:01 #435719

Приветствую всех!
У меня существует проблема: мои дети учатся в школе и никак не делают уроки пока я пропадаю на работе. Днем развлечения — игры, мультики, тик-ток, вацап, а вечером уроки до поздна, мелкий ноет, что не успевает. Короче — достали! Решил я поставить шлюз на debian и ограничить им доступ в Интернет. Чтобы по рабочим дням недели с 9:00 до 18:00 был доступ только к сетевому дневнику и другим образовательным ресурсам по списку, а в другое время — разрешено всё. Только как сделать — точно не знаю. Толи нужно использовать squid, толи через iptables? Думаю все-таки, нужно использовать правила таблицы, только какие — знаний не хватает. Помогите, пожалуйста, советом.

27.12.2020 09:04 #435720

smola, а на роутере это нельзя сделать? Мой Mikrotik точно позволяет, не вникал в подробности, так как малых детей нет, а для котов доступ закрывать не надо :) .

27.12.2020 11:32 #435722

dansguardian выглядит мёртвым.

27.12.2020 12:25 #435723
Wolfenberg написал:

Спасибо, читал эту статью. Мне больше понравились варианты: 1) установить pi-hole и запрещать/разрешать доступы к ресурсам сети с помощью White и Black - листов, попутно включая (pihole enable) и выключая pi-hole по времени; 2) кардинально - установить ОС pfSense и настроить брандмауэр для ip адресов и портов, включая правила по расписанию. Ну, не знаю что лучше, попробую и то, и другое.

27.12.2020 15:14 · отредактировано #435724

Привет. Можно сделать пару исполняемых скриптов с правилами для iptables и запускать поочерёдно через крон. Скрипт с блокировкой нежелательных сайтов покажу ниже, а второй, который разрешает всё - такой же, только без секции "БЛОКИРОВКА нежелательных РЕСУРСОВ".

text

#!/bin/sh

#Включаем форвардинг echo 1 > /proc/sys/net/ipv4/ip_forward

#Пути, интерфейсы и сети ipt="/sbin/iptables" inet="enp0s3" local="enp0s8"

#Очистка iptables $ipt -F $ipt -X $ipt -t nat -F $ipt -t nat -X $ipt -t mangle -F $ipt -t mangle -X

#Всё, кроме INPUT $ipt -P INPUT DROP $ipt -P OUTPUT ACCEPT $ipt -P FORWARD ACCEPT

#Разрешаем lo и уже установленные соединения $ipt -A INPUT -i lo -j ACCEPT $ipt -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

#Разрешаем пинг $ipt -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT

#СЕКЦИЯ БЛОКИРОВКИ НЕЖЕЛАТЕЛЬНЫХ РЕСУРСОВ $ipt -A FORWARD -i $local -m string --string "vk.com" --algo bm -j REJECT $ipt -A FORWARD -i $local -m string --string "ok.ru" --algo bm -j REJECT $ipt -A FORWARD -i $local -m string --string "facebook.com" --algo bm -j REJECT $ipt -A FORWARD -i $local -m string --string "mail.ru" --algo bm -j REJECT $ipt -A FORWARD -i $local -m string --string "yandex.ru" --algo bm -j REJECT

#Секция маскардинга $ipt -A FORWARD -i $inet -o $local -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT $ipt -A FORWARD -i $local -o $inet -j ACCEPT $ipt -t nat -A POSTROUTING -o $inet -j MASQUERADE

#Сохраняем в файл и рестарт $ipt-save -c > /etc/sysconfig/iptables systemctl restart iptables.service

Для проверки не забываем очищать кеш браузера на клиенте за шлюзом.

28.12.2020 08:43 #435725

alex_q_2000, попрошу без политики. Сообщение исправил.

29.12.2020 10:38 #435726
"Rizado" написал:
...а для котов доступ закрывать не надо

Для котов тоже есть iptables, только он полосатый. :) С Наступающим...

29.12.2020 11:23 #435727

alex_q_2000, установка упомянутого Вами приложения, не поверите, попадает в сферу действия Уголовного Кодекса РФ. Напоминаю о правилах:

3.2.22. Запрещается использовать форум в целях, противоречащих законодательству РФ.

Часть сообщения я удалил.

"alex_q_2000" написал:
С Наступающим...

Спасибо, но ещё рановато. Успеем отметить.

29.12.2020 15:29 #435728
"alex_q_2000" написал:
Привет. Можно сделать пару исполняемых скриптов с правилами для iptables и запускать поочерёдно через крон.

Для сервера то пойдёт, но для компа, который не включён постоянно будут проблемы. Пропустил время запуска скрипта и все разрешено. Тогда уж скриптом при загрузке, который будет проверять дату.

29.12.2020 22:48 · отредактировано #435731
ormorph написал:
Для сервера то пойдёт, но для компа, который не включён постоянно будут проблемы. Пропустил время запуска скрипта и все разрешено. Тогда уж скриптом при загрузке, который будет проверять дату.

Несомненно. А поскольку в условии сказано, что ограничения нужны с 09 часов утра до 18 часов вечера именно в рабочие дни (пока автор на работе), то при перезагрузке нужно учитывать ещё и номер дня недели (с 1 по 5). Посему предлагаю 1 скрипт, который будет запускаться при перезагрузке через site-blocker.service и далее каждый час через крон. Костылить, так костылить...

Сервис: /etc/systemd/system/site-blocker.service

text

[Unit]
Description=IPTables Site Blocker Unit
After=network-online.target
Wants=network-online.target

[Service] Type=oneshot ExecStart=/site-blocker.sh

[Install] WantedBy=multi-user.target

Активировать: systemctl enable site-blocker

Мега-Скрипт: /site-blocker.sh

text

#!/bin/bash

#Параметры -----//------------------ hstart="09" #Начало блокировки (час) hend="18" #Конец блокировки (час)

#Пути, интерфейсы inet="enp0s3" local="enp0s8" ipt="/sbin/iptables"

#-----------------//----------------

#Текущий день недели - это рабочий день (Пн-Пт)? budni="no" for i in Пн Вт Ср Чт Пт; do [[ "$i" = "$(date +%a)" ]] && budni="yes"; done

#Включаем форвардинг echo 1 > /proc/sys/net/ipv4/ip_forward

#Очистка iptables $ipt -F; $ipt -X $ipt -t nat -F; $ipt -t nat -X $ipt -t mangle -F; $ipt -t mangle -X

#Всё, кроме INPUT $ipt -P INPUT DROP; $ipt -P OUTPUT ACCEPT; $ipt -P FORWARD ACCEPT

#Разрешаем lo и уже установленные соединения $ipt -A INPUT -i lo -j ACCEPT $ipt -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

#Разрешаем пинг $ipt -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT

#С 09 часов утра до 18 часов вечера по будням (Пн-Пт) пускать с ограничениями if [[ "$(date +%H)" > "$hstart" && "$(date +%H)" < "$hend" && "$budni" = "yes" ]]; then $ipt -A FORWARD -i $local -m string --string "vk.com" --algo bm -j REJECT $ipt -A FORWARD -i $local -m string --string "ok.ru" --algo bm -j REJECT $ipt -A FORWARD -i $local -m string --string "facebook.com" --algo bm -j REJECT $ipt -A FORWARD -i $local -m string --string "mail.ru" --algo bm -j REJECT $ipt -A FORWARD -i $local -m string --string "yandex.ru" --algo bm -j REJECT fi;

#Секция маскардинга $ipt -A FORWARD -i $inet -o $local -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT $ipt -A FORWARD -i $local -o $inet -j ACCEPT $ipt -t nat -A POSTROUTING -o $inet -j MASQUERADE

#Сохраняем в файл и рестарт $ipt-save -c > /etc/sysconfig/iptables systemctl restart iptables.service

exit 0;

Запустить всё это хозяйство: systemctl start site-blocker

Осталось сделать Учёт Праздничных дней, незапланированных выходных, а так же метод быстрого отключения всего этого добра. :D

30.12.2020 09:20 #435732
"alex_q_2000" написал:
Сервис: /etc/systemd/system/site-blocker.service

А вот подсказки детям давать не стоит. Может сначала они и не разберутся как войти под рутом, но потом обязательно смогут. Тем более в linux это довольно просто, зайти на комп с LiveCD(USB), скопировать содержимое "/etc/shadow", сменить пароль, а после вернуть все обратно.
Сервис с таким названием сразу привлечёт внимание. В данном случае, чем запутаннее сделано тем лучше.

А так, можно ещё проще оставить доступ root себе, например оставив где-нибудь лежащий бинарник, дающий такие права(так же как sudo).

30.12.2020 11:12 #435733

alex_q_2000, Вы не предполагаете, что язык интерфейса системы может быть не русским? У меня, кстати, долгое время испанский был.
Вместо «$(date +%a)» лучше использовать «$(date +%u)» и номер от 1 до 5.

05.01.2021 21:15 · отредактировано #435734
"ormorph" написал:
А вот подсказки детям давать не стоит. Может сначала они и не разберутся как войти под рутом, но потом обязательно смогут.

Дети хитрые. Не исключено, что они станут ходить через анонимайзеры или vpn. Через них конечно много не наработаешь (скорость, обрывы)... А касаемо рутового доступа... Мне видится, что автор сделает обычный комп без монитора и клавиатуры, который будет мирно стоять где-нибудь в уголке и выполнять роль "няньки" в плане контроля за доступом. А доступ автору мы предоставим по SSH:22 изнутри + введём защиту от брутфорса (3 неудачных подключения и БАН на 60 сек). Автор, знающий логин и пароль сможет подключиться через Putty. Думаю, для такого варианта особые требования к защите от человеческого фактора предъявлять не стоит. Или стОит? ))

"Rizado" написал:
alex_q_2000, Вы не предполагаете, что язык интерфейса системы может быть не русским? У меня, кстати, долгое время испанский был.
Вместо «$(date +%a)» лучше использовать «$(date +%u)» и номер от 1 до 5.

Абсолютно верно, спасибо! Сейчас поправим... :)

Дополнительно приложу конфиг dnsmasq, чтобы не париться с раздачей настроек по DHCP (если автору понадобится) и открою нужные порты Samba (может быть автор захочет сделать общий диск), SSH, DNS, DHCP в iptables. Таким образом, автору потребуется доустановить openssh-server и dnsmasq (по желанию)...

Скрипт: /site-blocker.sh (вариант-1 без модуля time)

text

#!/bin/bash

#Параметры -----//------------------ hstart="09:00" #Начало блокировки (час) hend="18:00" #Окончание блокировки (час)

#Пути, интерфейсы wan="enp0s3" lan="enp0s8" #-----------------//----------------

#Текущий день недели в списке заблокированных дней (Пн-Пт)? block_day="no"; for i in 1 2 3 4 5; do [[ "$i" = "$(date +%u)" ]] && block_day="yes"; done

#Включаем форвардинг echo 1 > /proc/sys/net/ipv4/ip_forward

#Очистка iptables iptables -F; iptables -X iptables -t nat -F; iptables -t nat -X iptables -t mangle -F; iptables -t mangle -X

#Всё, кроме INPUT iptables -P INPUT DROP; iptables -P OUTPUT ACCEPT; iptables -P FORWARD ACCEPT

#Разрешаем lo и уже установленные соединения iptables -A INPUT -i lo -j ACCEPT iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

#Разрешаем пинг iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT

#Открываем SSH:22 + защита от брутфорса (3 неудачных попытки подключения => бан атакующего на 60 сек) iptables -A INPUT -p tcp --syn --dport 22 -m recent --name sshport --set iptables -A INPUT -p tcp --syn --dport 22 -m recent --name sshport --update --seconds 60 --hitcount 4 -j DROP

#Разрешаем Samba, DHCP/DNS и SSH:22 (dnsmasq, если они будут) iptables -A INPUT -i $lan -p tcp -m multiport --dports 22,137:139,445 -j ACCEPT iptables -A INPUT -i $lan -p udp -m multiport --dports 137:139,445,53,67,68,1024:65535 -j ACCEPT

#С 09:00 часов утра до 18:00 часов вечера по будням (Пн-Пт) пускать с ограничениями if [[ "$(date +%T)" > "$hstart" && "$(date +%T)" < "$hend" && "$block_day" = "yes" ]]; then #Только Web-серфинг (блокировка VPN, Torrent и т.д.) iptables -A FORWARD -i $lan -p udp ! --dport domain -j DROP iptables -A FORWARD -i $lan -p tcp -m multiport ! --dports http,https -j DROP

#Список заблокированных сайтов iptables -A FORWARD -i $lan -m string --string "vk.com" --algo bm -j REJECT iptables -A FORWARD -i $lan -m string --string "ok.ru" --algo bm -j REJECT iptables -A FORWARD -i $lan -m string --string "facebook.com" --algo bm -j REJECT iptables -A FORWARD -i $lan -m string --string "mail.ru" --algo bm -j REJECT fi;

#Секция маскардинга iptables -A FORWARD -i $wan -o $lan -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT iptables -A FORWARD -i $lan -o $wan -j ACCEPT iptables -t nat -A POSTROUTING -o $wan -j MASQUERADE

#Сохраняем в файл и рестарт iptables-save -c > /etc/sysconfig/iptables systemctl restart iptables.service

exit 0;

Скрипт: /site-blocker.sh (вариант-2 с модулем time)

text

#!/bin/bash

#Интерфейсы wan="enp0s3" lan="enp0s8" #-----------------//----------------

#Включаем форвардинг echo 1 > /proc/sys/net/ipv4/ip_forward

#Очистка iptables iptables -F; iptables -X iptables -t nat -F; iptables -t nat -X iptables -t mangle -F; iptables -t mangle -X

#Всё, кроме INPUT iptables -P INPUT DROP; iptables -P OUTPUT ACCEPT; iptables -P FORWARD ACCEPT

#Разрешаем lo и уже установленные соединения iptables -A INPUT -i lo -j ACCEPT iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

#Разрешаем пинг iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT

#Открываем SSH:22 + защита от брутфорса (3 неудачных попытки подключения => бан атакующего на 60 сек) iptables -A INPUT -p tcp --syn --dport 22 -m recent --name sshport --set iptables -A INPUT -p tcp --syn --dport 22 -m recent --name sshport --update --seconds 60 --hitcount 4 -j DROP

#Разрешаем Samba, DHCP/DNS, SSH (dnsmasq и openssh-server, если они будут) iptables -A INPUT -i $lan -p tcp -m multiport --dports 22,137:139,445 -j ACCEPT iptables -A INPUT -i $lan -p udp -m multiport --dports 137:139,445,53,67,68,1024:65535 -j ACCEPT

#Блокировка сайтов по времени и дням (Пн-Пт) block="-m time --weekdays 1,2,3,4,5 --timestart 09:00 --timestop 18:00 -j REJECT"

#Только Web-серфинг (блокировка VPN, Torrent и т.д.) iptables -A FORWARD -i $lan -p udp ! --dport domain $block iptables -A FORWARD -i $lan -p tcp -m multiport ! --dports http,https $block

#Список заблокированных сайтов iptables -A FORWARD -i $lan -m string --string "vk.com" --algo bm $block iptables -A FORWARD -i $lan -m string --string "ok.ru" --algo bm $block iptables -A FORWARD -i $lan -m string --string "facebook.com" --algo bm $block #iptables -A FORWARD -i $lan -m string --string "mail.ru" --algo bm $block #iptables -A FORWARD -i $lan -m string --string "yandex.ru" --algo bm $block

#Секция маскардинга iptables -A FORWARD -i $wan -o $lan -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT iptables -A FORWARD -i $lan -o $wan -j ACCEPT iptables -t nat -A POSTROUTING -o $wan -j MASQUERADE

#Сохраняем в файл и рестарт iptables-save -c > /etc/sysconfig/iptables systemctl restart iptables.service

exit 0;

Раздача настроек локальным клиентам (установить dnsmasq)...

Конфиг: /etc/dnsmasq.conf

text

#Авторитетный DHCP сервер
dhcp-authoritative

#Слушать на интерфейсах ($lan=enp0s8=192.168.1.1+lo) interface=enp0s8 listen-address=127.0.0.1,192.168.1.1

#Не использовать resolv.conf no-resolv

#DNS для раздачи server=8.8.8.8 server=8.8.4.4

#Диапазон выдачи IP-адресов (аренда 72 часа) dhcp-range=192.168.1.20,192.168.1.250,72h

#Отдать параметры клиенту dhcp-option=option:router,192.168.1.1 dhcp-option=option:dns-server,192.168.1.1

#Отключить DHCP_INFO-PROXY для Windows 7+ dhcp-option=252,"\n"

#Настройки кеша DNS cache-size=10000 no-negcache

Добавлено: 31.12.2020 18:01:30

Скрипт: /site-blocker.sh
+ добавлена секция "Только Web-серфинг (блокировка VPN, Torrent, Icq, Skype, Jabber и т.д.)". Разрешены только http и https (+dns)
+ добавлен /site-blocker.sh (вариант-2 с использованием модуля time). SSH:22 по умолчанию
+ /site-blocker.sh (вариант-1 без модуля time) введено отслеживание до минут (формат 00:00). Крон будет дёргать этот скрипт только 2 раза: вначале и в конце блокировки. Правильный интервал 00:00-23:59. Вариант скрипта с использованием модуля time (2) может работать некорректно (--kerneltz) с обновлением ядер.
Добавлено: 01.01.2021 19:49:50

Осталось как-то разобраться с разрывом уже установленного соединения (ESTABLISHED). Сайты блокируются, однако если они ранее были открыты, а правила iptables сменились на блокирующие, они продолжают работать до закрытия. Для чистоты эксперимента нужно бы сделать стремительный отлуп... *WRITE*
Добавлено: 03.01.2021 00:19:11

Небольшой гуй по теме...

Требуются привилегии root и 2 сетевых карты (WAN/LAN).
Требуются пакеты iptables, ipset, bind-utils.

Создаёт:
---
/root/.siteblocker/blacklist - блэклист сайтов
/root/.siteblocker/settings.ini - настройки программы

/usr/local/bin/site-blocker.sh - основной скрипт с правилами iptables
/var/spool/cron/root или /var/spool/cron/crontabs/root - план запуска основного скрипта iptables через crond
/etc/systemd/system/site-blocker.service - сервис автозапуска после перезагрузки (не в курсе, есть ли эта папка в Debian, в Mageia есть)

Кнопка "Рестарт iptables" - применяет выбранный план блокировки сайтов и создаёт вышеуказанные файлы
Кнопка "Сброс" - корректно удаляет основной скрипт, план запуска, сервис автозапуска и возвращает iptables в дефолт
В список можно дополнять свои сайты, удалять, выгружать и загружать из файла (ПКМ).

Здесь...


v1.3 (upd: 04.01.2021)
+сохранение/загрузка blacklist
+оперативное применение списка ipset
+отключение протокола IPv6
+проверка ping перед рестартом iptables

v1.1 (upd: 03.01.2021)
+IPSET - основной метод блокировки (1 сайт = множество ip)
+STRING - дополнительный метод словарной фильтрации
+окружение в плане запуска cron: /var/spool/cron/root
+отлуп и фильтрация сайтов заметно улучшились :)
Добавлено: 05.01.2021 21:15:09

"Rizado" написал:
Спасибо, но ещё рановато. Успеем отметить.

Здравствуйте, Rizado. В Новый Год особо заняться было нечем и... Что-то я здесь приходил-колупал-ковырял; в результате сделал вот это: MgaRemix [флешки, технология сборки] Теперь не знаю, может быть то, что выше уже не нужно? Это я к тому, что вроде как дубляж какой-то вышел... Или нет?

Войдите или зарегистрируйтесь, чтобы ответить.