Появилась довольно редкая и необычная задача.
Есть запароленный прокси сервер для определенных нужд. На нем внушительное количество 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 ]
Все замечательно. Прокси перезапускаются.