Необходимо организовать доступ следующим образом:
с одного ip адреса, можно отправлять сообщение только одному почтовому ящику (связь один к одному)
создаём следующие файлы:
ll /etc/postfix/access_mail/
total 44
-rw-r--r-- 1 root root 18 Jan 25 13:53 access_ip
-rw-r--r-- 1 root root 18 Jan 25 14:21 access_ip2
-rw-r--r-- 1 root root 47 Jan 25 14:35 mail_list
со следующим содержимым:
cat /etc/postfix/access_mail/access_ip
10.10.10.1 OK
cat /etc/postfix/access_mail/access_ip2
10.10.10.2 OK
cat /etc/postfix/access_mail/mail_list
user1@ class_domain1
user2@ class_domain2
в файлах access_ip и access_ip2 указываются ip адреса с которых разрешена отправка сообщений для пользователей user1@ user2@
в файле mail_list указаны какие класы назначаются для каждого из пользователей(почтовых ящиков/доменов)
как только файлы созданы выполняем следующую команду:
postmap /etc/postfix/access_mail/access_ip
postmap /etc/postfix/access_mail/access_ip2
postmap /etc/postfix/access_mail/mail_list
при любом добавлении информации в данные файлы, необходимо повторять данную команду.
далее необходимо внести корректировки в конфигурационный файл:
/etc/postfix/main.cf
добавляем следующую запись:
smtpd_sender_restrictions = check_sender_access hash:/etc/postfix/access_mail/mail_list, reject
smtpd_restriction_classes = class_domain1,class_domain2
class_domain1 = check_client_access hash:/etc/postfix/access_mail/access_ip, reject
class_domain2 = check_client_access hash:/etc/postfix/access_mail/access_ip2, reject
после чего перезапускаем postfix
systemctl restart postfix
теперь с ip 10.10.10.1 может отправлять только user1@
а с ip 10.10.10.2 только user2@
Проверить работу можно следующим образом:
yum –y install mailx
echo "Test text" | mail -s "Test title" -r user1@domain.ru -S smtp="10.10.10.50:25" user1@domain.ru
здесь 10.10.10.50 IP нашего релея
--------------------------------------------------------------------------------------
Дополнительная информация
В демоне smtpd есть 4 ограничения(restrictions) для почты
Ограничение Когда проверяется Что проверяется
smtpd_client_restrictions - сразу после установления соединения ip-адрес клиента
smtpd_helo_restrictions - на этапе HELO/EHLO приветсвие клиента
smtpd_sender_restrictions - на этапе MAIL FROM: адрес отправителя
smtpd_recipient_restrictions - на этапе RCPT TO: адрес получателя
Проверка происходит в указанном порядке. Если какое-либо из ограничений даёт негативный ответ - дальнейшая проверка прекращается и клиент посылается куда подальше. И есть одна директива, которая управляет временем вычисления значений и применения ограничений. Это smtpd_delay_reject. Если она равна yes, Postfix дождётся момента, когда будет доступна полная информация о клиенте(ip и helo) и письме(от кого и кому), и только после этого вступят в действие ограничения. Иначе ограничения вычисляются и
применяются соответственно таблице. По умолчанию директива включена. Как пишут в мане, это есть хорошо - в логе видно, кому и чья почта "не дошла". Также это даёт определённые плюсы - возможность оперировать всеми величинами во всех ограничениях.
в каждом ограничении можно проверять любой параметр, например в ограничении получателей smtpd_recipient_restrictions проверять ip-адрес клиента. Вот соответствующие наиболее часто используемые директивы
Директива что проверяет
check_client_access ip-адрес клиента
check_helo_access приветствие клиента
check_sender_access адрес отправителя
check_recipient_access адрес получателя
smtpd_restriction_classes класс который позволяет определять группы со своими именами
=================================================================================
Если необходимо чтобы с разных ip адресов почтовый ящик мог отправлять сообщения, то приводим конфиги к следующему виду:
cat /etc/postfix/access_mail/mail_list | grep user1
user1@domain.ru class_domain4
cat /etc/postfix/main.cf | grep 'class_domain4'
smtpd_restriction_classes = class_domain1,class_domain2,class_domain3,class_domain4
class_domain4 = check_client_access hash:/etc/postfix/access_mail/access_ip4, reject
cat /etc/postfix/access_mail/access_ip4
10.10.10.1 OK
10.10.10.2 OK
и выполняем:
postmap /etc/postfix/access_mail/access_ip4
postmap /etc/postfix/access_mail/mail_list
после чего перезапускаем postfix
systemctl restart postfix
=================================================================================
Если необходимо произвести настройку многие ко многим, т.е. имеется список почтовых ящиков и список ip адресов, и с каждого из этих серверов можно отправлять сообщения с почтовых ящиков указанных в списке.
в main.cnf добавляем
smtpd_sender_restrictions = check_sender_access hash:/etc/postfix/access_mail/mail_list,check_sender_access hash:/etc/postfix/access_mail/ip_list,reject
cat /etc/postfix/access_mail/mail_list
user1@ OK
user2@ OK
cat /etc/postfix/access_mail/ip_list
10.10.10.1 OK
10.10.10.2 OK
после чего выполняем
postmap /etc/postfix/access_mail/mail_list
postmap /etc/postfix/access_mail/ip_list
и перезапускаем postfix
systemctl restart postfix
====================================================================================================
Ограничить доступ на релее - запрет на отправку с определённых email
Имеется корпоративный релей, через который идёт отправка сообщений со всех ip адресов добавленных в переменную mynetworks (айпишники или подсети)
Далее поступила задача ограничить отправку с определённых почтовых ящиков (они нужны были для внутренней рассылки и мы так обезопасили себя если они ломануться на внешку)
Мы создали файл:
/etc/postfix/sender_access
Со следующим содержимым:
zabbix@test.local REJECT
Создавали далее хэш
postmap /etc/postfix/sender_access
Далее в
smtpd_sender_restrictions
добавили:
check_sender_access hash:/etc/postfix/sender_access,
( smtpd_sender_restrictions отвечает за - ограничения будут применяться во время выполнения клиентской команды MAIL FROM)
Наша конфигурация имеет следующий вид:
smtpd_client_restrictions = permit_mynetworks
smtpd_restriction_classes = has_our_domain_as_sender
has_our_domain_as_sender = check_sender_access hash:/etc/postfix/has_our_domain_as_sender reject
smtpd_sender_restrictions =
check_sender_access hash:/etc/postfix/sender_access,
permit_mynetworks,
reject_unauth_destination,
reject_invalid_hostname,
reject_unknown_helo_hostname,
reject_non_fqdn_hostname,
reject
smtpd_recipient_restrictions =
reject_non_fqdn_sender,
permit_mynetworks,
check_client_access hash:/etc/postfix/company_networks,
reject_unauth_destination,
reject
Рассмотрим подробнее:
smtpd_client_restrictions — настройки ограничения клиентских соединений. В данном примере разрешить только авторизованных permit_mynetworks, который соответствует mynetworks со списком ip адресов и подсетей
smtpd_restriction_classes - тут описываем класс с именем has_our_domain_as_sender. Содержимое которого соответствует нашим доменам от которых происходит отправка.
cat /etc/postfix/has_our_domain_as_sender
test.kg OK
test.local OK
test.info OK
Все остальные домены на отправку должны отбрасываться.
smtpd_sender_restrictions — ограничения будут применяться во время выполнения клиентской команды MAIL FROM. Первым проверятся:
/etc/postfix/sender_access
zabbix@test.local REJECT. check_sender_access проверяет MAIL FROM отправителя в нашем списке, т.е. сам почтовый ящик. permit_mynetworks - разрешает всех кто есть в списке mynetworks, все остальные отклоняются по правилу reject
smtpd_recipient_restrictions — контролирует ответ Postfix на SMTP-команду RCPT TO. Здесь мы разрешаем только соединения от узлов, перечисленных в mynetworks. check_client_access - ищет в указанном файле имя хоста клиента, IP-адрес клиента или сети отправителя, мы проверяем файл /etc/postfix/company_networks в котором перечислены подсети наших доверенных айпишников и указан класс:
cat /etc/postfix/company_networks
10.230 has_our_domain_as_sender
10.244 has_our_domain_as_sender
127.0.0 has_our_domain_as_sender
----------- ------------------------ ---------------------- ----------------------------
Теперь поступила задача ограничивать IP=email
Смотрим main.cf
smtpd_client_restrictions = permit_mynetworks
smtpd_restriction_classes = has_our_domain_as_sender,class_domain1,class_domain2
has_our_domain_as_sender = check_sender_access hash:/etc/postfix/has_our_domain_as_sender reject
class_domain1 = check_sender_access hash:/etc/postfix/access_mail/access_mail1, reject
class_domain2 = check_sender_access hash:/etc/postfix/access_mail/access_mail2, reject
smtpd_sender_restrictions =
warn_if_reject
check_client_access hash:/etc/postfix/sender_access,
check_sender_access hash:/etc/postfix/sender_access,
permit_mynetworks,
reject_unauth_destination,
reject_invalid_hostname,
reject_unknown_helo_hostname,
reject_non_fqdn_hostname,
reject
smtpd_recipient_restrictions =
reject_non_fqdn_sender,
permit_mynetworks,
check_client_access hash:/etc/postfix/company_networks,
reject_unauth_destination,
reject
smtpd_relay_restrictions = check_client_access hash:/etc/postfix/sender_access, permit_mynetworks, permit_sasl_authenticated, defer_unauth_destination
Рассмотрим что тут творится:
smtpd_client_restrictions — настройки ограничения клиентских соединений. В данном примере разрешить только тех что добавлены в mynetworks
smtpd_restriction_classes - тут описываем наши классы: has_our_domain_as_sender,class_domain1,class_domain2
cat /etc/postfix/has_our_domain_as_sender
test.kg OK
test.local OK
test.info OK
cat /etc/postfix/access_mail/access_mail1
serv@test.kg OK
cat /etc/postfix/access_mail/access_mail2
zabbix@test.kg OK
smtpd_sender_restrictions — ограничения будут применяться во время выполнения клиентской команды MAIL FROM
check_client_access - ищет в указанном файле имя хоста клиента, IP-адрес клиента или сети отправителя (в нашем случае это два ip адреса с разрешённым одним email (class_domain1) и ещё один ip адрес с которого разрешена отправка только с одного email (class_domain2) ) помимо него есть ещё ящики которым отправка в принципе запрещена:
cat /etc/postfix/sender_access
zabbix@test.local REJECT
10.71.200.29 class_domain1
10.71.200.28 class_domain1
10.71.200.40 class_domain2
check_sender_access - проверяет MAIL FROM отправителя в нашем списке, т.е. сам почтовый ящик - благодаря этой проверке мы блокируем почтовые ящики которым запрещена отправка
smtpd_recipient_restrictions контролирует ответ Postfix на стадии SMTP-команды RCPT TO. Здесь мы разрешаем только соединения от узлов, перечисленных в mynetworks но мы ещё добавляем
check_client_access hash:/etc/postfix/company_networks в котором наши ip адреса не указанные в mynetworks .
cat /etc/postfix/company_networks
10.230 has_our_domain_as_sender
10.244 has_our_domain_as_sender
127.0.0 has_our_domain_as_sender
10.71.200.29 has_our_domain_as_sender
10.71.200.28 has_our_domain_as_sender
10.71.200.40 has_our_domain_as_sender
smtpd_relay_restrictions - это ограничение появилось в Postfix 2.10 По умолчанию имеет значение
smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination
В дополнение к ранее присутствующим настройкам smtpd_{client, helo, sender,recipient}_restrictions добавлена директива smtpd_relay_restrictions, которая позволяет снизить вероятность появления открытого релея из-за ошибок при определении правил блокирования спама. По умолчанию задействованы настройки для полного сохранения обратной совместимости (smtpd_relay_restrictions = permit_mynetworks, reject_unauth_destination; для новых установок smtpd_relay_restrictions = permit_mynetworks, permit_sasl_authenticated, defer_unauth_destination);
smtpd_relay_restrictions — ограничения пересылки почты в контексте клиентской команды RCPT TO.
Тут мы проверяем
check_client_access hash:/etc/postfix/sender_access
Чтобы настроить ограничение ip=mail делаем следующие шаги:
cat /etc/postfix/access_mail/access_mail2
test@test.kg OK
postmap /etc/postfix/access_mail/access_mail2
cat /etc/postfix/sender_access
10.71.200.40 class_domain2
postmap /etc/postfix/sender_access
cat /etc/postfix/company_networks
10.71.200.40 has_our_domain_as_sender
postmap /etc/postfix/company_networks
cat /etc/postfix/main.cf
smtpd_restriction_classes = has_our_domain_as_sender,class_domain1,class_domain2
class_domain2 = check_sender_access hash:/etc/postfix/access_mail/access_mail2, reject
postfix check --- и если всё ок то можно
systemctl restart postfix