Ограничение доступ в интернет средствами PfSense 2.0
с последующей переадресацией пользователя на информационную страничку.
(вариант для организации домашних сетей)
Выборочная переадресация пользователей подробно описана тут: http://thin.kiev.ua/index.php?option=com_content&view=article&id=550:pf-vhost&catid=50:pfsense&Itemid=81
Далее нам необходимо создать списки ip адресов (групп) которые беспрепятственно будут выходить в интернет.
Пользователи сети (IP адреса) которых нет в списке, будут перенаправлены на информационную страничку.
Автор идеи и реализатор goliy
1. Создадим текстовый файл aliase0.txt со списком IP адресов на локальном компьютере:
192.168.0.2 192.168.0.3 192.168.0.100 192.168.0.101
|
2. Выкладываем файл на FTP сервер
На момент написания статьи, скрипт при первом запросе отправляет на сервер логин и пароль. Все следующие запросы осуществляет анонимно. Посему, директория куда вы положите файл aliase0.txt должна быть доступна по логину и паролю, и анонимно.
Не стал заморачиваться с vsftpd. Настроил MOZILLA FTP сервер ( подробно ) Указал одну директорию для пользователя и анонимного доступа.
3. Созданим в PfSense, aliase типа "URL table" с именем aliase0
Дабы PfSense не ругался при старте на отсутствие URL-a
директории FTP и HTTP серверов были совмещены.
Firewall: Aliases

Результатом создания aliace, в директории /var/db/aliastables
появится файл одноименный названию алиаса - aliase0.txt
4. Создадим скрипт aliase.sh и выложим его на PfSense
#!/bin/sh cd /var/db/aliastables/ FTP='ftp://my.thin.kiev.ua/alias/' HOST='my.thin.kiev.ua' USER='user' PASSWD='password' ftp -n $HOST > dir<<END_SCRIPT quote USER $USER quote PASS $PASSWD cd alias dir exit END_SCRIPT
#cd /var/db/aliastables while read config do case $config in -*) config=$(echo $config | tr -s " " | cut -d " " -f 9) #Check if file exist if [ -f $config ] then #Fetching file fetch -o $config.'tmp' $FTP$config tmp_file=$config.'tmp'
#Get hashes of files hash0=$(md5 $tmp_file | cut -d " " -f 4) hash1=$(md5 $config | cut -d " " -f 4)
#Compare and replace if files' hashes are different if [ $hash0 != $hash1 ] then #date=$(date "+%Y%m%d%H%M%S") mv $config $config.'backup' mv $tmp_file $config #APPLYING PFCTL /sbin/pfctl -o basic -f /tmp/rules.debug else rm $tmp_file fi else fetch $FTP$config #FUCKING APPLYING PFCTL /sbin/pfctl -o basic -f /tmp/rules.debug fi ;; esac done < dir rm dir |
Скрипт подключается к FTP, находит файл (ы) лежащие на FTP в директории alias.
Сравнивает содержание файла (ов) найденного (ных) на FTP с содержанием одноименного (ых) файла (ов) в /var/db/aliastables
Изменяет содержимое файла (ов) в /var/db/aliastables
Таким образом, при изменении файла aliase0.txt на фтп, изменится и содержимое aliases
Визуально работу скрипта можно увидеть в /var/db/aliastables
Вы увидите файл *.backup

5. Установим пакет Cron и настроим запуск скрипта каждые 5 минут.

6. Создадим два правила Firewall: NAT: Port Forward
Подробно описано http://thin.kiev.ua/index.php?option=com_content&view=article&id=550:pf-vhost&catid=50:pfsense&Itemid=81
Пример правил:

Правила автора goliy

от автора:
Все-таки мне удалось реализовать идею удобного редактирования правил. Осуществил я это путем ограничения доступа в интернет правилами NAT'a (да, может это и выглядит дико, но работает прекрасно). Стандартно все пользователи локальной сети в фаерволе имеют полный доступ в интернет. Правила лишь сортируют определенные ip адреса в трубки для группового ограничения скорости интернета (к примеру, 5 юзеров имеют 5 ip адресов, но используют 1 канал), все остальные пользователи, не учтенные в правилах попадают под общее правило с динамически организующимися трубками под каждый ip своя. Таким образом у всех абсолютно есть инет и все правильно поделены по группам для Limiter'a. Осталось ограничить доступ в интернет тем, кому не нужно его предоставлять. Тут начинаются изобретения. Все началось с темы Выборочная переадресация v2. В итоге получилось следующее. Все пользователи стандартно по всем запросам на 80ый порт переадресовываются на 80ый порт веб-сервера, на котором крутится информационная страница о том, что доступа в интернет нет и о том, как его получить. По всем остальным портам работает переадресация на 0.0.0.0 (считайте, доступ заблокирован). Для определенного списка адресов созданы правила No rdr с алиасами типа URL Table. Эти алиасы ссылаются на файлы на удаленном фтп сервере. На машине с pfsense крутится скрипт, который с определенной периодичностью выкачивает эти файлы алиасов с фтп и сравнивает с текущими. При наличии изменений файлы заменяются новыми, создается бекап заменяемых файлов (на всякий случай, хранится только посл версия, чтобы можно было откатиться) и применяются правила фаервола. Таким образом, чтобы подключить или отключить пользователей достаточно лишь отредактировать текстовый файл на удаленном фтп-сервере! А это тоже могут делать скрипты с заданным алгоритмом  Вот вам и оптимизация процесса подключения-отключения!
Как можно понять, моя подсеть лан 172.22.0.0/23, а на адресе 172.22.0.1 на 22222 порту висит админка, на 80м веб Правила такие: no rdr on igb0 proto tcp from 172.22.0.0/23 to 172.22.0.1 port 22222 no rdr on igb0 proto udp from 172.22.0.0/23 to 172.22.0.1 port 67:68 no rdr on igb0 proto { tcp udp } from 172.22.0.0/23 to any port 53 no rdr on igb0 proto { tcp udp } from $freemen to any no rdr on igb0 proto { tcp udp } from $paid to any no rdr on igb0 proto { tcp udp } from $temp to any no rdr on igb0 proto { tcp udp } from $test to any
rdr on igb0 proto tcp from 172.22.0.0/23 to any port 80 -> 172.22.0.1 no nat on igb0 proto tcp from (igb0) to 172.22.0.0/23 nat on igb0 proto tcp from 172.22.0.0/23 to 172.22.0.1 port 80 -> (igb0)
rdr on igb0 proto tcp from 172.22.0.0/23 to any port 443 -> 0.0.0.0 no nat on igb0 proto tcp from (igb0) to 172.22.0.0/23 nat on igb0 proto tcp from 172.22.0.0/23 to 0.0.0.0 port 443 -> (igb0)
rdr on igb0 proto udp from 172.22.0.0/23 to any -> 0.0.0.0 no nat on igb0 proto tcp from (igb0) to 172.22.0.0/23 nat on igb0 proto tcp from 172.22.0.0/23 to 0.0.0.0 port 1 -> (igb0)
Они еще не до конца проработанны, вот, например, порты tcp нельзя редректитьвсе на 0.0.0.0 - не работает страница информации. И пока я не допер почему, поэтому закрываются только 80ый и 443й. Можно поковырять диапазонами и вычислить, что таки необходимо оставлять открытым, но пока нет возможности столько тестировать.
|
Далее будет достаточно зарезервировать мак адреса ваших пользователей в DHCP и поставить две галочки, дабы пользователи с неизвестным маком не могли подключиться к вашей сети.
обсуждение: http://forum.pfsense.org/index.php/topic,47168.0.html
ссылка на материал: http://thin.kiev.ua/index.php?option=com_content&view=article&id=589:pfsense-20-nat&catid=50:pfsense&Itemid=81
{jcomments on}
|