Скрипт открытия доступа в Интернет по расписанию на определенные ресурсы (linux iptables)

By | 07.11.2016

Доброго времени суток!
Сегодня мы расскажем о том, как была решена задача блокировки доступа пользователей в Интернет по времени с оставлением необходимых для работы ресурсов.

Дано:

  • Локальная вычислительная сеть (ЛВС) (192.168.0.0/24) с выходом в Интернет через шлюз (192.168.0.1eth1)
  • Выход в Интернет с низкой пропускной способностью канала (2 Мбит/сек) eth0.

Задача:

  1. Запретить всем пользователям(ПК) ЛВС доступ в Интернет после обеда (блокировать доступ в Интернет с 14:00)
  2. Оставить доступ только определенным пользователям (ПК) сопоставив dns-имя ПК с их ip-адресом (например pc1 = 192.168.0.10)
  3. Разрешить заблокированным пользователям (ПК) доступ только на определенные ресурсы.
  4. Разрешить всем пользователям доступ в Интернет на следующий день до 14:00
  5. Автоматизировать включение и выключение блокировки

Решение:

Написать 2 скрипта

pm.sh — (past morning) — будет отвечать за исполнение задач №1,2,3

am.sh — (at morning) — будет отвечать за исполнение задачи №4

Далее приводится листинг bash-скриптов с описанием действий в виде #закомментированных строк:

pm.sh

#!/bin/sh
#Указываем список ПК, которым нужен доступ в интернет по dns-имени через пробел
pcs_dns="pc1 pc2 pc3"
#Указываем список СЕРВЕРОВ, которым нужен доступ в интернет по dns-имени через пробел
srv_dns="gate mail"
#Указываем список сайтов, к которым останется доступ после блокировки Интернета (через пробел)
whitelist="rambler.ru mail.ru"

#Очищаем старый список с ip-адресами
echo -n > /tmp/pcs_dns.txt
echo -n > /tmp/srv_dns.txt

#Запускаем цикл опредления ip для каждого ПК из списка (переменной) pcs_dns до тех пор, пока он не закончиться
for i in $pcs_dns #переменной $i будем поочередно присваивать значения из списка pcs_dns
do
nslookup $i | awk '/^Address: / { print $2 }'| tr -s '\r\n' ' ' >> /tmp/pcs_dns.txt
done
#цикл окончен
#присваиваем значение переменной из файла
pcs_ip=`cat /tmp/pcs_dns.txt`

#Запускаем цикл опредления ip для каждого СЕРВЕРА  из списка (переменной) srv_dns до тех пор, пока он не закончиться
for l in $srv_dns #переменной $i будем поочередно присваивать значения из списка srv_dns
do
nslookup $l | awk '/^Address: / { print $2 }'| tr -s '\r\n' ' ' >> /tmp/srv_dns.txt
done
#цикл окончен
#присваиваем значение переменной из файла
srv_ip=`cat /tmp/srv_dns.txt`

#очищаем все правила iptables
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -t nat -F POSTROUTING

#echo $pcs_ip

#Запускаем цикл добавления правил маскарадинга для ip из списка (переменной) pcs_ip до тех пор, пока он не закончиться
for j in $pcs_ip #переменной $j будем поочередно присваивать значения из списка pcs_ip
do
sudo iptables -v -t nat -A POSTROUTING -s $j/32 -j MASQUERADE
done
#цикл окончен

#Запускаем цикл добавления правил маскарадинга для ip из списка (переменной) srv_ip до тех пор, пока он не закончиться
for k in $srv_ip #переменной $k будем поочередно присваивать значения из списка pcs_ip
do
sudo iptables -v -t nat -A POSTROUTING -s $k/32 -j MASQUERADE
done
#цикл окончен

#Форвардинг между сетями 192.168.0.0/24 и 10.0.0.0/8
iptables -A FORWARD -s 192.168.0.0/24 -d 10.0.0.0/8 -j ACCEPT
iptables -A FORWARD -s 10.0.0.0/8 -d 192.168.0.0/24 -j ACCEPT

#доступ к определенным ресурсам из списка whitelist
#Запускаем цикл добавления разрешенных ресурсов из списка (переменной) whitelist до тех пор, пока он не закончиться
for l in $whitelist #переменной $l будем поочередно присваивать значения из "белого списка" whitelist
do
sudo iptables -v -t nat -A POSTROUTING -s 192.168.0.0/24 -d $l -j MASQUERADE
done
#цикл окончен

#Если хотим пробросить порт из интернета в ЛВС, например Проброс VNC 5900
sudo iptables -t nat -I PREROUTING -p tcp --dport 5900 -j DNAT --to 192.168.0.9:5900
sudo iptables -I FORWARD -p tcp -d 192.168.0.9 --dport 5900 -j ACCEPT

am.sh

#!/bin/sh

#очищаем все правила iptables
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -t nat -F POSTROUTING

#Разрешаем всем доступ в Интернет
sudo iptables -v -t nat -A POSTROUTING -s 192.168.0.0/24 -j MASQUERADE

#Форвардинг между сетями 192.168.0.0/24 и 10.0.0.0/8
iptables -A FORWARD -s 192.168.0.0/24 -d 10.0.0.0/8 -j ACCEPT
iptables -A FORWARD -s 10.0.0.0/8 -d 192.168.0.0/24 -j ACCEPT

#Если хотим пробросить порт из интернета в ЛВС, например Проброс VNC 5900
sudo iptables -t nat -I PREROUTING -p tcp --dport 5900 -j DNAT --to 192.168.0.9:5900
sudo iptables -I FORWARD -p tcp -d 192.168.0.9 --dport 5900 -j ACCEPT

Далее необходимо автоматизировать блокировку (разблокировку). Для этого, будем использовать планировщик cron. Для добавления задания запускаем команду:

sudo crontab -e

и добавляем внизу файла две строки:

00 08 * * 1-5 /home/user/am.sh
00 14 * * * /home/user/pm.sh

первая означает: запускать скрипт /home/user/am.sh с Понедельника по Пятницу в 08:00

вторая означает: запускать скрипт /home/user/pm.sh с каждый день в 14:00

сохраняем и ждем выставленное в задании время. После применения скрипта, можно проверить его работу используя команды:

iptables -nvL -t nat
iptables -L -n -v

На этом задача по блокированию доступа в Интернет с дополнительными условиями выполнена, спасибо за внимание.

Поделиться!