[Из песочницы] Установка 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 Мб.

image

Далее подключаем все это добро в наш роутер.

У меня роутер Asus RT-N13U B1 с установленной на него одной из последних прошивок dd-wrt v3.0. Теперь необходимо монтировать наши разделы. Заходим в web во вкладку Services->USB и подключаем наши разделе. Ставим галочки в Core USB Support, USB Storage Support, Automatic Drive Mount. Копируем UUID дисков в разделы для того чтобы они автоматически монтировали при загрузке.

62ac3377d34c42a6b1b59ff2e9d5204a.png

Далее необходимо установить систему контроля пакетов 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

a2f7599bed204007b6064c0800926c66.png

Сохраняем настройки и перезапускаем роутер. Все готово.

© Habrahabr.ru