на главную ] 

Почтовый шлюз в internet для небольшой локальной сети.

Евгений Борисов

среда, 21 января 2004 г.

1 Дано

Небольшая локальная сеть (LAN) с выходом в internet через модем (dialup).
Здесь мы не будем рассматривать процедуру настройки соединения с internet, предполагается что шлюз это FreeBSD 4.x + ppp + natd + ipfw.

2 Постановка задачи

Построить систему обмена электронной почтой с internet для небольшой LAN, учитывая особенности dialup.

3 Решение

При cвязи с internet через модем обычно хочется минимизировать время сеанса связи и число процедур дозвона. Исходя из этого требования систему построим так :

3.1 Входящая почта

  1. все пользователи email регистрируются на node2.home.net
  2. забирать почту из internet будем при помощи fetchmail [3]
    • устанавливаем fetchmail
      # cd /usr/ports/mail/fetchmail
      # make all install clean
      
    • в /etc/fetchmail.cf добавить список ящиков в internet и их локальных владельцев :
      poll pop.ukrpost.net proto POP3
       interface tun0/0.0.0.0/0.0.0.0
       user "moo" with pass "mOOmOO" is "boo" here
      
      вся почта moo@ukrpost.net переписывается в ящик локального пользователя boo

    • chmod 600 /etc/fetchmail.cf
      чтобы никто кроме root не мог прочитать пароли от ящиков

  3. отдавать почту c node2.home.net пользователям LAN будем при помощи popd [6] ;
    • устанавливаем popd :
      # cd /usr/ports/mail/popd
      # make all install clean
      
    • для автоматического запуска popd в /usr/local/etc/rc.d
      поместим скрипт popd.sh :
      #!/bin/sh
      /usr/local/libexec/popd
      

3.2 Исходящая почта

Для отправки почты будем использовать sendmail [4].

  1. во FreeBSD sendmail установлен по умолчанию
  2. для авторизации на промежуточном MTA нужен The Cyrus SASL [5]
    • проверить наличие SASL в sendmail можно так :
      # sendmail -d0.1 -bv root | grep SASL
      

    • если SASL отсутствует :
      • устанавливаем SASL
        # cd /usr/ports/security/cyrus-sasl2
        # make all install clean
        
      • в /etc/make.conf добавим строки
        SENDMAIL_CFLAGS=-I/usr/local/include -DSASL=2
        SENDMAIL_LDFLAGS=-L/usr/local/lib
        SENDMAIL_LDADD=-lsasl2
        
      • пересобираем sendmail c SASL
        # cd /usr/src/lib/libsm
        # make clean && make obj && make depend && make
        # cd /usr/src/lib/libsmutil
        # make clean && make obj && make depend && make
        # cd /usr/src/usr.sbin/sendmail
        # make clean && make obj && make depend && make && make install
        
  3. Поскольку DNS провайдера без дозвона естественным образом не доступен, в настройках sendmail блокируем попытки обращения к DNS

    • В /etc/hosts заносим IP промежуточного MTA - smtp.yandex.ru
      (IP можно узнать с помощью ping) ;
    • Создаём файл /etc/mail/service.switch :
         hosts files
      
      т.е. говорим sendmail использовать только информацию из файла /etc/hosts при разрешении имён во время доставки почты.

  4. помещаем пароли к промежуточному MTA в файл /etc/mail/authinfo:
    AuthInfo:smtp.yandex.ru  "U:iam" "P:mypsswd"  "M:LOGIN"
    
    создаём файл паролей :
    makemap hash /etc/mail/authinfo.db < /etc/mail/authinf
    
    ( /etc/mail/authinfo можно удалить )

  5. создаём файл /etc/mail/local-host-names
    ( здесь он не используется но sendmail хочет чтобы этот файл был )

  6. создаём файл /etc/mail/freebsd.mc :
    VERSIONID(`FreeBSD:20/01/2004')
    OSTYPE(freebsd4)
    DOMAIN(generic)
    FEATURE(local_lmtp)
    FEATURE(nocanonify)
    FEATURE(accept_unresolvable_domains)
    FEATURE(accept_unqualified_senders)
    FEATURE(`authinfo')
    define(`SMART_HOST', `smtp.yandex.ru')
    define(`confBIND_OPTS', `-DNSRCH -DEFNAMES')
    define(`confSERVICE_SWITCH_FILE',`/etc/mail/service.switch')
    define(`confSMTP_MAILER', `smtp8')
    define(`confTO_IDENT', `0')
    define(`confTO_QUEUEWARN', `5h')
    define(`confTO_QUEUERETURN', `1d')
    define(`confCON_EXPENSIVE', `True')
    define(`SMTP_MAILER_FLAGS', `e')
    MAILER(local)
    MAILER(smtp)
    

    т.е. говорим sendmail что :

    • в системе есть локальный агент доставки (LMTP)
    • не использовать DNS
    • почтовый шлюз - smtp.yandex.ru
    • запрещаем доставлять почту немедленно для т.н. дорогостоящих (expensive) агентов доставки. Локальная почта будет доставляться немедленно, а внешняя будет устанавливаться в очередь.
    • использовать 8-битовое кодирование символов
    • устанавливаем тайм-аут предупреждения о невозможности доставки - 6 часов, и возврат сообщения при невозможности его отправки по истечении 1 дня.
    • при подключении к другим MTA использовать авторизацию

    создаём файл настроек sendmail :
    m4 /usr/share/sendmail/cf/m4/cf.m4 freebsd.mc > sendmail.cf

  7. для автоматического запуска sendmail в /etc/rc.conf добавить
    sendmail_enable="YES"
    sendmail_flags="-bd"
    
  8. перезапускаем sendmail :
    killall sendmail
    /usr/sbin/sendmail -bd
    

3.3 настройки почтовых клиентов в LAN

3.4 использование

В такой конфигурации успешно запускать fetchmail и sendmail может только root. Для устранения этого ограничения обмен почтой можно производить автоматически из скрипта установки связи. Другое решение - установить suid :

chmod +s /usr/local/bin/fetchmail
chmod +s /usr/sbin/sendmail

Литература

1
mail@dialup - http://vap.org.ru/mail@dialup

2
Аутентификация SMTP - http://uafug.org.ua/projects/faq/sendmail.sasl

3
fetchmail - http://www.catb.org/~esr/fetchmail

4
sendmail - http://www.sendmail.org

5
The Cyrus SASL - http://asg.web.cmu.edu/sasl

6
popd - ftp://ftp3.za.freebsd.org/pub/popd

Evgeny S. Borisov
2004-01-21
При использовании материалов этого сайта, пожалуйста вставляйте в свой текст ссылку на мою статью.