top
logo


Ограничение доступ в интернет средствами PfSense 2.0 PDF Печать E-mail
17.04.12 14:08

Ограничение доступ в интернет средствами 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 крутится скрипт, который с определенной периодичностью выкачивает эти файлы алиасов с фтп и сравнивает с текущими. При наличии изменений файлы заменяются новыми, создается бекап заменяемых файлов (на всякий случай, хранится только посл версия, чтобы можно было откатиться) и применяются правила фаервола.
Таким образом, чтобы подключить или отключить пользователей достаточно лишь отредактировать текстовый файл на удаленном фтп-сервере! А это тоже могут делать скрипты с заданным алгоритмом Wink
Вот вам и оптимизация процесса подключения-отключения!

 

 

Как можно понять, моя подсеть лан 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}

Последнее обновление 05.10.12 09:54
 
Интересная статья? Поделись ей с другими:

bottom

 

Unreal Commander PfSense по русски Яндекс.Метрика