Pull to refresh

Простая авторизация пользователей для доступа в интернет с помощью ipfw

Reading time3 min
Views12K
Любая сеть рано или поздно начинает гранить с другой сетью, раньше так было. Сейчас же, создавая корпоративную сеть какой либо организации, она вряд ли не будет соединяться с сетью Интернет. Поэтому первым и основным сервером, который будет организован является роутер.

Так как я не полюбил Linux, хотя скажу чесно начинал с него, я давно для себя в качестве серверной ОС выбрал FreeBSD. Но как настроить маршрутизация на freebsd в интернетах информации достаточно. А вот если Вам надо выпустить в интернет не только известные(доверенные) Вам устройства, но и новые, которые должны авторизоваться. К примеру это общественное место, кафе или отель.


Что же мы имеем?


А в начале мы имеем роутер и сеть с проводным и беспроводным доступом, все же умеют заплетать провода? Естественно лучше запретить общаться им между собой, но как это реализовать щас рассматривать не будем, так как у всех свои игрушки и вариантом много.

Попадая в сеть, пользователь не должен быть просто заблокирован. Иначе он не будет знать что ему делать и будет загнан в угол, поэтому банально deny all from all to all нам не подойдет. Поэтому надо всех неизвестных нам личностей перенаправлять на один сайт, где уже будут все инструкции и будет производиться авторизация.

Есть два варианта…
Первый, весь трафик прогонять через прокси и там уже разбираться кто друг, а кто враг и что кому отдавать в качестве ответа. Но при текущем положении дел, когда объем информации получаемый пользователем настолько огромен, а цены на безлимитные тарифы позволяют ими пользоваться даже юридическим лицам на хороших скоростях, то смысла в аккумулировании информации на своих носителях информации я не вижу.

Поэтому я пошел вторым путем, а именно фаерволл решает кому куда идти. Вот как выглядит мое решение в ipfw.

Я использую ipnat. Поэтому в ipfw будут фигурировать правила на разрешения трафика идущего во внешнюю сеть, но не будет правил для заворота его, как в случаи с natd. Мы создаем таблицу пользователей которых будем выпускать во внешнюю сеть:
ipfw table 1 add 192.168.0.1
ipfw table 1 add 192.168.0.2

Дальше будет правило на разрешения трафика в интернет через внешний интерфейс rl1:
ipfw add allow ip from table\(1\) to any out via rl1 keep-state

Теперь все известные наши машины могут пользоваться интернетом. Однако новые клиенты просто получает сообщение об ошибке, что сервер не найден.

Для них у нас будет свое правило:
ipfw add fwd 127.0.0.1, 9832 ip from not table\(1\) to any out via rl1

Тем самым мы перенаправили весь трафик от неизвестных нам пользователей на порт 9832. А на нем мы повесим веб-сервер с нужной нам информацией.

Небольшое отступление: fwd заворачивает пакет на указанный адрес, но не модифицирует его. И если его завернуть на какой нить веб-сервер в сети, то тот его просто отбракует. Потому что адрес назначения не его. Отсюда вывод, что перехватить и обработать данные можно только локально.

Так как это не полноценный веб-сервер, то смысла вешать туда apache или ngnix не вижу. Я бы порекомендовал посмотреть в сторону microhttpd, minihttod или lighthttpd.

Сразу не забываем добавить правило для разрешения трафика внутри сети через интерфейс rl0:
ipfw add allow ip from 192.168.0.0/24 to 192.168.0.0/24 via rl0

или лучше открыть только то, что Вам необходимо в работе:
ipfw add allow tcp from 192.168.0.0/24 to me 9832 in via rl0 keep-state

Я поставил, как самый простой и удобный, в данном случаи, сервис — micro_httpd.
Ставим из портов:
cd /usr/ports/www/micro_httpd
make install clean

Так это просто бинарник, а не демон, то он не висит в памяти и ничего не занимает. При запросе на определенный порт inetd вызывает его с параметром, он обрабатывает данные и возвращает результат.
Настраиваем inetd, дописывая следующее в /etc/inetd.conf (одной строкой):
micro_http      stream  tcp     nowait  nobody  /usr/local/sbin/micro_httpd     micro_httpd     /var/www #micro_httpd

где /var/www — путь к корневой папке веб-сервера.
Еще добавим инфу в /ets/services:
micro_httpd   9832/tcp   #micro_httpd

тут 9832 — порт на котором веб-сервер висит.
В /var/www кладем index.html с нужным нам содержимым.
Перезапускаем Inetd или перезагружаем сервер и проверяем.
Tags:
Hubs:
Total votes 13: ↑7 and ↓6+1
Comments8

Articles