настраиваем получение почты через UUCP и SSH

Когда я открывал новую фирму, мне пришлось несколько недель провести без ADSL, оптики или какого иного способа получения скоростного Интернет. Единственное, что у меня было - это старый модем USR 33.6Kbps и учетная запись dial-up. Так как электронная почта была необходима как воздух, пришлось сеть и поискать решение проблемы.

У меня уже было зарегистрировано доменное имя, но провайдером dial-up назначался динамический IP-адрес. Моя домашняя машина была подключена через HNS Direcway Satellite Link 128/2048Kbps и имела постоянный IP-адрес. Естественным шагом было использовать ее в своих целях.

Когда-то давно, в прежней жизни, я настраивал системы UUCP (тогда еще не было Интернета и протокола ppp ;). Припомнив былое, я прикинул, что UUCP вполне может мне помочь.

UUCP - это the Land Rover передачи данных. Это старейший протокол, живущий в Unix, Arpanet, Usenet, и Internet. Лично я использовал его через:
- ISDN;
- радиосвязь;
- спутниковую связь;
- выделенную линию;
- GSM;
- в сетях X.25;
- в сетях TCP/IP с различной топологией;
- VPN (IPSEC, PPTP, OPENVPN и т.д.);
- и теперь SSH.

Как вы можете видеть, UUCP – действительно смахивает на внедорожник, и это вызывает определенное уважение: я, откровенно говоря, не знаю ни одного протокола (кроме TCP/IP, естественно), который был бы так универсален и долговечен. При поиске документации я наткнулся на статью, написанную в 2001 году моим соотечественником Фабианом Пансо на uucpssh.org. Фабиан описал работу UUCP поверх SSH, а именно это мне, собственно, и требовалось. В статье было очень много недостказанностей из-за того, что использовались старые версии Linux и SSH, а я работаю с FreeBSD, но все равно она мне очень помогла.

Несомненно имеются другие пути решения проблемы, например, перенаправление портов в SSH, но я решил пойти своим путем.

преимущества решения UUCP поверх SSH

Протокол POP не обеспечивает эффективного способа работать с электронной почтой из нескольких мест, поэтому мне показалось, что UUCP поверх SSH предоставляет мобильным пользователям больше удобства.
Протокол UUCP является пакетным, поэтому вы можете не бояться потерь данных. В случае неудачного соединения возможна повторная передача почты с места обрыва. Я не знаю больше ни одного почтового протокола, способного на это (обычно передается сообщение полностью). UUCP не требует постоянного подключения к Интернет. Однако, есть один недостаток - вы не будете немедленно получать ответы и сообщения об ошибках, в лучшем случае, это произойдет при следующем сеансе связи.
Протокол UUCP может иметь широкий диапазон интервалов опроса наличия почты и может передавать файлы не только в почтовых вложениях, вы можете выбрать службу рассылки новостей в Usenet и/или создать ваши собственные конференции. Впрочем, мне нужна только электронная почта.

перед началом работы

Вот список необходимых нам вещей:
1. Вы должны иметь привилегии root на двух FreeBSD-системах. В этой статье описывается работа на FreeBSD 4.10, но будет работать и на FreeBSD 5.х, если UUCP установлен из дерева портов. Также это будет работать на NetBSD и OpenBSD с некоторыми модификациями.
2. Соответственно, нужны две системы, далее обозначаемые как "клиент" и "сервер".
3. Сервер имеет статический IP-адрес или этот вопрос должен быть улажен с помощью чего-то вроде DynDNS FQDN. Скорость и время задержки в канале не имеет принципиального значения.
4. Опрос протокола UUCP будет осуществляться от "клиента" к "серверу", а не наоборот. Было бы просто сделать обмен server-to-server в случае наличия постоянных IP-адресов, но это не тема сегоднящней статьи.
5. На машинах должен быть установлен OpenSSH и запущен sshd. На FreBSD это сделано по умолчанию.
6. Я использую Postfix 2.1.

сетевые настройки

UUCP-сервер "server" с адресом FQDN server.domain.tld и именем UUCP - server.
UUCP-клиент "client" с адресом FQDN client.domain.tld и именем UUCP - client.
Почтовое доменное имя машины client - hosted-domain.tld.
Локальное доменное имя client - localdomain.local.

настройка клиента

Установите Postfix на клиентской машине из коллекции портов /usr/ports/mail/postfix/. Отредактируйте /usr/local/etc/posftix/main.cf следующим образом:

myhostname = machine.localdomain.local
myorigin = $mydomain
inet_interfaces = $myhostname, localhost
mydestination = $myhostname, localhost.$mydomain, $mydomain
local_recipient_maps = unix:passwd.byname $alias_maps
mynetworks = $config_directory/mynetworks
relay_domains = $config_directory/relay_domains
transport_maps = hash:$config_directory/transport
alias_maps = hash:$config_directory/aliases
alias_database = hash:/etc/aliases


В этих строках устанавливаются переменные Postfix (возможно, они уже были установлены, если вы пользовались им ранее).
Добавляем в /usr/local/etc/posftix/main.cf строку:

disable_dns_lookups=yes


Эта опция указывает Postfix не использовать DNS при посылке писем на сервер, так как в этом случае письма посылались бы по SMTP вместо UUCP. Создаем файл /etc/postfix/transport, содержащий следующие строки:

hosted-domain.tld
.hosted-domain.tld
* uucp:server


В этом файле мы указываем в качестве средства доставки протокол UUCP. Это означает, что вся почта, отправленная не в something@hosted-domain.tld или something@.hosted-domain.tld, будет пересылаться через UUCP. Для доменов hosted-domain.tld и .hosted-domain.tld будет применяться локальная доставка.
Теперь уведомим Postfix о произведенных изменениях:

$ postmap /usr/local/etc/postfix/transport && postfix reload

Создаем файл /usr/local/etc/postfix/virtual, содержащий:

postmaster@hosted-domain.tld postmaster@localdomain.local
virtualuser1@hosted-domain.tld localuser1@localdomain.local


Теперь уведомим Postfix о произведенных изменениях:

$ postmap /usr/local/etc/postfix/virtual && postfix reload

Создаем /usr/local/etc/postfix/mynetworks, содержащий список IP-адресов хостов/сетей, которым доставка почты осуществляется через SMTP, перед тем как поставить письма в очередь на отправку почты через UUCP. Строки могут выглядеть следующим образом (не забудьте вписать ваши адреса ;)

192.168.0.3 OK
192.168.8.0/24 OK


Возможно вы захотите отредактировать файл canonical для того, чтобы изменять отправителя при отправке почты с локальной машины. Будет это выглядеть примерно так:

@localdomain.local @hosted-domain.tld


Для вступления изменений в силу:

$ postfix stop && postfix start


В случае, если вы модифицируете псевдонимы(aliases), хорошей идеей будет выполнить команды newaliases и затем postfix reload. Это также можно сделать, используя простейший скрипт:

#! /bin/sh
postmap virtual
postmap transport
postmap mynetworks
postmap relays_domains
postmap access
postmap canonical
newaliases
postfix reload


Используйте postcheck для проверки корректности конфигурации.

конфигурирование клиента UUCP

Для настройки UUCP у клиента необходимо создать несколько файлов в каталоге /etc/uucp. Начнем мы с /etc/uucp/sys, содержащего:

system server
alias server-ssh
call-login *
call-password *
time any
address server.domain.tld
port ssh
protocol t
remote-send /var/spool/uucppublic
remote-receive /var/spool/uucppublic


Затем создаем /etc/uucp/port:

port ssh
type pipe
command /usr/bin/ssh -x -o batchmode=yes server.domain.tld


Теперь /etc/uucp/call:

server login password


В заключение устанавливаем права доступа к файлам. SSH очень критичен в этих вопросах.

% cd /var/spool/ && chmod go-w uucp
% cd /etc/uucp && chown root:uucp * && chmod 550 *


конфигурирование SSH-клиента

Пришло вермя конфигурирования клиента SSH. От пользователя root запускаем команду vipw uucp и редактируем домашний каталог пользователя с:

uucp:*:66:66:UUCP pseudo-user:/var/spool/uucppublic:/usr/libexec/uucp/uucico


на

uucp:*:66:66:UUCP pseudo-user:/var/spool/uucp:/usr/libexec/uucp/uucico


Затем генерируем ключи для клиента:

% su -m uucp
$ export HOME=/var/spool/uucp
$ cd /var/spool/uucp
$ ssh-keygen -t dsa


В последней команде вас попросят ввести кодовую фразу. Не делайте этого, просто нажмите Enter. Хотя это и походит на брешь в системе сетевой защиты, пользователь uucp не имеет пароля в /etc/passwd. Нам в дальнейшем потребуется файл id_dsa.pub.

настройка сервера

На сервере также требуется конфигурирование Postfix, UUCP и SSH.

настройка сервера Postfix

Будем считать, что это - основной почтовый сервер.
Вы уже знаете, как конфигурировать Postfix для получения и отправки почты из и в Интернет. Postfix должен знать, что всю почту для клиента необходимо отправлять через UUCP. Поэтому в файле /usr/local/etc/postfix/transport должна быть строка:

hosted-domain.tld uucp:client


Postfix также должен осуществлять маршрутизацию почты для нашего домена, поэтому в /usr/local/etc/postfix/relay_domains указываем:

hosted-domain.tld OK
hosted-domain.tld OK


Затем активируем изменения:

% postmap transport relay_domains && postfix reload


настройка UUCP

Как и для клиента, используя vipw uucp, сделайте изменения в /etc/password. Заменим

uucp:*:66:66:UUCP pseudo-user:/var/spool/uucp:/usr/libexec/uucp/uucico


на

uucp:*:66:66::0:0:UUCP pseudo-user:/var/spool/uucp:/bin/sh


Затем создаем файл /etc/uucp/sys, содержащий:

system client
time any
port tcp
protocol t
remote-send /var/spool/uucppublic
remote-receive /var/spool/uucppublic


Создаем /etc/uucp/passwd:

yourlogin yourpassword


конфигурация SSH

В финале необходимо сконфигурировать SSH. Воспользуемся командой

su -m uucp


и создадим файл authorized_keys:

$ touch /var/spool/uucp/.ssh/authorized_keys


Скопируем содержимое клиентского файла id_dsa.pub(располагающегося в /var/spool/uucp/.ssh/) в /var/spool/uucp/.ssh/authorized_keys на сервере. Установим права доступа:

chmod go-rwx && chown uucp:uucp


Затем редактируем authorized_keys, вставив в начало файла команду:

command="/usr/libexec/uucp/uucico -l


Таким образом, содержимое файла будет выглядеть примерно так:

command="/usr/libexec/uucp/uucico -l" ssh-dss AAAAB3NzaC1kc3MAAACBA...


Все это должно быть в одну строку. И последняя команда:

cd /var/spool/ && chmod go-w uucp


заключительная наладка и тестирование

Финал. Зарегистрируем DSA ключ для клиентской машины в /var/spool/uucp/.ssh/known_hosts. Для этого необходимо переключиться в пользователя uucp (командой su -m uucp), выполнить команду

ssh -v uucp@server.domain.tld


и ответить "yes".
В этой точке вся входящая почта для hosted-domain.tld будет помещена в очередь и сохранена в каталоге var/spool/uucp/client. UUCP с удовольствием будет ее посылать, всякий раз создавая SSH-туннель.
Если что-то не работает, то проверьте порядок действий еще раз.
Проверим реальную работу. Дозваниваемся до провайдера Интернет и выполняем:

su -m uucp
/usr/libexec/uucp/uucico -f -sserver


Для наблюдения процесса доставки почты введем:

uulog -f -sserver


Для просмотра обработки почты Postfix воспользуйтесь командой:

tail -f /var/lo/maillog


Запускаем любимый почтовый клиент и отправляем почту. Вы должны будете увидеть ее в очереди UUCP (uustat -sserver) и отослана она будет при следующем запуске uucico.
Вы можете использовать команду

uustat -k


Для автоматизации работы воспользуемся услугами демона cron. Для предотвращения ошибок, необходимо иметь постоянное подключение к Интернет. Выполним команду

crontab -u uucp –e


и введем следующую команду для проверки почты каждые пять минут:

PATH=/bin:/usr/bin:/usr/local/bin:/sbin:/usr/sbin:/usr/local/sbin:/usr/libexec/uucp
0-55/5 * * * * /usr/libexec/uucp/uucico -f -sserver




Christophe Prevotaux, перевод Сгибнева Михаила.¶



Сетевые решения. Статья была опубликована в номере 03 за 2005 год в рубрике sysadmin

©1999-2024 Сетевые решения