3proxy. Init скрипт и гибкое разграничение пользователей

Появилась довольно редкая и необычная задача.
Есть запароленный прокси сервер для определенных нужд. На нем внушительное количество IP-адресов и соответственно каждый из них проксирует запросы в интернетик.
Необходимо было выделить пару айпишников для пользования сотрудниками.
Сначала хотел на большинстве адресов оставить старую авторизацию, а на несколько новых установить другую пару логин-пароль. Выянилось, что средствами конфига 3proxy этого сделать не получится.
Просто добавить ещё одного пользователя тоже не вариант, так как он распространяется глобально на все адреса. А надеяться, что пользователи не начнут перебирать доступы не очень хочется. Да и не безопасно это.
Уже хотел было разочароваться как вспомнил, что при запуске 3proxy указывается исполнительный скрипт и через пробел файл конфигурации. Наталкивает на некоторые мысли, не правда ли?

ps aux | grep 3proxy
root 201024 0.0 0.1 47592 13684 ? Ssl 15:20 0:00 /usr/bin/3proxy /etc/3proxy.cfg

Да, так прокси и работает.
Ну что же, вывод очевиден: необходимо создать ещё один файл конфига, в который мы внесём новые адреса и нового пользователя.
Поехали.

cp /etc/3proxy.cfg /etc/3proxy_temp.cfg

Правим новый конфиг до такого состояния:

#Запускаем в режиме демона
daemon 
#Говорим, что авторизация будет по логин-паролю. Есть так же по айпи (iponly) и открытая (none)
auth strong
#Указываем данные для авторизации 
users new_user:CL:nEw_p@ssw0rd
#Указываем разрешённых пользователей. У нас он один
allow new_user
#Ну и конфигурируем сами прокси-адреса (обязательно смените порт по сравнению с оригинальным конфигом, что бы не возникло конфликтов)
proxy -i255.255.255.2 -e255.255.255.2 -p11111 -n
proxy -i255.255.255.3 -e255.255.255.3 -p11111 -n
proxy -i255.255.255.4 -e255.255.255.4 -p11111 -n
proxy -i255.255.255.5 -e255.255.255.5 -p11111 -n
proxy -i255.255.255.6 -e255.255.255.6 -p11111 -n
proxy -i255.255.255.7 -e255.255.255.7 -p11111 -n
proxy -i255.255.255.8 -e255.255.255.8 -p11111 -n
proxy -i255.255.255.9 -e255.255.255.9 -p11111 -n
proxy -i255.255.255.10 -e255.255.255.10 -p11111 -n
proxy -i255.255.255.11 -e255.255.255.11 -p11111 -n

Сохраняем, выходим, запускаем, проверяем — ничего удивительного, всё работает! Авторизация работает, запросы проксируются.

ps aux | grep 3proxy
root 203150 0.8 0.1 114232 14616 ? Ssl 15:21 0:08 /usr/bin/3proxy /etc/3proxy.cfg
root 203155 0.0 0.0 8648 584 ? Ssl 15:21 0:00 /usr/bin/3proxy /etc/3proxy_temp.cfg
root 215520 0.0 0.0 63252 836 pts/2 S+ 15:37 0:00 grep 3proxy

Но это только пол дела. Нам ведь не хочется постоянно при загрузке сервера подсовывать этот конфиг 3proxy, а хочется что бы всё стартовало само.
Да без проблем, смотрим дальше.
Есть один баг/фича, который и помог мне просто и со вкусом решить поставленную задачу. При установке 3proxy НЕ создаёт(не создавал, сейчас всё в порядке) скрипта перезапуска, что есть очень неприятно. На просторах интернета нашлись добрые люди, которые этот скрипт написали за что им огромное спасибо.

touch /etc/init.d/3proxy
chmod +x /etc/init.d/3proxy

И добавим в него следующее

#!/bin/sh
WITHOUT_RC_COMPAT=1
. /etc/init.d/functions
### Default variables
prog=3proxy
CONFIG=/etc/3proxy.cfg
PROXY=/usr/bin/3proxy
RETVAL=0
LOCKFILE=/var/lock/subsys/3proxy
#LOGFILE=/var/log/3proxy.log
start() {
 echo -n $"Starting $prog: "
 daemon "$PROXY" "$CONFIG"
 RETVAL=$?
 echo
 [ 0 -eq $RETVAL ] && touch ${LOCKFILE}
 return $RETVAL
}
stop() {
 echo -n $"Stopping $prog: "
 killproc -d 3 "$prog"
 RETVAL=$?
 echo
 [ 0 -eq $RETVAL ] && rm -f ${LOCKFILE}
 return $RETVAL
}
restart() {
 stop
 start
}
reload(){
 echo -n $"Reloading $prog: "
 killproc $prog -USR1
 RETVAL=$?
 echo
}
case "$1" in
 start)
 start
 ;;
 stop)
 stop
 ;;
 restart)
 restart
 ;;
 reload)
 reload
 ;;
 condrestart)
 [ -e $LOCKFILE ] && restart
 RETVAL=$?
 ;;
 status)
 status "$PROXY"
 RETVAL=$?
 ;;
 *)
 echo $"Usage: $0 {start|stop|restart|condrestart|status|reload}"
 RETVAL=1
 ;;
esac
exit $RETVAL

Следует обратить внимание на

start() {
 echo -n $"Starting $prog: "
 daemon "$PROXY" "$CONFIG"

Если внимательно посмотреть на переменные, то понятно, что именно эти строки отвечают за запуск.
Правим эту секцию до состояния:

### Default variables
prog=3proxy
CONFIG=/etc/3proxy.cfg
CONFIG1=/etc/3proxy_temp.cfg
PROXY=/usr/bin/3proxy
RETVAL=0
LOCKFILE=/var/lock/subsys/3proxy
#LOGFILE=/var/log/3proxy.log
start() {
 echo -n $"Starting $prog: "
 daemon "$PROXY" "$CONFIG"
 daemon "$PROXY" "$CONFIG1"

В итоге имеем скрипт, который запускает два процесса 3proxy постоянно. Кроме того теперь будет работать конструкция

service 3proxy restart

Ну и в завершении добавим это дело в автозагрузку и благополучно забудем о проблемах с автозапуском

chkconfig 3proxy on

Ну вроде и все. Пробуем перезапустить на всякий случай:

service 3proxy restart
Останавливается 3proxy: [ OK ]
Запускается 3proxy: [ OK ]
/etc/init.d/3proxy restart
Останавливается 3proxy: [ OK ]
Запускается 3proxy: [ OK ]

Все замечательно. Прокси перезапускаются.

Добавить комментарий