Простая Авторизация Пользователей Для Доступа В Интернет С Помощью Ipfw.

Любая сеть рано или поздно начинает граничить с другой сетью, раньше так было.

Теперь при создании корпоративной сети для любой организации маловероятно, что она не будет подключаться к Интернету.

Поэтому первый и основной сервер, который будет организован – это роутер.

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

Например, это общественное место, кафе или отель.



Что у нас есть?

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

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

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

Есть два варианта.

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

Поэтому я пошел по второму пути, а именно фаервол решает, кто куда идет. Вот как выглядит мое решение в 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/услуги :

micro_httpd 9832/tcp #micro_httpd

здесь 9832 — это порт, на котором висит веб-сервер.

В /вар/www помещать index.html с нужным нам контентом.

Перезапустите Inetd или перезагрузите сервер и проверьте.

Теги: #*nix #Администрирование сервера #FreeBSD #ipfw #fwd #micro_httpd

Вместе с данным постом часто просматривают: