LINUX.ORG.RU
ФорумAdmin

Вопрос по Sendmail (LOCAL_RULESETS)


0

1

Здравствуйте, уважаемые.

У меня теоритический вопрос по Sendmail.
Что делает LOCAL_RULESETS?
Заменяет имеющиеся правила или их как-то дополняет?

Например, пишем вконце стандартного sendmail.mc:
...
LOCAL_RULESETS
SLocal_check_relay
<правила>
...

Генерируем sendmail.cf (m4 sendmail.mc > sendmail.cf). И видим, что в sendmali.cf появились два правила Local_check_relay.
Как они отрабатывают?

Насколько я помню, если в файле sendmail.cf будет несколько секций с правилами одного и того же ruleset, то sendmail объединит их все в одни ruleset.

С помощью LOCAL_CONFIG можно добавлять строки до определения основных ruleset'ов в sendmail.cf, с помощью LOCAL_RULESETS — добавлять строки в конец sendmail.cf. Если в этих конструкциях содержатся существующих наборы правил, то они будут добавлены в начало или конец этих наборов правил, соответсвенно.

С помощью LOCAL_RULESETS принято добавлять правила в обычно пустые Local_check_relay, Local_check_mail, Local_check_rcpt. В свою очередь эти наборы правил, независимо от того, пустые ли они или нет вызываются из других наборов, например, Local_check_relay вызывается из набора правил check_relay.

Но, если не путаю, это просто общепринято, можно с помощью LOCAL_RULESETS добавить правила и к набору Parse1.

mky ★★★★★ ()

Решил провести эксперимент и узнать как оно всё отработает.
Каким образом проверить? Например, отобразить порядок работы в лог-файле с помощью меток FLAG.

Взял дефолтовый sendmail.mc и добавил вконце (после MAILER...) следующее:

LOCAL_CONFIG
Ksyslog syslog

HSubject: $>+Check_Subject

LOCAL_RULESETS
SLocal_check_relay
R$*		$: $(syslog FLAG-10 $) $1
R$*		$: < $&{client_resolve} >
R$*		$: $(syslog FLAG-11 $) $1
R<TEMP>		$#error $@ 4.4.0 $: "Client_resolve=TEMP " $&{client_addr}
R<FAIL>		$#error $@ 4.4.0 $: "Client_resolve=FAIL " $&{client_resolve}
R<FORGED>	$#error $@ 4.4.0 $: "Client_resolve=FORGED " $&{client_resolve}
R$*		$: $(syslog FLAG-12 $) $1
R$*		$@ OK

SCheck_Subject
R$*		$: $(syslog Sybject: $1 $) $1

Преобразовал в sendmail.cf командой «m4 sendmail.mc > sendmail.cf».
Начал править файл sendmail.cf, чтобы добавить еще меток FLAG...
Нашёл первый раздел «SLocal_check_relay» (то есть тот, который формируется по умолчанию). И добавил в него метки FLAG.
Вот что получилось:
SLocal_check_relay
Scheck_relay
R$*				$: $(syslog FLAG-1 $) $1
R$*				$: $1 $| $>"Local_check_relay" $1
R$*				$: $(syslog FLAG-2 $) $1
R$* $| $* $| $#$*		$#$3
R$*				$: $(syslog FLAG-3 $) $1
R$* $| $* $| $*			$@ $>"Basic_check_relay" $1 $| $2

SBasic_check_relay
R$*				$: $(syslog FLAG-4 $) $1
# check for deferred delivery mode
R$*				$: < $&{deliveryMode} > $1
R< d > $*			$@ deferred
R< $* > $*			$: $2

R$*				$: $(syslog FLAG-5 $) $1
R$+ $| $+			$: $>D < $1 > <?> <+ Connect> < $2 >
R   $| $+			$: $>A < $1 > <?> <+ Connect> <>	empty client_name
R<?> <$+>			$: $>A < $1 > <?> <+ Connect> <>	no: another lookup
R<?> <$*>			$: OK				found nothing
R$*				$: $(syslog FLAG-6 $) $1
R<$={Accept}> <$*>		$@ $1				return value of lookup
R<REJECT> <$*>			$#error $@ 5.7.1 $: "550 Access denied"
R<DISCARD> <$*>			$#discard $: discard
R<QUARANTINE:$+> <$*>		$#error $@ quarantine $: $1
R<ERROR:$-.$-.$-:$+> <$*>	$#error $@ $1.$2.$3 $: $4
R<ERROR:$+> <$*>		$#error $: $1
R<$* <TMPF>> <$*>		$#error $@ 4.3.0 $: "451 Temporary system failure. Please try again later."
R<$+> <$*>			$#error $: $1

В этом же файле sendmail.cf ищем второй раздел SLocal_check_relay и смотрим что там.
А там вот что:
SLocal_check_relay
R$*		$: $(syslog FLAG-10 $) $1
R$*		$: < $&{client_resolve} >
R$*		$: $(syslog FLAG-11 $) $1
R<TEMP>		$#error $@ 4.4.0 $: "Client_resolve=TEMP " $&{client_addr}
R<FAIL>		$#error $@ 5.7.1 $: "Client_resolve=FAIL " $&{client_name}
R<FORGED>	$#error $@ 5.7.1 $: "Client_resolve=FORGED " $&{client_name}
R$*		$: $(syslog FLAG-12 $) $1
R$*		$@ OK

SCheck_Subject
R$*		$: $(syslog Sybject: $1 $) $1

То есть то, что мы и добавляли в sendmail.mc в разделе LOCAL_RULESETS.

Теперь, чтобы лучше видеть, включаем подробное логирование. Ищем в файле sendmail.cf параметр (или строку) «O LogLevel=». И ставим значение «15».
То есть у меня получилось следующее:
O LogLevel=15

Всё, вроде, настройки завершены. Перезагружаем службу sendmail.
#service sendmail restart
Shutting down sm-client:                               [  OK  ]
Shutting down sendmail:                                [  OK  ]
Starting sendmail:                                     [  OK  ]
Starting sm-client:                                    [  OK  ]
#

Для лёгкого чтения решил почистить лог-файл sendmail-а /var/log/maillog. Зашёл в файл и удалил все строки.

Теперь можно приступать, отправлять почту и затем смотреть что получилось в логах...
Подключаюсь на порт 25 с помощью PUTTY (в режие telnet) и веду следующий диалог:
220 mx1.technet.ru ESMTP Sendmail 8.14.4/8.14.4; Sat, 12 Oct 2013 03:53:25 +0400

500 5.5.1 Command unrecognized: {{}"
helo yandex.ru
250 mx1.technet.ru Hello ip-192-168-1-100.technet.ru [192.168.1.100], pleased to meet you
mail from:admin@mail.ru
250 2.1.0 admin@mail.ru... Sender ok
rcpt to:root
250 2.1.5 root... Recipient ok
data
354 Enter mail, end with "." on a line by itself
subject:hello
world
.
250 2.0.0 r9BNrPpT002376 Message accepted for delivery
quit

Идём читать логи...
Видим:
Oct 12 03:53:25 mx1 sendmail[2376]: NOQUEUE: connect from ip-192-168-1-100.technet.ru [192.168.1.100]
Oct 12 03:53:25 mx1 sendmail[2376]: NOQUEUE: FLAG-1
Oct 12 03:53:25 mx1 sendmail[2376]: NOQUEUE: FLAG-10
Oct 12 03:53:25 mx1 sendmail[2376]: NOQUEUE: FLAG-11
Oct 12 03:53:25 mx1 sendmail[2376]: NOQUEUE: FLAG-12
Oct 12 03:53:25 mx1 sendmail[2376]: NOQUEUE: FLAG-2
Oct 12 03:53:25 mx1 sendmail[2376]: NOQUEUE: FLAG-3
Oct 12 03:53:25 mx1 sendmail[2376]: NOQUEUE: FLAG-4
Oct 12 03:53:25 mx1 sendmail[2376]: NOQUEUE: FLAG-5
Oct 12 03:53:25 mx1 sendmail[2376]: NOQUEUE: FLAG-6
Oct 12 03:53:25 mx1 sendmail[2376]: AUTH: available mech=ANONYMOUS, allowed mech=EXTERNAL GSSAPI KERBEROS_V4 DIGEST-MD5 CRAM-MD5
Oct 12 03:53:25 mx1 sendmail[2376]: r9BNrPpT002376: Milter: no active filter
Oct 12 03:53:25 mx1 sendmail[2376]: r9BNrPpT002376: --- 220 mx1.technet.ru ESMTP Sendmail 8.14.4/8.14.4; Sat, 12 Oct 2013 03:53:25 +0400
Oct 12 03:53:26 mx1 sendmail[2376]: r9BNrPpT002376: <-- \377\373\037\377\373 \377\373\030\377\373'\377\375\001\377\373\003\377\375\003
Oct 12 03:53:26 mx1 sendmail[2376]: r9BNrPpT002376: --- 500 5.5.1 Command unrecognized: "\177{\037\177{ \177{\030\177{'\177}\001\177{\003\177}\003"
Oct 12 03:53:29 mx1 sendmail[2376]: r9BNrPpT002376: <-- helo yandex.ru
Oct 12 03:53:29 mx1 sendmail[2376]: r9BNrPpT002376: --- 250 mx1.technet.ru Hello ip-192-168-1-100.technet.ru [192.168.1.100], pleased to meet you
Oct 12 03:53:37 mx1 sendmail[2376]: r9BNrPpT002376: <-- mail from:admin@mail.ru
Oct 12 03:53:37 mx1 sendmail[2376]: r9BNrPpT002376: --- 250 2.1.0 admin@mail.ru... Sender ok
Oct 12 03:53:45 mx1 sendmail[2376]: r9BNrPpT002376: <-- rcpt to:root
Oct 12 03:53:45 mx1 sendmail[2376]: r9BNrPpT002376: --- 250 2.1.5 root... Recipient ok
Oct 12 03:53:47 mx1 sendmail[2376]: r9BNrPpT002376: <-- data
Oct 12 03:53:47 mx1 sendmail[2376]: r9BNrPpT002376: --- 354 Enter mail, end with "." on a line by itself
Oct 12 03:53:55 mx1 sendmail[2376]: r9BNrPpT002376: Sybject:hello
Oct 12 03:53:56 mx1 sendmail[2376]: r9BNrPpT002376: from=admin@mail.ru, size=20, class=0, nrcpts=1, msgid=<201310112353.r9BNrPpT002376@mx1.technet.ru>, proto=SMTP, daemon=MTA, relay=ip-192-168-1-100.technet.ru [192.168.1.100]
Oct 12 03:53:56 mx1 sendmail[2376]: r9BNrPpT002376: --- 250 2.0.0 r9BNrPpT002376 Message accepted for delivery
Oct 12 03:53:56 mx1 sendmail[2377]: r9BNrPpT002376: to=root, delay=00:00:11, xdelay=00:00:00, mailer=local, pri=30328, dsn=2.0.0, stat=Sent
Oct 12 03:53:56 mx1 sendmail[2377]: r9BNrPpT002376: done; delay=00:00:11, ntries=1

При подключении к 25-му порту, первую команду даю пустую, просто нажимаю Enter.
Просто там какая-то ерунда выползает и если HELO дать первым, то его не примет, потому что он увидит «белибердаHELO».

ИТОГ: видно, что проход по правилу Local_check_relay произошёл каким-то непонятным мне образом.
Постараюсь разобраться, но это позже.

pichuzhkinvv ()
Ответ на: комментарий от pichuzhkinvv

Подключаюсь на порт 25 с помощью PUTTY (в режие telnet)

Тяжёлый случай. Это сколько же вам придётся конфигурить sendmail, чтобы он начал понимать проткол telnet :-(

видно, что проход по правилу Local_check_relay произошёл каким-то непонятным мне образом.

Что именно непонятно то? Сначала check_relay, лог записался FLAG-1, из него было вызван набор Local_check_relay, в лог пошли FLAG-10...FLAG-12, потом продолжились правила check_relay, в конце был вызван Basic_check_relay.

mky ★★★★★ ()
Ответ на: комментарий от mky

Разобрался с порядком прохождения правил. Спасибо.

А ваших слов по поводу «Тяжёлый случай» не понял. Подключаюсь на 25 порт к почтовому серверу с помощью telnet.

pichuzhkinvv ()
Ответ на: комментарий от pichuzhkinvv

telnet это команда и протокол (описаный в RFC). По протоколу, клиент вначале, сразу после подключения, обменивается с сервером служебной информаций для согласования режима передачи данных (локальное echo, linemode и т.д.) и только потом начинает передачу данных, вводимых пользователем. В линуксе/юниксе команда telnet по умолчанию при подключении на порт, отличный от 23, не пытается работать по протоколу telnet (согласовать режим передачи данных), а сразу переходит, скажем так, в режим raw.

Просто там какая-то ерунда выползает

Вот эта вот ерунда и есть попытка putty начать работать по протоколу telnet. В putty для подключения к smtp, pop3 и т.д. серверам нужно выбирать режим raw, об этом вроде как даже написано в документации к putty.

mky ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.