[Из песочницы] Установка PROXY сервера на DD-WRT
Как установить DD-WRT на роутер рассказывать не буду, об этом полно статей. А вот как установить прокси, внятного мануала не нашел. Вот и решил написать свой.
Для того чтобы без препятственно устанавливать стороннее программное обеспечение на ваш DD-WRT понадобиться дополнительное место, которого в роутере как правило недостаточно. Поэтому необходимо к нему подключить дополнительную флешку. Так как в моем случае роутер будет раздавать интернет с 3G модема, а порт USB у меня на роутере 1, и чтобы не морочиться с USB хабом, я вставил microSD флешку прямо в 3G модем.
Большинство 3G модемов от Huawei это имеют разъем для microSD. У меня модем Huawei E1820 от Мегафона.
Так вот, для того чтобы флешка работала в качестве хранилища под файлы системы DD-WRT, а это Linux в чистом виде, необходимо сначала создать несколько разделов на нашей флешке, и отформатировать их в файловую систему ext3. Не у каждого есть под рукой linux, поэтому я покажу метод как это можно сделать под Windows.
Для начала установим драйвер который позволяет работать с данной файловой системой. Скачать можно с sourceforge.net/projects/ext2fsd — Установка данного драйвера необязательна, она нужна только в случае если вы хотите работать с содержимым флешки в Windows. Для того чтобы разметить сам диск, скачаем программу EaseUS Partition Master Home Edition, которая доступна здесь: www.partition-tool.com/download.htm. Программа бесплатная для домашнего пользования и вполне подходит для нашей задачи.
Создаем 3 раздела:
/opt – тут будет храниться все наше установленное ПО
/jffs – тут различные скрипты. Кстати в конечном счете я это раздел у себя отключил и более не использую.
/swap – своп системы, для увеличения объема оперативной памяти. Если вы собираетесь устанавливать в вашу dd-wrt софт потребляющий много памяти, товам он просто необходим, в моем случае для задач прокси мне достаточно тех 60МБ памяти, что есть в моем роутере, поэтому раздел для свопа я создавать не будут.
У меня флешка была на 2 GB поэтому я создал два раздела, один объемом 900 Мб, и второй 1000 Мб.
Далее подключаем все это добро в наш роутер.
У меня роутер Asus RT-N13U B1 с установленной на него одной из последних прошивок dd-wrt v3.0. Теперь необходимо монтировать наши разделы. Заходим в web во вкладку Services->USB и подключаем наши разделе. Ставим галочки в Core USB Support, USB Storage Support, Automatic Drive Mount. Копируем UUID дисков в разделы для того чтобы они автоматически монтировали при загрузке.
Далее необходимо установить систему контроля пакетов ipkg-opt. К этому моменту интернет на роутере уже должен быть настроен. Включаем доступ по SSH к роутеру и заходим на него. Выполняем последовательно команды.
Скачиваем скрипт установки:
wget http://www.3iii.dk/linux/optware/optware-install-ddwrt.sh -O - | tr -d '\r' > /tmp/optware-install.sh
Далее производим саму установку:
sh /tmp/optware-install.sh
После того как все установилось, устанавливаем прокси:
ipkg-opt install tinyproxy
Если вы не умеете пользоваться vi (как и я ранее, сейчас научился) можете установить еще редактор nano:
ipkg-opt install nano
Сейчас нам необходимо сконфигурировать наш прокси и создать скрипты запуска. Вот как выглядит мой конфиг, вы можете настроить его так как вам нужно, только не меняйте расположение PID файла.
Отредактируем конфиг:
nano /opt/etc/tinyproxy.conf
Впишем туда:
User root
Group root
Port 8888
Timeout 600
DefaultErrorFile "/opt/share/tinyproxy/default.html"
StatFile "/opt/share/tinyproxy/stats.html"
LogLevel Info
PidFile "/tmp/var/run/tinyproxy.pid"
MaxClients 100
MinSpareServers 5
MaxSpareServers 20
StartServers 10
MaxRequestsPerChild 0
Allow 192.168.0.0/16
ViaProxyName "tinyproxy"
ConnectPort 443
ConnectPort 563
Теперь создадим скрипты запуска. Не знаю по какой причине, но стандартный метод для запуска скриптов через /jffs/etc/config/script.startup, работает только когда идет программная перезагрузка, но как только я вырубаю устройства из сети и включаю его заново, то данный скрипт не отрабатывает. Возможно это связано с тем что у меня microSD подключается както медленно в связи с тем что через 3G модем.
Меня такая ситуация не устраивает, так как если будет выключен свет например, то после включения не запустится нужный мне софт, в данном случаем tinyproxy и мне придется сначала зайти по ssh на роутер и сделать программный reboot и только после этого все запустится. Поэтому я пошел немного обходный путем, и сделал запуск основного скрипта через cron.
Создадим каталог для скриптов:
mkdir /opt/etc/init.d
Дадим права на исполнение:
chmod +x /opt/etc/init.d
Создадим основной скрипт запуска:
nano /opt/etc/init.d/start_script.sh
#!/bin/sh
unset LD_PRELOAD
unset LD_LIBRARY_PATH
[ -e /opt/etc/profile ] && mount -o bind /opt/etc/profile /etc/profile
if [ -d /opt/etc/init.d ]; then
for f in /opt/etc/init.d/S* ; do
[ -x $f ] && $f start
done
fi
Дадим права на исполнение:
chmod +x /opt/etc/init.d/start_script.sh
Теперь создадим скрипт запуска самого tinyproxy:
nano /opt/etc/init.d/S01tinyproxy.sh
#! /bin/sh
NAME=tinyproxy
DESC="Tiny HTTP and HTTPS proxy"
case "$1" in
start)
if [ -e /tmp/var/run/$NAME.pid ]; then
echo "$DESC: $NAME already started."
exit 0
fi
echo -n "Starting $DESC: $NAME"
/opt/sbin/$NAME -c /opt/etc/tinyproxy.conf
echo .
;;
stop)
if [ ! -e /tmp/var/run/$NAME.pid ]; then
echo "$DESC: $NAME is not running."
exit 0
fi
echo -n "Stopping $DESC: $NAME"
killall $NAME
rm -f /tmp/var/run/$NAME.pid
echo .
;;
*)
echo "Usage: $0 {start|stop}" >&2
exit 1
;;
esac
exit 0
Дадим права на исполнение
chmod +x /opt/etc/init.d/S01tinyproxy.sh
Теперь добавим в крон задание которое будет запускать наш скрипт по истечению 20 секунд после того как роутер загрузится. В таком варианте все мои скрипты отрабатывают на ура и роутер работает как часы.
Заходим через web на вкладку Administration -> Management и пишем с cron следующую строку:
@reboot sleep 20 && /opt/etc/init.d/start_script.sh
Сохраняем настройки и перезапускаем роутер. Все готово.