Иногда в локальной сети появляется необходимость выпускать пользователей в интернет через прокси-сервер. Например, для учёта трафика или ограничения доступа к определённым ресурсам. При этом использование прозрачного прокси невозможно или нежелательно.
Можно, конечно, просто сделать рассылку на всех с указанием параметров. Но, как показывает практика, это не избавляет полностью от лишних вопросов.
Чуть более сложный в реализации, но убирающий значительную часть вопросов по настройке способ заключается в том, чтобы при попытке открытия страницы пользователю выдавалось сообщение, в котором указаны все необходимые параметры. Для этого нам понадобится установить на шлюзе веб-сервер и настроить его на выдачу страницы с этим сообщением.
Особо продвинутые могут спросить: а зачем что-то выбирать, когда есть Apache? Отвечаю заранее: Apache в данном случае сильно избыточен и будет только зря расходовать ресурсы, которых на шлюзе, скорее всего, и так немного. Поэтому будем использовать более лёгкий вариант. От сервера потребуется умение слушать 80 порт (ибо inetd нам не нужен) и поддержка пользовательских сообщений об ошибках (нам понадобится реагировать на 404). Вполне подходящим вариантом является thttpd.
В дальнейшем предполагается, что на шлюзе установлен Debian Etch. Ставим thttpd обычным способом:
Создаём файл /var/www/index.html и в нём описываем всё необходимое для того, чтоб пользователь мог спокойно настроить свой браузер: адрес прокси-сервера, порт, пожелания приятно провести время и тому подобное.
Для того, чтобы пользователь при попытке вылезти наружу видел не сообщение об ошибке, а нашу красивую инструкцию, добавляем правило в iptables:
Теперь любая попытка выбраться наружу через 80 порт попадёт на thttpd. Открываем habrahabr.ru и видим вместо него то, что мы и хотим увидеть.
Как можно заметить, при попытке зайти на какую-то страницу, не являющуюся корнем домена, мы получим 404. В thttpd собственный обработчик ошибок устанавливается очень просто. Нам даже нет необходимости что-то менять в конфиге.
К сожалению, thttpd пытается показать свою значимость и дорисовывает внизу страницы свой баннер, портящий наш красивый валидный XHTML Strict. К счастью, это лечится.
Берём машину с той же версией дебиана, что и на шлюзе. Идём на packages.debian.org и качаем оттуда исходники пакета в виде трёх файлов:
Ставим утилиты для разработчика:
Распаковываем пакет:
Редактируем файл config.h. Находим там следующую строку:
И комментируем её:
Используем именно такой тип комментария, т. к. это C, а не C++.
Также можно провести ещё некоторые настройки. Например, отключить поддержку CGI и установить кодировку по умолчанию в UTF-8. Читайте комментарии в конфиге.
Далее таким же образом открываем файл debian/changelog. Необходимо увеличить номер версии пакета, чтобы при следующем обновлении он не оказался перезаписан версией из репозитория. Это может произойти даже в том случае, если пакет на самом деле не обновлялся.
В начале файла видим запись следующего вида:
Добавляем перед ней свою. Обращаем внимание на форматирование и оставлям одну пустую строку перед тем, что в файле уже было.
Собираем пакет:
В каталоге уровнем выше образовался файл thttpd_2.23beta1-5pupkin1_i386.deb. Заливаем его на шлюз, устанавливаем и радуемся результату.
upd.: freefd написал статью про автоконфигурацию и предоставил пример страницы с настройками.
Информируем пользователей
Можно, конечно, просто сделать рассылку на всех с указанием параметров. Но, как показывает практика, это не избавляет полностью от лишних вопросов.
Облегчаем жизнь
Чуть более сложный в реализации, но убирающий значительную часть вопросов по настройке способ заключается в том, чтобы при попытке открытия страницы пользователю выдавалось сообщение, в котором указаны все необходимые параметры. Для этого нам понадобится установить на шлюзе веб-сервер и настроить его на выдачу страницы с этим сообщением.
Выбираем сервер
Особо продвинутые могут спросить: а зачем что-то выбирать, когда есть Apache? Отвечаю заранее: Apache в данном случае сильно избыточен и будет только зря расходовать ресурсы, которых на шлюзе, скорее всего, и так немного. Поэтому будем использовать более лёгкий вариант. От сервера потребуется умение слушать 80 порт (ибо inetd нам не нужен) и поддержка пользовательских сообщений об ошибках (нам понадобится реагировать на 404). Вполне подходящим вариантом является thttpd.
Установка и настройка
В дальнейшем предполагается, что на шлюзе установлен Debian Etch. Ставим thttpd обычным способом:
# aptitude install thttpd
Создаём файл /var/www/index.html и в нём описываем всё необходимое для того, чтоб пользователь мог спокойно настроить свой браузер: адрес прокси-сервера, порт, пожелания приятно провести время и тому подобное.
Для того, чтобы пользователь при попытке вылезти наружу видел не сообщение об ошибке, а нашу красивую инструкцию, добавляем правило в iptables:
# iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT
Теперь любая попытка выбраться наружу через 80 порт попадёт на thttpd. Открываем habrahabr.ru и видим вместо него то, что мы и хотим увидеть.
Ловим 404
Как можно заметить, при попытке зайти на какую-то страницу, не являющуюся корнем домена, мы получим 404. В thttpd собственный обработчик ошибок устанавливается очень просто. Нам даже нет необходимости что-то менять в конфиге.
# mkdir /var/www/errors
# cd /var/www/errors
# ln -s ../index.html err404.html
К сожалению, thttpd пытается показать свою значимость и дорисовывает внизу страницы свой баннер, портящий наш красивый валидный XHTML Strict. К счастью, это лечится.
Практическая хирургия
Берём машину с той же версией дебиана, что и на шлюзе. Идём на packages.debian.org и качаем оттуда исходники пакета в виде трёх файлов:
$ wget -c http://ftp.de.debian.org/debian/pool/main/t/thttpd/thttpd_2.23beta1-5.dsc http://ftp.de.debian.org/debian/pool/main/t/thttpd/thttpd_2.23beta1.orig.tar.gz http://ftp.de.debian.org/debian/pool/main/t/thttpd/thttpd_2.23beta1-5.diff.gz
Ставим утилиты для разработчика:
$ sudo aptitude install dpkg-dev build-essential fakeroot debhelper
Распаковываем пакет:
$ dpkg-source -x thttpd_2.23beta1-5.dsc
$ cd thttpd-2.23beta1
Редактируем файл config.h. Находим там следующую строку:
#define ERR_APPEND_SERVER_INFO
И комментируем её:
/*#define ERR_APPEND_SERVER_INFO*/
Используем именно такой тип комментария, т. к. это C, а не C++.
Также можно провести ещё некоторые настройки. Например, отключить поддержку CGI и установить кодировку по умолчанию в UTF-8. Читайте комментарии в конфиге.
Далее таким же образом открываем файл debian/changelog. Необходимо увеличить номер версии пакета, чтобы при следующем обновлении он не оказался перезаписан версией из репозитория. Это может произойти даже в том случае, если пакет на самом деле не обновлялся.
В начале файла видим запись следующего вида:
thttpd (2.23beta1-5) unstable; urgency=high
* Applied patch from Steve Kemp <skx@debian.org> on thttpd.logrotate to fix
the insecure use of temporary files when invoked by logrotate
[CVE-2006-4248] (Closes: #396277).
-- Daniel Baumann <daniel@debian.org> Tue, 31 Oct 2006 20:13:00 +0200
Добавляем перед ней свою. Обращаем внимание на форматирование и оставлям одну пустую строку перед тем, что в файле уже было.
thttpd (2.23beta1-5pupkin1) unstable; urgency=low
* Minor configuration changes required for Company X
-- Vasily Pupkin <pupkin@example.com> Mon, 17 Nov 2008 13:18:00 +0200
Собираем пакет:
$ dpkg-buildpackage -rfakeroot
В каталоге уровнем выше образовался файл thttpd_2.23beta1-5pupkin1_i386.deb. Заливаем его на шлюз, устанавливаем и радуемся результату.
upd.: freefd написал статью про автоконфигурацию и предоставил пример страницы с настройками.