by Christophe Prevotaux
Перевод: Сгибнев Михаил
Когда я открывал новую фирму, мне пришлось несколько недель провести без 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 etc.)
- и теперь, SSH
Как вы можете видеть - UUCP нечто вроде внедорожника и это вызывает определенное уважение, поскольку я не знаю
ни одного протокола (кроме TCP/IP, естественно), который был бы так универсален и долговечен.
ри поиске документации я наткнулся на статью, написанную в 2001 году, моим соотечественником, Фабианом Пансо на
uucpssh.org. Фабиан описал работу UUCP поверх SSH, что мне, собственно и требовалось. В статье было очень много
недостказанностей из-за того, что использовались старые версии Linux и SSH, а я работаю с FreeBSD, но все равно
она мне очень помогла.
Несомненно, имеются другие пути решения проблемы, например перенаправление портов в SSH, но я решил
пойти этим путем. Все замечания и дополнения приветствуются.
Преимущества решения UUCP поверх SSH
Протокол POP не обеспечивает эффективного способа работать с электронной почтой из нескольких мест,
поэтому мне показалось, что UUCP поверх SSH предоставляем мобильным пользователям больше удобства.
Протокол UUCP является пакетным, поэтому вы можете не бояться потерь данных. В случае неудачного соединения
возможна повторная передача почты с места обрыва. Я не знаю больше ни одного почтового протокола,
способного на это, обычно передается сообщение полностью. UUCP не требует постоянного подключения к
Интернет. Однако, есть один недостаток - вы не будете немедленно получать ответы и сообщения об ошибках,
в лучшем случае, это произойдет при следующем сеансе связи.
Протокол UUCP может иметь широкий диапазон интервалов опроса наличия почты и может передавать файлы не только
в почтовых вложениях, вы можете выбрать службу рассылки новостей в Usenet и/или создать ваши собственные конференции.
Впрочем, мне нужна только электронная почта.
Вводная
Вот список необходимых нам вещей:
-
Вы должны иметь привилегии root на двух FreeBSD системах.
В этой статье описывается работа на FreeBSD 4.10, но будет работать и на FreeBSD 5.х, если UUCP установлен из
дерева портов. Также это будет работать на NetBSD и OpenBSD с некоторыми модификациями.
-
Соответственно, две системы, далее обозначаемые как "клиент" и "сервер"
-
Сервер имеет статический IP адрес или этот вопрос улажен с помощью DynDNS FQDN.
Скорость и время задержки в канале не имеет принципиального значения.
-
Опрос протокола UUCP будет осуществляться от "клиента" к "серверу" а не наоборот.
Было бы просто сделать обмен server-to-server в случае наличия постоянных IP адресов, но это не тема сегоднящней статьи.
-
На машинах должен быть установлен OpenSSH installed и запущен sshd. На FreBSD это сделано по умолчанию.
-
Я использую Postfix -> 2.1. Для определения своей версии выполните команду:
postfconf | grep mail_version
Сетевые настройки:
- 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, содержащий следующие строки:
################### this is POSTFIX 'transport' file #############################
# Every time this file is modified it need a 'postmap' and postfix needs a reload#
##################################################################################
hosted-domain.tld : # this domain emails are delivered locally
.hosted-domain.tld : # this domain emails are delivered locally
# in case you need subdomains or machine routing
* uucp:server # All other emails get transported by UUCP
В этом файле мы указываем в качестве средства доставки протокол 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, содержащий:
#################### This is POSTFIX 'virtual' file ##############################
# Every time this file is modified it need a 'postmap' and postfix needs a reload#
##################################################################################
########### hosted-domain.tld virtual users table ##############
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, содержащий:
#################### This is POSTFIX 'mynetworks' file ###########################
# Every time this file is modified it need a 'postmap' and postfix needs a reload#
##################################################################################
xxx.xxx.xxx.xxx/xx OK # where xxx.xxx.xxx.xxx is your local private IP address
# and /xx is the mask for your networks for exple
# 192.168.1.1/24
xxx.xxx.xxx.xxx OK # single host for exemple 192.168.2.1
127.0.0.0/8 OK # this is localhost interface(s)
Это список IP адресов, которым доставка почты осуществляется через SMTP, перед тем как
поставить письма в очередь на отправку почты через UUCP.
Возможно вы захотите изменить файл canonical, для того, чтобы изменять
отправителя при отправке почты с локальной машины. Будет это выглядеть примерно так:
#################" This is POSTFIX 'canonical' file ##############################
# Every time this file is modified it need a 'postmap' and postfix needs a reload#
##################################################################################
@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, содержащего:
###### this is the 'sys' file for Taylor UUCP ######
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:
###### this is the 'port' file for Taylor UUCP ######
port ssh
type pipe
command /usr/bin/ssh -x -o batchmode=yes server.domain.tld
Теперь /etc/uucp/call:
###### this is the 'call' file for Taylor UUCP ######
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 должна быть строка:
####### this is POSTFIX 'transport' file #########
hosted-domain.tld uucp:client
Postfix также должен осуществлять маршрутизацию почты для нашего домена, поэтому в
/usr/local/etc/postfix/relay_domains указываем:
####### this is POSTFIX 'relay_domains file #########
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, содержащий:
###### this is the UUCP 'sys' file for Taylor UUCP #######
# client
system client
time any
port tcp
protocol t
remote-send /var/spool/uucppublic
remote-receive /var/spool/uucppublic
# other clients use the same lines
Создаем /etc/uucp/passwd:
###### this is the UUCP 'passwd' file for Taylor UUCP #######
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 <jobid>
на сервере или клиенте для
прекращения работы, которую можно просмотреть командой using uusat -s <system>
:
server.NI8whUuAALf1 server uucp 10-06 10:35 Executing rmail \
user@domain.tld (sending 1452 bytes)
В этом примере необходимо будет ввести uustat -k system.NI8whUuAALf1 для удаления работы.
Для автоматизации работы воспользуемся услугами демона cron. Для предотвращения ошибок,
необходимо иметь постоянное подключение к Интернет. Выполним команду crontab -u uucp -e
и введем следующую команду для проверки почты каждые пять минут:
# This is Taylor UUCP crontab file
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
В заключение хочу сказать, что очень надеюсь, что этот пример помог вам и
мне просто интересно, сколько людей в мире еще использует UUCP. Я буду рад получить от вас
письмо, для того чтобы составить некую карту стран и пользователей.