diff -Nru oops-1.5.23.orig/src/lib/rwlock/rwlock.c oops-1.5.23/src/lib/rwlock/rwlock.c --- oops-1.5.23.orig/src/lib/rwlock/rwlock.c 2000-11-29 19:03:35.000000000 +0200 +++ oops-1.5.23/src/lib/rwlock/rwlock.c 2006-09-06 00:30:36.000000000 +0300 @@ -53,6 +53,8 @@ #include <pthread.h> #include "rwlock.h" +#if defined(OOPS_IMPLEMENT_RWLOCK) + /* maximum number of times a read lock may be obtained */ #define MAX_READ_LOCKS (INT_MAX - 1) @@ -375,4 +377,6 @@ return(0); } +#endif /* defined(OOPS_IMPLEMENT_RWLOCK) */ + #endif /* _THREAD_SAFE || _PTHREADS || _REENTRANT */ diff -Nru oops-1.5.23.orig/src/lib/rwlock/rwlock.h oops-1.5.23/src/lib/rwlock/rwlock.h --- oops-1.5.23.orig/src/lib/rwlock/rwlock.h 2003-10-06 17:15:40.000000000 +0300 +++ oops-1.5.23/src/lib/rwlock/rwlock.h 2006-09-06 00:29:46.000000000 +0300 @@ -53,6 +53,7 @@ #if !defined(PTHREAD_RWLOCK_INITIALIZER) #define PTHREAD_RWLOCK_INITIALIZER NULL +#define OOPS_IMPLEMENT_RWLOCK 1 struct pthread_rwlock { pthread_mutex_t lock; /* monitor lock */
Переписать этот ужас.
Только Debian. Пользователь, которому принадлежат сайты, должен быть предварительно создан.
#!/bin/bash function read_domain { if [[ -z $domain ]]; then echo -n "Provide domain to add: " read domain fi } function read_user { if [[ -z $user ]]; then echo -n "Provide domain's owner login: " read user fi } function read_logs { if [[ -z $logs ]]; then echo -n "Enable access/error logs? [y/N]: " read logs fi case $logs in y*|Y*) LOGS=1 ;; *) unset $logs ;; esac } function init_vars { #### BASE SETTINGS #### CLIENTS_HOME="/home/clients" DOMAIN_DIR="/home/clients/$user/domains/$domain" DOCROOT="$DOMAIN_DIR/html" LOGSDIR="$DOMAIN_DIR/logs" TMPCONFDIR="/opt/scripts/www_configs" # can be set as IP='111.111.111.111' IP=`ip route get 8.8.8.8 | head -1 | awk '{print $NF}'` if [[ ! -d $TMPCONFDIR ]]; then mkdir -p $TMPCONFDIR fi if [[ -z `id $user` ]]; then echo "You need to create user '$user' first!" exit 1 fi if [[ ! -d $DOCROOT ]]; then mkdir -p $DOCROOT chown -R $user:$user $DOCROOT fi if [[ ! -d $LOGSDIR ]]; then mkdir -p $LOGSDIR fi } function generate_apache_vhost { if [[ $logs ]]; then local log_block="LogLevel warn ErrorLog $LOGSDIR/apache_error_log CustomLog $LOGSDIR/apache_access_log combined" fi if [[ $domain ]] && [[ $user ]]; then cat > $TMPCONFDIR/apache.$domain << EOF <VirtualHost 127.0.0.1:82> <IfModule mpm_itk_module> AssignUserId $user $user </IfModule> ServerName $domain ServerAlias www.$domain ServerAdmin $user@$domain DocumentRoot $DOCROOT <Directory /> Options FollowSymLinks AllowOverride None </Directory> <Directory $DOCROOT> Options -Indexes FollowSymLinks MultiViews AllowOverride All Order allow,deny allow from all </Directory> ScriptAlias /cgi-bin/ $DOCROOT/cgi-bin/ <Directory "$DOCROOT/cgi-bin/"> AllowOverride None Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch Order allow,deny Allow from all </Directory> $log_block </VirtualHost> EOF fi } function generate_nginx_vhost { if [[ $logs ]]; then local log_block="access_log $LOGSDIR/nginx_access_log; error_log $LOGSDIR/nginx_error_log;" fi if [[ $domain ]] && [[ $user ]]; then cat > $TMPCONFDIR/nginx.$domain << EOF server { listen 80; server_name $domain www.$domain; root $DOCROOT; location / { proxy_pass http://127.0.0.1:82/; proxy_redirect off; proxy_set_header Host \$host; proxy_set_header X-Real-IP \$remote_addr; proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for; proxy_max_temp_file_size 0; client_max_body_size 10m; client_body_buffer_size 128k; proxy_connect_timeout 90; proxy_send_timeout 90; proxy_read_timeout 90; proxy_buffer_size 4k; proxy_buffers 4 32k; proxy_busy_buffers_size 64k; proxy_temp_file_write_size 64k; } location ~* ^.+.(jpg|gif|png|avi|mpg|zip|exe)$ { root $DOCROOT; } $log_block } EOF fi } function generate_named_vhost { serial=`/bin/date +"%Y%m%d%k"` cat >$TMPCONFDIR/named.$domain<< EOF \$TTL 10800 @ IN SOA ns1.$domain. root.$domain. ( $serial ; serial 10800 ; refresh 3600 ; retry 604800 ; expire 3600 ) ; minimum ; NS IN NS ns1.$domain. IN NS ns2.$domain. ; MX IN MX 10 mx1.$domain. ; records ns1 IN A $IP ns2 IN A $IP mx1 IN A $IP www IN A $IP $domain. IN A $IP EOF } function enable_apache_vhost { if [[ -f "/etc/apache2/sites-available/${domain}.conf" ]]; then echo "Domain $domain already exists in /etc/apache2/sites-available/${domain}.conf" exit 1 else cp $TMPCONFDIR/apache.$domain /etc/apache2/sites-available/${domain}.conf a2ensite $domain if [[ -z `apache2ctl configtest` ]]; then /etc/init.d/apache2 reload echo "$domain enabled!" else echo "Errors detected, please solve it manually!" exit 1 fi fi } function enable_nginx_vhost { if [[ -f "/etc/nginx/sites-available/$domain" ]]; then echo "Domain $domain already exists in /etc/nginx/sites-available/$domain" exit 1 else cp $TMPCONFDIR/nginx.$domain /etc/nginx/sites-available/$domain ln -s /etc/nginx/sites-available/$domain /etc/nginx/sites-enabled/$domain if [[ -z `nginx -t` ]]; then /etc/init.d/nginx reload echo "$domain enabled!" else echo "Errors detected, please solve it manually!" exit 1 fi fi } function enable_named_vhost { [[ -d "/etc/bind/zones" ]] || mkdir -p "/etc/bind/zones" if [[ -f "/etc/bind/zones/$domain.conf" ]]; then echo "Zone $domain already exists in /etc/bind/zones/$domain.conf" exit 1 else cp $TMPCONFDIR/named.$domain /etc/bind/zones/$domain.conf cat >>/etc/bind/named.conf.local<< EOF zone "$domain" { type master; file "/etc/bind/zones/$domain.conf"; }; EOF if [[ -z `/usr/sbin/named-checkconf` && -z `/usr/sbin/named-checkzone -q $domain /etc/bind/zones/$domain.conf` ]] ; then /usr/sbin/rndc reload echo "bind9: $domain enabled" else echo "Errors detected, please solve it manually!" exit 1 fi fi } function enable_logrotate { if [[ ! -d "/etc/logrotate.d/vhosts" ]]; then mkdir -p /etc/logrotate.d/vhosts fi cat > $TMPCONFDIR/logrotate.$domain << EOF $LOGSDIR/*_log { daily missingok rotate 52 compress delaycompress notifempty create 0644 root root sharedscripts prerotate if [ -d /etc/logrotate.d/httpd-prerotate ]; then \\ run-parts /etc/logrotate.d/httpd-prerotate; \\ fi; \\ endscript postrotate /etc/init.d/apache2 reload > /dev/null [ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid` endscript } EOF if [[ $logs ]]; then # install logrotate if [[ -f "/etc/logrotate.d/vhosts/$domain" ]]; then echo "Domain $domain already exists in /etc/logrotate.d/vhosts/$domain" exit 1 else cp $TMPCONFDIR/logrotate.$domain /etc/logrotate.d/vhosts/$domain fi fi } read_domain read_user read_logs init_vars generate_apache_vhost generate_nginx_vhost generate_named_vhost enable_apache_vhost enable_nginx_vhost enable_named_vhost enable_logrotate
Необходимо предварительно создать пользователя http
#!/bin/bash echo -n "Введите имя сайта: " read domain # СОЗДАНИЕ ДИРЕКТОРИИ mkdir -p /home/http/domains/$domain/html/cgi-bin chown -R http:http /home/http/domains/$domain/html # СОЗДАНИЕ КОНФИГА ВИРТХОСТА ДЛЯ АПАЧА cat >/etc/apache2/sites-available/$domain << EOF <VirtualHost *:80> ServerName $domain ServerAlias www.$domain DocumentRoot /home/http/domains/$domain/html ErrorLog /dev/null ScriptAlias /cgi-bin/ "/home/http/domains/$domain/html/cgi-bin/" <Directory "/cgi-bin/"> AllowOverride None Options None +FollowSymLinks ExecCGI DirectoryIndex index.pl </Directory> <Directory /> Options All -Indexes AllowOverride All </Directory> </VirtualHost> EOF # ВКЛЮЧЕНИЕ ВИРТХОСТА /usr/sbin/a2ensite $domain /etc/init.d/apache2 reload # СОЗДАНИЕ ФАЙЛА ДНС-ЗОНЫ serial=`/bin/date +"%Y%m%d%k"` cat >/etc/bind/zones/$domain<< EOF \$TTL 10800 @ IN SOA ns1.$domain. root.$domain. ( $serial ; serial 10800 ; refresh 3600 ; retry 604800 ; expire 3600 ) ; minimum ; NS IN NS ns1.$domain. IN NS ns2.$domain. ; MX IN MX 10 mx1.$domain. ; records ns1 IN A 95.169.190.217 ns2 IN A 95.169.191.217 www IN A 95.169.191.217 $domain. IN A 95.169.191.217 EOF # СОЗДАНИЕ ЗАПИСИ О ДНС-ЗОНЕ cat >>/etc/bind/named.conf.local<< EOF zone "$domain" { type master; file "/etc/bind/zones/$domain"; }; EOF # ВКЛЮЧЕНИЕ ЗОНЫ /usr/sbin/rndc reload
Костыль проверяет количество чайлдов апача, если это количество меньше значения директивы MinSpareServers, то прибивает все процессы вебсервера через kill -9, чистит семафоры и стартует апач. Добавить в крон на каждую минуту.
* * * * * /opt/scripts/apache/apache_checker.sh check
# mkdir /opt/scripts/apache
#!/bin/sh ALERTEMAIL="[email protected]" APACHECTL=/usr/sbin/apache2ctl SCRIPT_DIR=/opt/scripts/apache RUNNING_PROCESSES=`ps auxww | grep -c bin/apache`; APACHEUSER="www-data" MinSpareServers="24" ######## [DO NOT MODIFY] ### LOG_FILE=${SCRIPT_DIR}/status.log DATE=`date '+%Y-%m-%d %T'` apache_start() { $APACHECTL start; } apache_stop() { $APACHECTL stop; sleep 1; killall -9 apache httpd apache2 >/dev/null 2>&1; } apache_restart() { apache_stop; sleep 1; apache_semclear; apache_start; } # if not running - start apache_check() { if [[ ${RUNNING_PROCESSES} -le $MinSpareServers ]]; then apache_restart; echo "${DATE} ALERT: `hostname -f` - apache was restarted" >> ${LOG_FILE}; echo "${DATE} ALERT: `hostname -f` - apache was restarted" | /usr/sbin/sendmail $ALERTEMAIL; fi } # clear semaphores apache_semclear() { for i in `ipcs | grep $APACHEUSER | awk -F ' ' '{ print $2}'` do ipcrm -s $i; done } case $1 in start) apache_start; ;; stop) apache_stop; ;; restart) apache_restart; ;; check) apache_check; ;; semclear) apache_semclear; ;; *) echo "Script usage: $0 start | stop | restart | check | semclear"; esac
Работает под debian.
# mkdir -p /opt/scripts/monitoring/active_alerts
Скрипт ложить в /opt/scripts/monitoring/checker.sh
#!/bin/bash SCRIPT_DIR=/opt/scripts/monitoring LOG_FILE=${SCRIPT_DIR}/status.log PHONES="80501234567 80507654321" CURDATE=`/bin/date +"%s"`; function alert { for i in $PHONES; do echo "$1 $2 $3" | /usr/sbin/sendmail -fmonitoring@monitoring ${i}@sms.mysmsgate.com; done } function check { cat $SCRIPT_DIR/targets | while read ip server; do /usr/bin/wget -T 5 --tries=3 -q -O - http://${ip}/.do_not_remove.php | grep SUCCESS >/dev/null; if [[ $? == 0 ]]; then if [[ -e $SCRIPT_DIR/active_alerts/$server ]]; then cat $SCRIPT_DIR/active_alerts/$server | while read startdate; do DATE=`/bin/date +"%F %T"`; let "i = $CURDATE - $startdate"; lenght=`/bin/date -u +"%T" --date=@${i}`; alert "$DATE" $server "is UP, downtime is $lenght"; echo "$DATE" $server "is UP, downtime is $lenght" > $LOG_FILE rm -f $SCRIPT_DIR/active_alerts/$server done fi else if [[ -e $SCRIPT_DIR/active_alerts/$server ]]; then MINUTE=`/bin/date +"%M"` if [[ $MINUTE == 00 ]]; then cat $SCRIPT_DIR/active_alerts/$server | while read startdate; do DATE=`/bin/date +"%F %T"`; let "i = $CURDATE - $startdate"; lenght=`/bin/date -u +"%T" --date=@${i}`; alert "$DATE" $server "down for $lenght"; done fi else echo $CURDATE > $SCRIPT_DIR/active_alerts/$server; DATE=`/bin/date +"%F %T"`; alert "$DATE" $server "is DOWN"; echo "$DATE" $server "is UP, downtime is $lenght" > $LOG_FILE fi fi done } check
local <HOST IP> port 1194 proto tcp dev tun ca /usr/local/etc/openvpn/ca.crt cert /usr/local/etc/openvpn/server.crt key /usr/local/etc/openvpn/server.key dh /usr/local/etc/openvpn/dh1024.pem server 192.168.78.0 255.255.255.0 ifconfig-pool-persist /usr/local/etc/openvpn/ips push "redirect-gateway" auth-user-pass-verify /usr/local/etc/openvpn/auth.pl via-env client-cert-not-required username-as-common-name keepalive 100 120 comp-lzo client-config-dir /usr/local/etc/openvpn/ccd max-clients 250 persist-key persist-tun status /usr/local/etc/openvpn/openvpn-status.log verb 3
#!/usr/bin/perl use strict; my $passwdfile = "/usr/local/etc/openvpn/users"; my $isValidUser = 0; my $username; my $password; my $thisUsername = $ENV{'username'}; my $thisPassword = $ENV{'password'}; open (PASSWORDS,"$passwdfile") or die "can't find file: $passwdfile : $!\n"; while (<PASSWORDS>) { ($username,$password)= split (/:/, $_); chomp $username; chomp $password; if ($username eq $thisUsername && $password eq $thisPassword) { $isValidUser = 1; last; } } close PASSWORDS; if ($isValidUser == 1) { print "ERR\n"; exit 1; } else { print "OK\n"; exit 0; }
client dev tun proto tcp remote <HOST IP> 1194 resolv-retry infinite nobind persist-key persist-tun pull auth-user-pass ca ca.crt comp-lzo verb 3
login:password
Имя файла должно полностью совпадать с login. Для нормальной работы openvpn-клиента под windows - IP шлюза и серый IP клиента должны быть из одной /30 подсети. Под linux/BSD таких ограничений нет.
ifconfig-push 192.168.78.CIENT_IP 192.168.78.VPN_GATEWAY
Операционная система должна быть свежеустановленной, без векового барахла. Настоятельно рекомендую обновить древо портов перед началом работ на сервере:
# portsnap fetch && portsnap extract
Установка программного обеспечения из портов
Не стоит забывать про диалоговые окна в процессе установки приложений и периодчески заглядывать в консоль, в которой происходит сборка.
# make install clean -C /usr/ports/textproc/libxml2 && make install clean -C /usr/ports/ftp/curl && make install clean -C /usr/ports/mail/cclient && make install clean -C /usr/ports/security/mcrypt && \ make install clean -C /usr/ports/databases/mysql50-server && make install clean -C /usr/ports/www/nginx && make install clean -C /usr/ports/ftp/vsftpd && make install clean -C /usr/ports/graphics/jpeg && \ make install clean -C /usr/ports/graphics/png && make install clean -C /usr/ports/www/oops && make install clean -C /usr/ports/net-mgmt/net-snmp && make install clean -C /usr/ports/devel/libltdl15 && \ make install clean -C /usr/ports/ftp/wget && make install clean -C /usr/ports/net/mpd && make install clean -C /usr/ports/devel/zziplib && make install clean -C /usr/ports/textproc/libxslt && \ make install clean -C /usr/ports/textproc/sablotron && make install clean -C /usr/ports/net/cvsup
Всяческие рулезы
# mkdir -p /home/mysql && chown mysql\: /home/mysql # wget http://kyxap.crimea.ua/rc/vimrc -O ~/.vimrc # wget http://kyxap.crimea.ua/rc/screenrc -O ~/.screenrc # mkdir -p /opt/etc/php5 && mkdir -p /opt/etc/php4
Предварительно стягиваем последнее древо исходных кодов FreeBSD:
# cat > /root/standart.cvsup << EOF *default host=cvsup13.us.FreeBSD.org *default base=/var/db *default prefix=/usr *default release=cvs tag=RELENG_6_2 *default delete use-rel-suffix *default compress src-all EOF # cvsup -g -L 2 /root/standart.cvsup
Включаем поддержку SASL2 по доке Аутентификация SMTP: штатный sendmail + SASL. Для установки дедикита надо выполнить п.1, п.2, п.3, п.5, п.7, п.8.
Если нам необходимо использовать apache-2.2.6
, то в файл /boot/loader.conf нам необходимо добавить строчку accf_http_load="YES"
.
Загружаем модуль:
# kldload accf_http
Включаем форвардинг пакетов:
# sysctl -w net.inet.ip.forwarding=1
Добавляем дефолтные опции для сервера в /etc/make.conf
# cat > /etc/make.conf << EOF BATCH=yes WITHOUT_X11=yes WITHOUT_FONTCONFIG=yes EOF
Добавление установленных демонов в список загружаемых сервисов + настройка демонов
Прописываем в /etc/rc.conf флаги для автозапуска нужных нам сервисов.
gateway_enable="YES" named_enable="YES" mysql_enable="YES" mysql_dbdir="/home/mysql" mysql_args="--skip-locking --skip-name-resolve -O max_connect_errors=500000 -O max_connections=1000" sendmail_enable="YES" vsftpd_enable="YES" mpd_enable="YES" oops_enable="YES"
В файле /usr/local/etc/vsftpd.conf должны содержаться следующие записи:
anonymous_enable=NO background=YES listen=YES local_enable=YES write_enable=YES local_umask=022 chroot_local_user=YES
Создаем дефолтные конфиги для mpd
:
cd /usr/local/etc/mpd; cp mpd.conf.sample mpd.conf; cp mpd.links.sample mpd.links; cp mpd.script.sample mpd.script; cp mpd.secret.sample mpd.secret;
В файле /etc/namedb/named.conf ищем строку listen-on { 127.0.0.1; };
и комментируем ее.
Установка APACHE из исходных кодов
Стягиваем в /opt/src необходимую версию apache отсюда
: http://www.apache.org/dist/httpd/
Распаковываем, заходим в директорию с исходными кодами, создаем файл MyConfig.sh, в который записываем следующие строки:
Для apache-1.3.x
#!/bin/sh OPTIM="-D_FILE_OFFSET_BITS=64 -DDEFAULT_LISTENBACKLOG=1024 -DHARD_SERVER_LIMIT=1024" ./configure --prefix=/opt/<apache-1.3.x> --enable-module=so --enable-module=rewrite --enable-module=ssl
Для apache-2.x
#!/bin/sh OPTIM="-D_FILE_OFFSET_BITS=64 -DDEFAULT_LISTENBACKLOG=1024 -DHARD_SERVER_LIMIT=1024" ./configure --prefix=/opt/<apache-2.x> --enable-so --enable-cgi --enable-rewrite --with-mpm=worker --with-expat=builtin
Компилируем, устанавливаем и создаем симлинку:
# sh MyConfig.sh # make # make install # ln -s /opt/apache-x.x.x /usr/local/apache
Установка PHP из исходных кодов
Стягиваем в /opt/src необходимую версию php
отсюда: http://museum.php.net/
Распаковываем, заходим в директорию с исходными кодами, создаем файл MyConfig.sh, в который записываем следующие строки:
(Для версии apache-1.x ключ –with-apxs, для версии apache-2.x ключ –with-apxs2)
Для php-4.x
#!/bin/sh CFLAGS="-DEAPI -O2" ./configure --prefix=/opt/php-4.x \ --with-apxs=/usr/local/apache/bin/apxs \ --with-config-file-path=/opt/etc/php4 \ --enable-calendar \ --enable-sysvsem \ --enable-sysvshm \ --enable-sysvmsg \ --enable-ftp \ --enable-track-vars \ --with-zip \ --with-mysql=/usr \ --enable-bcmath \ --with-bz2 \ --with-gd \ --with-jpeg-dir \ --with-zlib-dir \ --with-curl \ --enable-sockets \ --with-iconv \ --enable-mbstring \ --enable-mbregex \ --enable-ctype \ --enable-shmop \ --enable-wddx \ --with-imap \ --with-kerberos \ --with-freetype-dir \ --with-dom \ --with-dom-xslt \ --with-dom-exslt \ --with-xmlrpc \ --enable-xslt \ --with-xslt-sablot \ --with-expat-dir=/usr \ --enable-dbase \ --with-mime-magic \ --with-mhash \ --with-openssl \ --with-mcrypt \ --with-imap-ssl \ --enable-memory-limit
Для php-5.x
#!/bin/sh CFLAGS="-O2" ./configure --prefix=/opt/php-5.х \ --with-apxs2=/usr/local/apache/bin/apxs\ --enable-calendar \ --enable-sysvsem \ --enable-sysvshm \ --enable-sysvmsg \ --enable-ftp \ --with-mcrypt \ --with-mysql \ --with-mysqli \ --enable-bcmath \ --with-bz2 \ --with-gd \ --with-jpeg-dir \ --with-zlib-dir \ --with-curl \ --enable-sockets \ --with-iconv \ --enable-mbstring \ --enable-mbregex \ --enable-ctype \ --enable-shmop \ --enable-wddx \ --with-imap \ --with-freetype-dir \ --with-xmlrpc \ --enable-dbase \ --with-mime-magic \ --with-mhash \ --with-gettext \ --with-imap-ssl \ --with-pear \ --with-openssl \ --with-config-file-path=/opt/etc/php5
Компилируем, устанавливаем и создаем симлинку:
# sh MyConfig.sh # make # make install # ln -s /opt/php-x.x.x /usr/local/php
Если при make install ругается что
cp: libs/libphp5.so: No such file or directory
то делаем:
1. run your configure script as it is 2. Open the libtool file that is created in the php source directory 3. find the variable definition: deplibs_check_method= 4. edit it to read: deplibs_check_method="pass_all" 5. run make
В зависимости от версии php, делаем:
# cp /opt/src/php-x.x.x/php.ini-dist в /opt/etc/phpX
Запуск сервисов
# /etc/rc.d/sendmail restart # /etc/rc.d/named start # /usr/local/etc/rc.d/mysq-server start # /usr/local/etc/rc.d/oops start # /usr/local/etc/rc.d/vsftpd start # /usr/local/etc/rc.d/mpd start # /usr/local/apache/bin/apachectl start
Установка Zend Optimizer
Тянем архив:
# make fetch -C /usr/ports/devel/ZendOptimizer/ && mv /usr/ports/distfiles/ZendOptimizer-* /opt/src
Распаковываем, заходим в директорию и запускаем install-tty
.
Следуем инструкциям инсталлятора, в пути к рнр.ini
указываем значение переменной –with-config-file-path
из файла MyConfig.sh
.
Часто возникает ситуация, когда для пользователей, разъезжающих по командировкам, нужно организовать почтовый релэй.
Проблема в том, что штатный для FreeBSD sendmail настраивается на прием почты только от доверенных IP-адресов (или IP-сетей), и заранее неизвестно, с какого IP-адреса пользователь будет отправлять почту.
Как одно из решений - выдать такому пользователю логин/пароль и настроить sendmail на прием почты, основываясь на этих данных, независимо от IP-адреса, с которого пришел пользователь. Собственно рецепт настройки sendmail'a я и привожу здесь.
Благодарность за рецепт уходит Victor Prylipko <Victor.Prylipko АТ f4.n4635.z2.fidonet.org> из фидо-конференции ru.unix.bsd
Дано:
FreeBSD 4.8 STABLE;
sendmail - штатный.
Требуется:
настроить авторизацию клиента использующего Outlook Express при приеме почты от него, нужно для возможности принимать почту от клиента, если он отправляет почту с "чужих" IP-адресов.
1. Ставим из портов cyrus-sasl2 и cyrus-sasl2-saslauthd
# portinstall cyrus-sasl2 # portinstall cyrus-sasl2-saslauthd
2. Из /etc/defaults/make.conf копируем строки в /etc/make.conf
SENDMAIL_CFLAGS=-I/usr/local/include -DSASL=2 SENDMAIL_LDFLAGS=-L/usr/local/lib SENDMAIL_LDADD=-lsasl2
3. Пересобираем sendmail
# 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
4. Добавляем строку в /etc/rc.conf
sasl_saslauthd_flags="-a sasldb"
5. Запускаем демон SASL-а
# /usr/local/etc/rc.d/saslauthd.sh start
Этот пункт рецепта спонсирован Slava Vovk aka vovk АТ km.ua
6. Создаем Sendmail.conf
# echo pwcheck_method: saslauthd > /usr/local/lib/sasl2/Sendmail.conf
Там же можно указать, где лежит srvtab:
# echo srvtab: /etc/srvtab >> /usr/local/lib/sasl2/Sendmail.conf
7. Добавляем сроки в ваш .mc файл
TRUST_AUTH_MECH(`DIGEST-MD5 CRAM-MD5 PLAIN LOGIN')dnl define(`confAUTH_MECHANISMS', `DIGEST-MD5 CRAM-MD5 PLAIN LOGIN')dnl
В принципе можно ограничится только одним методом LOGIN, если нужно только для Outlook Express (других клиентов я не пробовал).
TRUST_AUTH_MECH(`LOGIN')dnl define(`confAUTH_MECHANISMS', `LOGIN')dnl
8. Генерим sendmail.cf и устанавливаем его
# cd /etc/mail # make install restart
9. Заводим пользователя в базу SASL
# saslpasswd2 -a sendmail newuser
проверка, что пользователь добавлен:
# sasldblistusers2
выдаст список пользователей в базе.
10. Создаем пустой файл /etc/srvtab чтобы sendmail в логах не ругался, хотя можно этого и не делать.
11. В настройках Outlook Express - Tools | Accounts… | нужный аккаунт | Properties | Servers | ставим "галочку" My server requires authentication и жмем кнопку Settings… вводим Account name и Password которые занесли в базу в 8-м пункте.
Все, почта от пользователя принимается невзирая на /etc/mail/access.db