Skip to content

By Тодор in Фун

Средното си образование изкарах в тогавашното ТМТ – Пазарджик, специалност електрообзавеждане на промишлени предприятия (ЕОПП). В 3-ти и 4-ти курс имахме часове при г-н Г. Гацев, който още е ярък спомен в съзнанието на всички ни. Не само с наученото в часовете при него, ами и с всичко преживяно. Меко казано е, че той беше голям чешит. Та в часовете при него си водех дневник с по-интересни фрази и на гърба на тетрадките си. Скоро попаднах на това и отново се смях доста. Ето и препис от почти всичко. Посмейте се.
Повечето ни часове бяха в електрическата лаборатория – стая напълно електро-обезопасена – дебел гумен балатум (2см), радиаторите, тръбите и всички метални хави бяха заградени с дървени решетки, влизаше се със специални „електроизолационни“ пантофи, за които събрахме по 11лв в началото на годината… другото си го представете.
(правописът следва интонацията и произношението)

(кара се на Ицо)
А уе м’че, не приказвай кат’ вятърна мелница !

(обяснява, че директорката иска да носим ръкавици по време на работа, за да не ни удари ток)
А… „изгъзици“, дет` му викате виъ…

(разяснява охрана на труда и първа помощ)
Ако… нали… са узувеш под напрежение…..

(разказва как някакъв ученик навремето изпитвал трансформатор)
Добре, че тогава камъните бяха меки и ни гу утрепа токъ…

(обяснява как да си правим протоколите)
Не бъди бълък!

(и на контролното упражнение който не е учил…)
Ша стани тчва дет’ ни са-а случвало…

(обяснява как се влиза в Енерго-то)
Тряа да има стратегия и тактика в тоя живот.

(показва ни една изпитваща програмка на Правец-осмаците)
Е т’ва тука, е машинка за писане на двойки !

(обяснява какво става с ученик (който е преписал) на изпит когато учителя пита)
„Защо?“ – и той умира прав

(говори за един от нашия клас, който отиде до ксерокса да снима)
Тя… Томата си знае работата…

(домашна работа)
На лис’ голям формат – устно…

(говори за тия от трети курс)
Въртят са кат’ индянци пред компютър…

(оформяне на срочните оценки)
Срока свършва ‘неска, утре започва на ново.

(става въпрос за Томата, когато беше болен)
Трудолюбив, ама изпуснал влака.

(три пъти му заби компютъра (осмака, който е поправял поне 60 пъти сам))
(мърмори си)
Толко са ми силите… или акъла… не знам…

(пак обяснява какво е на изпит)
‘Секи си гледа гъзъ до стената и не го интересува…

(девизът)
Работата по спасяване на давещия се е работа предимно на ръцете на самия давещ се.

(обяснява, че ако не учиш…)
Недей чакай да падне тавана! Киното е лятно.

(дава допълнителна (трудна) задача за домашна)
Внимание!!! – Задачата е орех.

(обяснява една схема)
Ако… ммм… и сега ! ммм…

(говори за Топалов, щото нали не учел, но пак минал)
Пие бира, плаща лимонада.

(Томата идва и вика „Ма той Топалов не носи ‘серокопията“)
Ша му спукам гьона!

(защо техниката е стара и потрошена)
Работата е държавна!
Организацията е българска.

(когато искаш да имаш по-висока оценка)
Ааа… Играта е „ти гониш !“

(защо тия, които са учили имат тройки, а Топалов, който не учи – също)
Даа… той Топалов прави инфлация на оценките… начи… ша дигнем ‘сички останали уценки с една единица.

(редовния мохабет когато си пропуснал нещо в протокола)
Ууубаче…

(излиза директорката от стаята и той са развиква)
Събрани сте повече народ за по-евтино!

(как се влиза в Енергото)
Тактиката печели битката, а стратегията войната!

(говори за наща група след контролното (имахме хубави оценки))
Хмм… групата има смисъл!

(някои не може да си направи задачата)
Тя… работата е мозъчна!

(пак)
Плуване се учи с плуване.

(говори за преговор)
Ако са задълбаеме в теорията по машини…

(началото на втория срок. пише двойка на Ицо)
Аз така… да та свикна, че сме след ваканция.

(разказва за някакъв ученик, който не учел)
Ай да видим дали ша остане на изпит!
ОПАААА! – Изпит.

(директорката отново му плямпа за ръкавици, но той вади едно ръководство поне 500 стр. и вика „Е тва е правилника – покажи ми къде пише нещо за ръкавици!“, директорката излиза след малко, той ни гледа и се хили)
Е т’ва е удар под… ребрата.

(нали техниката е стара и счупена…)
Аз съм длъжен да направя от нищо нещо.

(Гацев светка директорката по някав въпрос)
Директорката: „А-а-ами… ?!“
Гацев: „… ти командваш парада !“

(някой дето учи, ама не редовно)
То… тя… кокошката зела да мъти яйца, ама… не ги доизмътила.

(говори за Томата, който имаше няколко двойки)
Той тря’а да изкара поне две тройки… и едното да е четири !

(сочи на дъската)
Пиши заглавието – отзад на пред !

(иска да каже „трябва да си по-нисък от тревата“, нали, ако не си си научил урока)
Тря’а да си по-нисък от… ко беше там…

(диктува ни след упражнение на края на часа)
Пиши!
„Ако се появя по лаборатория без протокол – ще ме блъсне влак!“

(започва да диктува)
Хмм… Пиши!
Хмм… не, то’о волтметър не му е мястото тука…
Пиши!
И сега… ако латера беше на максимум, хммм, чай да видим к’о щеше да стане…
Добре. Пиши!
(влиза Христев: „Добър ден.“, Гацев: „Ай сядай, сядай, че няма време“)
И сега… Пиши!
(и би звънеца)

(навиква Ицо)
Ш, м’че бръкни в контакта, почувствай закона на Ом и си сядай на мястото бе!

Tags: , , ,

By Тодор in FreeBSD, Linux, Solaris

Важно е да следим, с колко свободно пространство разполагаме. Давам пример на едно роботче писано на bash, което изпраща e-mail (sms), когато свободното пространство на посочен дял от диска падне под определена граница:


#!/bin/bash

#------Configuration

#Send alert to this email address
EMAIL="35988xxxxxxx@sms.mtel.net"

#Partition which should be monitored
PARTITION="/dev/md1"

#If free space is less than this value in KB - send email
SPACELIMIT=1000000

#How long to wait in minutes to send another email
REMINDTIMEOUT=120

#Time format used in the message
TIME=`date +"%d.%m.%y %H:%M"`

#The marker prevents sending of too many messages
#Must be unique for each partition monitored.
#Add different numbers at the end of the file name for each partition
MARKER="/tmp/freespacereached"

#------END of Configuration

if [ -f $MARKER ]; then
    MARKERAGE=$(($((`date +%s`-`stat -c %Z $MARKER`)) / 60))
else
    MARKERAGE=0
fi

if [ $MARKERAGE -gt $REMINDTIMEOUT ]; then
    rm -f $MARKER
fi

FREESPACE=`df | grep "$PARTITION" | awk '{ print $4}'`
# Prevent crash in case of wrong partition configuration or data extraction
FREESPACE=$((FREESPACE+0));

if [ $FREESPACE -lt $SPACELIMIT ]; then
    MSG="$TIME - Spacecheck WARNING! - $((FREESPACE/1024))MB available on $PARTITION"
    if [ ! -f "$MARKER" ]; then
        echo $MSG | mail $EMAIL
        touch $MARKER
    fi
else
    rm -f $MARKER
fi

Изпълнението на скрипта се предоставя на cron, като се създава конфигурационен ред, подобен на този:


0 9-21 * * * /scripts/spacecheck.sh

Т.е. прави проверка на всеки кръгъл час, но няма да ни безпокои през нощта 😉

Машината, на която се изпълнява трябва да може да изпраща електронна поща, т.е. трябва да има работещ sendmail, postfix или друга алтернатива.

By Тодор in Cisco

Това е полезна екстра на Cisco IOS и позволява след записването на всяка промяна рутера да архивира копие на конфигурацята си на отдалечен сървър автоматично.

archive
 log config
  hidekeys
 path scp://backup:password@192.168.1.1//mnt/backups/Cisco/router-configs
 write-memory

И така след всяко въвеждане на wr рутера ще си изпраща конфигурацията към вашия бекъп сървър по SCP.

Tags: , , , , , , ,

By Тодор in Фун

By Тодор in Cisco

Конкретен пример как да се направи автоматично прехвърляне към втори Интернет доставчик (или трасе) при пропадане на главната линия.

Рутер (IOS 12.4):
fe0 – 192.168.0.1/24 – вътрешна мрежа
fe1 – 100.100.100.123/24, GW: 100.100.100.1 – трасе1
fe2 – 200.200.200.123/24, GW: 200.200.200.1 – трасе2

Приемаме трасе1 за главна линия, а трасе2 за резервна, която ще се ползва единствено, когато трасе1 не работи. За диагностика дали трасето работи ще ползвам ping.
И двете трасета са за предоставяне на достъп до Интернет, така че за диагностика ще се пингва адрес някъде в Интернет. Избрах един от DNS сървърите на OpenDNS – 208.67.222.222.

Превключването между трасетата ще става като бива сменян шлюзът по подразбиране за рутера (default gateway). За тази цел трябва статично да рутираме заявките до 208.67.222.222 през трасе1 (главното трасе).

ip route 208.67.222.222 255.255.255.255 100.100.100.1

От предишната ми статия вече знаете как се правят пингващи роботчета в Cisco IOS, сега ще разширим малко възможностите на едно такова роботче:

ip sla 1
 icmp-echo 208.67.222.222 source-ip 192.168.0.1
 frequency 30
ip sla schedule 1 life forever start-time now
ip sla reaction-configuration 1 react timeout action-type triggerOnly

Бързо стават ясни фактите:
– пингва 208.67.222.222, като изпраща заявките от името на 192.168.0.1
– пингва през 30 секунди
– цикълът продължава вечно
– когато имаме timeout, това ще предизвика trigger събитие, което сега ще уловим:

track 1 ip sla 1

Пингачката вече трябва да работи, а това можете да проверите с:

debug ip icmp
term mon

Сега е момента да нагласим и самата маршрутизираща таблица на рутера така, че да се съобразява с пингачката и събитията генерирани от нея:

ip route 0.0.0.0 0.0.0.0 100.100.100.1 track 1
ip route 0.0.0.0 0.0.0.0 200.200.200.1 10

Сега какво означава това – първият ред ни дава шлюзът по подразбиране на главното трасе, но „track 1“ означава, че този route ще е валиден само, ако „спусъкът“ track 1 разрешава, т.е. ако пингачката работи и пингвания IP адрес отговаря.
Вторият ред ни дава втори шлюз по подразбиране – този на резервното трасе. Но този route е с по-нисък приоритет (по-голяма метрика – 10), т.е. ще работи, само ако няма route с по-висок приоритет от него (по-ниска метрика).

Можете да видите статуса на track-а в рутиращата таблица ето така:

sh ip route track-table
 ip route 0.0.0.0 0.0.0.0 100.100.100.1 track 1 state is [down]

Когато е down (т.е. пингачката получава таймаути от пингвания адрес) – този route изобщо не съществува в таблицата за рутиране и рутера подхваща следващото налично трасе – през 200.200.200.1.

Дали има NAT или не на рутера няма значение.

Наздраве! 🙂

Tags: , , , , , ,

By Тодор in Cisco

Примера представлява просто изпращане на echo заявки към определен хост през определено време от Cisco IOS. За да повишим фън-фактора, самият cisco рутер ще изпраща тези заявки, а не потребителска машина от вътрешната мрежа.

Конкретно на мен това ми беше необходимо, за да поддържа установен site-to-site VPN, понеже, ако няма трафик през тунела – той се самоизключва, а включването му след това може да отнеме няколко ценни секунди или да провали опит за телефонен разговор (Call Manager Express).

При не-установен тунел и опит за телефонно (VoIP) обаждане от едната мрежа до другата, UDP трафикът който се генерира понякога е недостатъчен да „събуди“ и установи VPN тунела. В резултат на което – провален разговор.

Ето и самият пример:

ip sla 1
 icmp-echo 192.168.10.1 source-ip 192.168.11.1
 frequency 30
ip sla schedule 1 life forever start-time now

Тук пингваме през 30 секунди ИП адреса 192.168.10.1 от името на 192.168.11.1 (интерфейса на рутера към вътрешната мрежа), като задачата ще се изпълнява до безкрайност – forever. Можете да си поиграете с параметрите спрямо вашите нужди.

Примерът е от IOS 15.1.

Tags: , , , , , ,

By Тодор in Linux

SNMP е най-удобния протокол да следим състоянието на… всичко – натоварване на мрежовите интерфейси, на процесора, на паметта и на какво ли още не. За темата на тази статия съм загатнал тук, но сега ще дам по-точен пример.

Ще споделя как може да се следи температурата на хард дисковете с негова помощ. Приемам, че сте конфигурирали snmpd правилно и демонът работи (за справка – тук).

В конфигурацията на демона – /etc/snmp/snmpd.conf добавяте това:

exec hdd1temp /root/hdd1temp.sh

Това е съдържанието на /root/hdd1temp.sh:

#!/bin/bash
/usr/sbin/smartctl -A /dev/sda | grep -i temperatur | awk '{print  $10}'

Задължително файлът да е изпълним (chmod +x …).

Рестарт на snmpd и нека проверим какво се случи:

# snmpwalk -v2c -c communitypass localhost UCD-SNMP-MIB::extOutput

Този пример със snmpwalk ще „изплюе“ всички exec редове от snmpd.conf по ред на номерата им.

От тук нататък е въпрос на фантазия какво ще правите със събираните данни. Можете да си настроите аларма при превишаване на температурата с подходящ bash скрипт, както и да рисувате статистика с RRD или MRTG.

Ето така ще получите само конкретната стойност готова за по-нататъшна обработка:

# snmpwalk -v2c -Oqv -c communitypass localhost UCD-SNMP-MIB::extOutput.1

Примерът е от CentOS. За други дистрибуции файлът snmpd.conf може да е в друга директория, но останалото остава същото 😉
Енджой!

Tags: , , , , ,

By Тодор in Linux

Постановката е следната:
Линукс рутер който се ползва за NAT-ване на домашна/офис мрежа за достъп до Интернет.
Два Интернет доставчика за да има някаква резервираност.
В най-простия пример линукс рутера е с 3 лан-карти – Доставчик1, Доставчик2 и Вътрешна мрежа. Приемам, че можете да си конфигурирате маскирането (NAT) така, че вътрешната мрежа да има Интернет, но проблема ви е, че рутера не може да има едновременно два шлюза по подразбиране (default gateway). Добре де, за тези, които не знаят ще дам кратко примерче и за това 🙂

Доставчик1:
закачен е към eth0
IP: 100.100.100.12/255.255.255.0
GW: 100.100.100.1

Доставчик2:
закачен е към eth1
IP: 200.200.200.56/255.255.255.0
GW: 200.200.200.1

Вътрешна мрежа:
закачена е към eth2
192.168.1.1/24

Транслиране на изходящия трафик през интерфейсите към Интернет доставчиците:
# iptables -t nat -A POSTROUTING -j MASQUERADE
Маскирането по този начин работи дори и IP адреса да е динамичен.

От тук нататък дали ще ползваме Доставчик1 или Доставчик2 зависи само от това кой шлюз по подразбиране ще оставим активен на рутера – 100.100.100.1 или 200.200.200.1.

Сега едно малко скрипт-роботче ще проверява през 5 минути (или колкото вие решите) дали има връзка към Интернет. Проверката ще става като пингва един от ДНС сървърите на OpenDNS 208.67.222.222 (може и ИП адреса на някой root-DNS да сложите, няма значение – нещо което е винаги винаги на линия). Механизъмът е устроен така, че ако не получи отговор, ще подмени шлюза с този на другия доставчик.

#!/bin/bash
GW1=100.100.100.1
GW2=200.200.200.1
CHECK_HOST=208.67.222.222

DEFAULT_GW=`ip route list | grep default | awk '{print $3}'`
if /bin/ping -n -c 5 $CHECK_HOST 1>/dev/null 2>/dev/null; then
  echo "Link OK"
else
  echo "Link down! Switching..."
  if [ $DEFAULT_GW==GW1 ]; then
    ip route del default
    ip route add default via $GW2
  else
    ip route del default
    ip route add default via $GW1
  fi
fi

Копирайте този скрипт в текстов файл, направете го изпълним (chmod +x filename) и го добавете в crontab за изпълнение през определено време.

В този пример и двата доставчика са еднакво предпочитани. Т.е. когато от Д1 отпадне и преминем на Д2 – ще останем на Д2 дори и след като Д1 възстанови нормална работа. И така докато ползваният в момента доставчик не отпадне.

В следващ пост ще покажа и пример с 2 доставчика, в който се следи състоянието на 2те линии едновременно и можем да конфигурираме предпочитан и резервен доставчик.

Tags: , , , , , , ,

By Тодор in Linux

По подразбиране в RHEL/CentOS паролите на потребителите се съхраняват под формата на MD5 hash.
Дали е така може да се провери с тази команда:
# authconfig --test | grep hashing

За да променим алгоритъма за генериране на hash-ове пишем това:
# authconfig --passalgo=sha512 --update

Всички нови пароли ще бъдат в SHA512 формат.

Tags: , , , , , ,

By Тодор in Uncategorized

При ъпдейта на Firefox до версия 4.0, започнах да получавам следното съобщение, при опит да посетя сайт, който ползва за идентификация на клиентите си неофициален (самоподписан) сертификат.

Error code: ssl_error_renegotiation_not_allowed

Наскоро беше открита дупка в сигурността при „договарянето“ на криптирана по този начин сесия, която позволява атака от типа man-in-the-middle. Това накара Mozilla да забранят по подразбиране ползването на този тип връзка. Ако все пак желаете да я разрешите – отворете адреса „about:config“ и направете следната корекция:

security.ssl.allow_unrestricted_renego_everywhere__temporarily_available_pref = true

Tags: , , , ,

By Тодор in Uncategorized

Каква е максималната скорост, която можете да измерите чрез Counter32 брояч от SNMP?
Ами зависи през колко време правите отчитанията. Максималната стойност на този брояч е 4294967295 (2^32-1). Нормално е отчитанията било то за MRTG или RRD да се правят през 5минути.
Ето формулата, с която можете да изчислите каква е максималната скорост, която можете да отчетете:

4294967295*8/1000/1000/300=114Mbps

Цифрите, които очастват са:
максимална цифра за брояча преди да се нулира
превръщаме в битове
превръщаме в килобити
превръщаме в мегабити
секундите през които отчитаме

Краен резултат е, че за скорости по-големи от 114Mbps ще получавате грешни отчитания, което е следствие от достигането на максималната стойност за брояча и нулирането му преди да сте го отчели.

Какво можете да направите, за да решите проблема?
а) да ползвате Counter64 броячи (които не винаги са налични)
б) да намалите интервала на отчитане

С Counter64 и отчитане през 5мин ще можете да отчитате фантастичната скорост от над 400Pbps (петабита).

Ако намалим интервала на отчитане с Counter32 брояч:
за 4мин: 4294967295*8/1000/1000/240=143Mbps
за 3мин: 4294967295*8/1000/1000/180=190Mbps
за 2мин: 4294967295*8/1000/1000/120=286Mbps
за 1мин: 4294967295*8/1000/1000/60=572Mbps

Естествено при по-големи отчитащи скриптове отчитането през 1мин може и да не е практично, поради това, че изпълнението на самия скрипт може да отнеме повече време.

Имайте предвид, че при ползване на RRDtool, променяйки интервала на отчитане, трябва да се създаде и нов RRD файл с коректна стъпка на отчитане.

Правете си сметката! 🙂

Tags: , , , , , , , , , , ,

By Тодор in Фун

Някак си моето разбиране за „безплатно“ се разминава доста с това на хостинг компанията fcolor.bg…
Обърнете внимание на текста в червеното правоъгълниче:

Tags: , , ,

By Тодор in Linux

След като вече имаме работещ пощенски сървър със що-годе прилична спам-защита е добре да помислим и за антивирусна защита.
Давам пример отново с CentOS 5.5, Postfix и доста популярната безплатна Clamav.

Инсталация на антивирусната:
# yum install clamav clamav-milter

Редакция на /etc/clamav-milter.conf:

MilterSocket inet:7357
MaxFileSize 100M
AddHeader Replace
ReportHostname mx.kamenitza.org

Показвам само редовете, които аз съм редактирал. Конфигурационният файл е много добре коментиран и описан така, че всеки може да пипа според нуждите си.

Стартираме демоните на антивирусната:

#/etc/init.d/clamd start
#/etc/init.d/clamav-milter start

Ще се покаже съобщение, че вирусните дефиниции са стари. Задължително е да ги обновим:
#freshclam

Добра идея е това да го сложим в cron, за да опреснява периодично:
#crontab -e

И добавяме реда:
0 1 * * * /usr/bin/freshclam

Следва настройката на Postfix, така, че да „прекара“ писмата през антивирусната.
Добавяне в /etc/postfix/main.cf:

smtpd_milters = inet:127.0.0.1:7357
milter_default_action = accept

В случай, че има конфигуриран и друг milter (както е при мен) – просто ги разделете със запетая:
smtpd_milters = inet:localhost:10027, inet:127.0.0.1:7357

Начин да проверите дали писмо е минало през антивирусната е като разгледате хедъра. Там ще видите нещо от сорта на:

X-Virus-Scanned: clamav-milter 0.96.5 at mx.kamenitza.org
X-Virus-Status: Clean

Tags: , , , , , , ,

By Тодор in Linux

Един много добър вариант да покажете, че писмата излизащи от вашият пощенски сървър не са спам е използването на така наречения domainkey. Идеята е следната:
Публичен ключ се съхранява в ТХТ запис на DNS-a на домейна от който ще изпращаме писмата, а с личният ключ се подписва всяко изпратено писмо. Така всеки спам филтър може да сравни двата ключа и да се увери, че писмото е автентично и не е спам. Подобен спам филтър ползва и Google.

Изтегляне на dk-milter:
#rpm -Uvh http://www.topdog-software.com/oss/dk-milter/dk-milter-1.0.2-1.i386.rpm

Генериране на ключовете:

#/usr/share/doc/dk-milter-1.0.2/gentxt.sh

Където
е име по избор, аз използвах „mx“:
#/usr/share/doc/dk-milter-1.0.2/gentxt.sh mx kamenitza.org

Това ще генерира няколко файла:
mx.txt:
mx._domainkey IN TXT "g=; k=rsa; t=y; p=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAMDcC/ip9pXcyRy6H9lw2Nl5aRjeg8KiIeL71tFsg+ja3P4Zm2aCCtjQevStFBKEAZG7cxIMY7mNdnum1dJj55cCAwEAAQ=="

mx.public:

-----BEGIN PUBLIC KEY-----
MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAMDcC/ip9pXcyRy6H9lw2Nl5aRjeg8Ki
IeL71tFsg+ja3P4Zm2aCCtjQevStFBKEAZG7cxIMY7mNdnum1dJj55cCAwEAAQ==
-----END PUBLIC KEY-----

mx.private:

-----BEGIN RSA PRIVATE KEY-----
MIIBOwIBAAJBAMDcC/ip9pXcyRy6H9lw2Nl5aRjeg8KiIeL71tFsg+ja3P4Zm2aC
CtjQevStFBKEAZG7cxIMY7mNdnum1dJj55cCAwEAAQJAE/Ov2V3cAM0CkVJAEUK3
bGg/Ey+R+gTD9LORGcFcNC6h21sClpYV0mrIS1PkXX1cUZgQ9jl/gFzAXORL2E56
IQIhAP8+HmAS8RT+dCOCnioWa2kSmkwmITHnCdePrHVYl6l9AiEAwW6Kyks76ecG
TT8nPegYObAMqokM9fF3XBp4nLcHgaMCIQCGoDYXSIZeI2QQgsl3u4GF1ykJNydV
Ed5wEzjMYCEGZQIgHIs6ceWuPrL3zBhgqxL/2CtxgwzcW8K5MV86oy2jLu8CIQDA
kXZ6SyJvhJsw3KwhLsKU4IKAu1VM/YLzkKaffWVYBw==
-----END RSA PRIVATE KEY-----

Преместете liчният ключ (mx.private) в /etc/mail/domainkeys. След това:
#chown dk-milter:dk-milter mx.private
#chmod 600 mx.private

След това добавете в DNS конфигурацията на зоната на домейна
_domainkey IN TXT "t=y; o=~"
Съдържанието на текстовия файл mx.txt също трябва да бъде добавено в DNS зоната на домейна.

Следва редактиране на /etc/sysconfig/dk-milter:

USER="dk-milt"
PORT="inet:10027@127.0.0.1"
SIGNING_DOMAIN="domain.tld"
SELECTOR_NAME="mx"
KEYFILE="/etc/mail/domainkeys/mx.private"
SIGNER=yes
VERIFIER=yes
CANON=simple
REJECTION="bad=r,dns=t,int=t,no=a,miss=r"
EXTRA_ARGS="-h -l -D"
MILTER_GROUP="mail"

Стартиране на демона:
#/etc/init.d/dk-milter start

И на края редакция на /etc/postfix/main.cf:

smtpd_milters = inet:localhost:10027
non_smtpd_milters = inet:localhot:10027

И рестартирате postfix.

За да се тества дали работи тази конфигурация изпратете празно писмо до test@dktest.jason.long.name.

Информацията за тази статия е синтезирана от http://jason.long.name/dkfilter/

Tags: , , , , , ,

By Тодор in Linux

Много е удобно да се ползват виртуални потребители за пощенски сървър, а е и много по-сигурно.
В тази конфигурация ще ползвам операционна система CentOS 5.5 и демоните dovecot, postfix, postgresql. Косвено участва и Apache, като уеб сървър за уеб интерфейса postfixadmin.

1. Инсталиране на postgresql server:
#yum -y install postgresql-server

След стартиране на postgresql – продължаваме.
Създаване на потребител и база за postfix:

#su postgres
$psql
postgres=# create user postfix with password 'password';
postgres=# create database postfix owner postfix;
postgres=# \q
$exit

2. Инсталиране на Postfix с поддръжка на база данни.
Ако до сега сте имали инсталиран Postfix, той трябва да бъде деинсталиран:
#yum erase postfix

Редактира се /etc/yum.repos.d/CentOS-Base.repo:
В раздел [base] и [updates] се добавя реда:
exclude=postfix
В раздел [centosplus]:
enabled=1

Проверка дали пакета на Postfix с поддръжката на бази данни се „вижда“:

#yum list postfix
...
...
postfix.x86_64  2:2.3.3-2.1.centos.mysql_pgsql

Това, което ни трябва се вижда на края – „…mysql_pgsql“.
Инсталираме:
#yum -y install postfix

Това, което ни трбява в /etc/postfix/main.cf:

myhostname = mail.mydomain.tld
inet_interfaces = all
transport_maps = pgsql:/etc/postfix/transport.cf
virtual_alias_maps = pgsql:/etc/postfix/virtual.cf
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000
virtual_minimum_uid = 5000
virtual_minimum_gid = 5000
virtual_mailbox_domains = pgsql:/etc/postfix/transport.cf
virtual_mailbox_base = /home/mail
virtual_mailbox_maps = pgsql:/etc/postfix/mailboxes.cf
virtual_mailbox_limit = 1073741824

Последния ред означава, че имаме лимит от 1GB на пощенска кутия.

/etc/postfix/transport.cf:

hosts = localhost
user = postfix
password = password
dbname = postfix
table = domain
select_field = transport
where_field = domain

/etc/postfix/virtual.cf

hosts = localhost
user = postfix
password = password
dbname = postfix
table = alias
select_field = goto
where_field = address

/etc/postfix/mailboxes.cf

hosts = localhost
user = postfix
password = password
dbname = postfix
table = mailbox
select_field = maildir
where_field = username

След като всички конфигурационни файлове са готови, стартираме демона:
#/etc/init.d/postfix start

3. Инсталиране на dovecot:
#yum -y install dovecot

В /etc/dovecot.conf:

auth default {
    mechanisms = plain
    passdb sql {
        args = /etc/dovecot-pgsql.conf
    }
    userdb sql {
        args = /etc/dovecot-pgsql.conf
    }
    socket listen {
        client {
            path = /var/run/dovecot/auth-client
            mode = 0660
            user = postfix
            group = postfix
        }
    }
}
first_valid_uid = 5000
first_valid_gid = 5000

/etc/dovecot-pgsql.conf:

driver = pgsql
connect = host=localhost dbname=postfix user=postfix password=password
default_pass_scheme = crypt
password_query = SELECT password FROM mailbox WHERE username='%u' AND active='1'
user_query = SELECT '/home/mail/'||maildir AS home, '/home/mail/'||maildir AS mail, 5000 as uid, 5000 as gid FROM mailbox WHERE username='%u' AND active='1'

Стартиране на dovecot:
#/etc/init.d/dovecot start

Поглеждаме в /var/log/maillog за евентуални грешки. Ако всичко е наред може би дори ще се вижда и поток от спам към несъществуващи пощенски кутии.

4. Postfixadmin
Инсталацията му се свежда до разархивирането на архива в папка достъпна през уеб и редакцията на config.inc.php, като в него единствено трябва да са попълни конфигурацията за достъп до базата данни.

След като създадем потребители чрез postfixadmin, те вече ще могат да получават поща, както и ще имат достъп до пощенските си кутии чрез IMAP/POP3.

5. Изпращане на електронна поща – SMTP
Елементарен начин това да стане е като се опишат мрежите, които е разрешено да релейват през този пощенски сървър в /etc/postfix/main.cf:
mynetworks = 127.0.0.0/8 192.168.0.0/24

Това не е най-сигурният метод, понеже не използва никаква идентификация на ниво потребител.
По-добрият вариант е потребителят да трябва да се идентифицира, за да изпрати успешно писмо.
Добавяме в /etc/postfix/main.cf следните няколко реда:

smtpd_sasl_type = dovecot
smtpd_sasl_path = /var/run/dovecot/auth-client
smtpd_sasl_auth_enable = yes
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination

Вече можете и да изпращате през този сървър 😉

Добре ще е да сложим и елементарна спам-защита. Необхоримо е да преработим smtpd_recipient_restrictions записа в main.cf, така, че да се получи следното:

smtpd_recipient_restrictions =
    reject_non_fqdn_sender,
    reject_non_fqdn_recipient,
    permit_mynetworks,
    permit_sasl_authenticated,
    check_client_access hash:/etc/postfix/whitelist,
    reject_rbl_client zen.spamhaus.org,
    reject_rbl_client bl.spamcop.net,
    reject_rbl_client 0spam.fusionzero.com,
    reject_rbl_client bl.spamcannibal.org,
    reject_rbl_client blackholes.five-ten-sg.com,
    reject_rbl_client blackholes.intersil.net,
    reject_rbl_client dnsbl.sorbs.net,
    reject_rbl_client dnsbl-0.uceprotect.net,
    reject_rbl_client dnsbl-1.uceprotect.net,
    reject_unauth_destination

Като файлът /etc/postfix/whitelist съдържа хостове изпращащи поща, които не желаете да преминат през спам-филтрите. Обикновено това са пощенски сървъри на мързеливи администратори, които не отговарят на някое или всички изисквания за легитимно изпращане на поща. Ето примерно съдържание на файла:

212.39.90.88  OK
mbox.contact.bg  OK
sts-tech.com  OK
87.121.24.7  OK

Това е всичко необходимо за напълно работещ сървър с виртуални потребители. За въпроси – ползвайте коментарите. Скоро ще пусна статия как да подсигурим същият този сървър с помощта на SSL.

Tags: , , , , , ,