2009-07-07

Ngnix как почтовый прокси сервер

Возникла задачка - закинуть почту из старого корпоративного сервера в гугль аппс..
Сборщик POP3 у гугля естественно есть. Провайдер даёт pop3 доступ.
Казалось бы всё просто. Ан-нет!

Провайдер (ЦентрТелеком) не пускает к себе на POP3 из внешних сетей.
То есть порт то открыт - но всегда auth failed.

Сначала решение "в лоб". Попытаться открыть ssh туннель.
Но пол-часика помучившись - так и не удалось.
Руки кривые и что-то не так делал :)

Второе решение - разобраться таки с nginx.
Ну чего там - "прокси сервер" :)
Но вот где адрес сервера к которому подключаться надо - в конфигах
"прокси" подозрительно не находилось. Всё указывало на необходимость
использовать какой-то http_auth.
Опять же - для этого нужен внешний скрипт, а скрипты к ngnix'у прикручивать..
Безопасно пока не научился :)

Однако можно заставить самого nginx отвечать на свои же запросы :)

1. Ставим:
sudo apt-get install nginx
sudo apt-get build-dep nginx

2. Скачиваем nginx с родного сайта.
И распаковываем. unp nginx*
Тот, что идёт в комплекте с убунтой во-первый старый, (даже из самой свежей репки не говоря о харди что у меня стоит). Во вторых собран без поддержки mail proxy.

Можно, конечно, сделать apt-get source nginx
Добавить в файле debian/rules опцию --with-mail
и сделать apt-get source -b nginx
Но это слишком просто :)

3. В папке создаём файлик config-run
./configure --conf-path=/etc/nginx/nginx.conf \
--error-log-path=/var/log/nginx/error.log \
--pid-path=/var/run/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--http-log-path=/var/log/nginx/access.log \
--http-client-body-temp-path=/var/lib/nginx/body \
--http-proxy-temp-path=/var/lib/nginx/proxy \
--http-fastcgi-temp-path=/var/lib/nginx/fastcgi \
--with-mail

Конфиг взял из убунты - благо он крайне простой - добавил и убрал что не нужно.

4. Собираем:
. config-run
make

5. Копируем на будущий прокси обновлённый бинарник.
scp objs/nginx root@myproxy:/usr/sbin/

6. Правим конфиг /etc/nginx/nginx.conf
user www-data;
worker_processes 1;

events {worker_connections 10;}

http {server {
listen 8080;
location /auth { # mailcheck
add_header Auth-Status OK;
add_header Auth-Server 212.26.224.70;# pop3.ryazan.ru;
add_header Auth-Port 110;
return 204;
}
}}

mail {
auth_http localhost:8080/auth;
server {
listen 110;
protocol pop3;
proxy on;
}
}


7. Запускаем и проверяем.

Что ещё можно. Можно проверять доступ - запрос на /auth содержит поле Client-IP.
Можно сделать "настоящий" скрипт. Или использовать возможности rewrite самого nginx..
Например для перенаправления на разные pop сервера для разных IP - или например для разных логинов..

Комментариев нет: