Как узнать, что SMTP-сервер находится в открытом реле?

Я использовал nmap для тестирования сетевой безопасности. Выяснилось, что SMTP-сервер находился в открытом реле. Вот вывод:

nmap --script smtp-open-relay testwww.confidesk.com
PORT     STATE  SERVICE
25/tcp   open   smtp
|_smtp-open-relay: Server is an open relay (16/16 tests)

Я не могу воспроизвести эту проблему. Как я могу воспроизвести это сам без сканера?

5 ответов

Как сказал в своем ответе juwi, просто установите сетевое соединение с tcp/25 рассматриваемого сервера. Для этого вы можете использовать telnet или netcat.

Вот пример транзакции SMTP:

http://en.wikipedia.org/wiki/Simple_Mail_Transfer_Protocol

Реле закрывается, если происходит сбой после попытки отправить RCPT, который сервер не настроен на прием. Реле открыто, если оно принимает любой домен, указанный вами в строке RCPT.

Я не знаю, что делает сканирование nmap, чтобы определить, есть ли у вас открытое реле. Следует иметь в виду, что ваш SMTP-сервер может быть настроен на прием всего трафика с IP-адреса, с которого вы тестируете, поэтому, да, он открыт, но не для остального мира, так что это может быть в порядке. Вы должны запустить тест из удаленного окна, чтобы быть уверенным.

Процедура Microsoft по обнаружению открытых реле - ручные команды telnet, слишком много, чтобы размещать здесь. http://support.microsoft.com/kb/324958

Автоматический тест http://www.mailradar.com/openrelay/ Однако, когда я использовал это с Microsoft IIS6, тесты с адресом электронной почты были окружены речевыми метками (например, метод 7 RCPT TO: <"relaytest@mailradar.com">), кажется, не удается, но на самом деле не отправляется. Если вы оказались в такой ситуации, вы можете продолжить изучение параметров и убедиться, что они не окажутся там, где вы этого не хотите. 178.209.36.55 однако проходит все эти испытания.

Если вы счастливы, что не используете разомкнутое реле, то следующий шаг - убедиться, что вы не рассеяны. Обратное рассеяние - это когда третье лицо отправляет электронное письмо на недоставленный адрес с поддельным заголовком отправителя, поэтому отчет о недоставке отправляется предполагаемому отправителю (поддельный).

Это часто происходит из-за того, что сервер настроен на ретрансляцию почты для всего домена без списка действительных пользователей, поэтому он изначально примет электронную почту, а затем не сможет ретранслировать ее на сервер со списком действительных пользователей.

Простой тест - я собираюсь позвонить на ваш внешний личный адрес электронной почты me@hotmail.com, а ваш домен - domain.com

эло hotmail.com
почта от me@hotmail.com
rcpt to: invaliduser@domain.com
данные
Заголовок: Тема
текст
,

Затем проверьте учетную запись me@hotmail.com (возможно, в папке нежелательной почты) на наличие отчета о недоставке, например, postmaster@domain.com.

Вы можете просто войти в систему вручную, используя telnet на порту 25.

Тогда вы говорите HELOи попробовать MAIL FROM: <mailadress>следующий RCPT TO: <mailaddress>В этот момент он должен сказать вам, что он отклонил адрес, потому что он отказал в доступе, если он не является открытым ретранслятором. Если он открыт, он сделает то, что вы только что сказали - отправьте электронное письмо.

Это код, который у меня был в папке скриптов. Не могу вспомнить, где я это получил. Кредиты оригинальному автору:

#!/usr/bin/perl -w
#Script to check for Open Relay EMAIL Servers on port 25
#Author: Felipe Ferreira  fel.h2o(at)gmail Date: 18/02/2009
#ref. http://www.perlmonks.org/index.pl?node_id=718552
#TODO: 
#1. Should get from a list of IPs, should report any Open servers to a .txt file
#smtp->code() and message() are the responses of the server!

use Net::SMTP;
my $host;
my $filename = "servers.txt";

#open .txt file with all servers names or IPs
#open($filehandle, "<" . $filename);
open FILE, "<servers.txt" or die $!;
while (my $host = <FILE>) {
    print "Testing: $host";
    my $smtp = Net::SMTP->new($host, 
        Hello => "admin", 
        Timeout => 3,
        Debug => 0);
    if (!$smtp) {       print STDOUT "No connection to $host \n";

    }
    else {
    $smtp->mail('relayfromtest@testing.com');
    $smtp->to('relaytotest@local.com')
       or 
       print "SERVIDOR OK: $host RCPT TO: ", $smtp->code(), " ", $smtp->message();
    if ($smtp->code() eq "250" ) {
       print "SERVIDOR CRITICAL: $host Tiene problema de OPEN RELAY!!!";
    }
#   $smtp->quit;    
    }
} #Next host
close FILE;

Хотя ответы здесь указывают в правильном направлении, я хотел бы добавить отказ от ответственности:

Сервер электронной почты, который будет ретранслировать, не обязательно является открытым ретранслятором. Если у меня есть приложение, работающее на сервере, который должен отправлять электронную почту, и я настраиваю свой почтовый сервер, чтобы позволить этому серверу приложений выполнять ретрансляцию через него, поместив ip-адрес сервера в список "разрешено ретранслировать" на моем почтовом сервере, или если я настраиваю свое приложение для аутентификации на своем почтовом сервере, и я настраиваю свой почтовый сервер для разрешения аутентифицированной ретрансляции, то это не открытая ретрансляция. Это просто ретранслятор (аутентифицированный или разрешенный на основе IP-адреса и т. Д.).

Открытое реле - это почтовый сервер, который позволяет любому пользователю, системе и т. Д. Передавать через него.

Поэтому простое подключение по telnet к порту 25 вашего почтового сервера и отправка электронной почты в домен, для которого сервер не является полномочным, не является железной индикацией того, является ли почтовый сервер открытым ретранслятором, не зная больше о том, как сервер настроен.

Другие вопросы по тегам