Thank you for reading this post, don't forget to subscribe!
Необходимо было настроить ограничение для релея следующим образом:
несколько серверов с одним email могли пересылать почту, для всех остальных запретить.
Перед запуском скрипта убедитесь, что в конце конфигурационного файла postfix имеется запись:
smtpd_sender_restrictions = check_sender_access hash:/etc/postfix/access_mail/mail_list, reject
cat skrip_permit_ip_and_mail_for_sending_email.sh
[codesyntax lang="bash" lines="no"]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 |
#!/bin/bash p=`pwd` # если списка ip email не существует скрипт завершит свою работу if [ ! -f /etc/postfix/list_ip_mail ] then echo "/etc/postfix/list_ip_mail DOES NOT EXIST " exit 1; fi #Если не создано директории /etc/postfix/access_mail то тогда создаём её if [ ! -d /etc/postfix/access_mail ] then mkdir /etc/postfix/access_mail fi #удаляем возможные повторы cat /etc/postfix/list_ip_mail | sort| uniq | grep -v ^$ > /etc/postfix/list_ip_mail3 cat /etc/postfix/list_ip_mail3 > /etc/postfix/list_ip_mail rm -rf /etc/postfix/list_ip_mail3 # приводим к виду: НОМЕР IP EMAIL cat -n /etc/postfix/list_ip_mail > /etc/postfix/list_ip_mail2 rm -rf /etc/postfix/list_ip_mail 2>/dev/null mv /etc/postfix/list_ip_mail2 /etc/postfix/list_ip_mail #удаляем все данные которые есть в директории /etc/postfix/access_mail/ необходимо для того чтобы при добавлении изи корректировании list_ip_mail данные успешно обновились echo "clean dir /etc/postfix/access_mail/" rm -rf /etc/postfix/access_mail/* echo "" #создаём список уникальных почтовых адресов echo "make uniq mail list" cat /etc/postfix/list_ip_mail | awk '{print $3}' | sort| uniq | grep -v ^$ > /etc/postfix/list_uniq_mail echo "" #создаём список где в строке указаны ip и email (в случае если для одного email указаны несколько IP то строка будет иметь вид "IP email newIP email) for i in `cat /etc/postfix/list_uniq_mail`; do echo $(grep " $i" /etc/postfix/list_ip_mail | awk '{print $1="", $0}'); done > /etc/postfix/list_ip_mail_sovmestnij #создаём список в котором указаны в одной строке несколько ip и только потом указан email echo "make list IP EMAIL with uniq email" for i in `cat /etc/postfix/list_ip_mail_sovmestnij | awk '{print $2}'`; do echo $(grep " $i" /etc/postfix/list_ip_mail_sovmestnij| sed "s/${i}//g") $i; done > /etc/postfix/ip_mail2 echo "" #нумеруем список cat -n /etc/postfix/ip_mail2 > /etc/postfix/ip_mail rm -rf /etc/postfix/list_uniq_mail /etc/postfix/list_ip_mail_sovmestnij /etc/postfix/ip_mail2 2>/dev/null # выполняем в цикле следуюещее: смотрим каждую строку и содержимое всех столбцов(кроме первого"номер" и последнего"почтовый ящик") записываем в отдельный файл с именем первого столбца строки (для этого мы их нумеровали) echo "make files access_ip* in the dir /etc/postfix/access_mail/" while read line; do echo $(echo $line | awk '{print $1="", $NF="", $0}') > /etc/postfix/access_mail/access_ip$(echo $line | awk '{print $1}'); done < /etc/postfix/ip_mail echo "" #полученный результат будет иметь вид "ip ip ip email", поэтому #делаем перенос строк внутри файла: for i in `ls /etc/postfix/access_mail/access_ip*`; do sed -i 's/ /\n/g' $i; done #добавляем в конце каждой стройки ОК for i in `ls /etc/postfix/access_mail/access_ip*`; do sed -i 's/$/ OK/' $i; done # выполняем в цикле следуюещее: смотрим каждую строку и содержимое последнего столбца записываем в файл /etc/postfix/access_mail/mail_list echo "create list with EMAIL and CLASS in the /etc/postfix/access_mail/mail_list" while read line; do echo "$(echo $line | awk '{print $NF}') class_domain$(echo $line | awk '{print $1}')" >> /etc/postfix/access_mail/mail_list; done < /etc/postfix/ip_mail echo "" rm -rf /etc/postfix/ip_mail # Возвращаем /etc/postfix/list_ip_mail к первоначальному виду ip mail т.е. убираем нумерацию cat /etc/postfix/list_ip_mail | awk '{print $2,$3}' > /etc/postfix/list_ip_mail2 rm -rf /etc/postfix/list_ip_mail 2>/dev/null mv /etc/postfix/list_ip_mail2 /etc/postfix/list_ip_mail # Выполняем postmap для всех файлов в директории /etc/postfix/access_mail/ echo "make postmap for files in the dir /etc/postfix/access_mail/" for i in `ls /etc/postfix/access_mail/`; do postmap /etc/postfix/access_mail/$i; done echo "" # Отсекаем всё содержимое после smtpd_sender_restrictions из главноего конфигурационного файла postfix и создаём его резервную копию echo "create backup for config file postfix /etc/postfix/main.cf" echo "clear all in config file main.cf after smtpd_sender_restrictions" cat /etc/postfix/main.cf | grep -B 100000 ^smtpd_sender_restrictions > /etc/postfix/main.cf2 mv /etc/postfix/main.cf /etc/postfix/main.cf.BACK.`date +%d-%m-%Y-%R` mv /etc/postfix/main.cf2 /etc/postfix/main.cf echo "" echo "add all our class in the konfig file main.cf" # Получаем список классов в одну строку через запятую (tr -s '\r\n' ' ')-убирает перевод строки for i in `cat /etc/postfix/access_mail/mail_list | awk '{print $2}'`; do echo $i,| tr -s '\r\n' ' '; done > $p/spisok_vseh_classov_v_stroku # Записываем в переменную klassi список классов через запяпую. (sed 's/ //' убираем пробелы) (sed 's/,$//' - убираем последнюю запятую) klassi=`cat $p/spisok_vseh_classov_v_stroku | sed 's/ //g' | sed 's/,$//'` rm -rf $p/spisok_vseh_classov_v_stroku # записываем классы в конфиг файл echo "smtpd_restriction_classes = $klassi" >> /etc/postfix/main.cf # Добавляем классы в конфиг файл postfix for i in `cat -n /etc/postfix/access_mail/mail_list | awk '{print $1}'`; do echo "class_domain$i = check_client_access hash:/etc/postfix/access_mail/access_ip$i, reject"; done >> /etc/postfix/main.cf echo " " echo "restart service postfix" systemctl restart postfix echo " " systemctl status postfix | head -3 |
[/codesyntax]
===========================================================================================
Ниже представлен пошаговый результат выполнения скрипта, на каждом из этапов.
Исходный файл с нашими данными:
cat /etc/postfix/list_ip_mail
10.10.10.1 db@domain.ru
10.10.10.2 scaner@domain.ru
10.10.10.3 scaner@domain.ru
10.10.10.4 tb@domain.ru
10.10.10.5 scaner@domain.ru
После нумеруем и приводим к виду:
cat /etc/postfix/list_ip_mail
1 10.10.10.1 db@domain.ru
2 10.10.10.2 scaner@domain.ru
3 10.10.10.3 scaner@domain.ru
4 10.10.10.4 tb@domain.ru
5 10.10.10.5 scaner@domain.ru
Создаём список с уникальными почтовыми адресами:
cat /etc/postfix/list_ip_mail | awk '{print $3}' | sort| uniq | grep -v ^$ > /etc/postfix/list_uniq_mail
cat /etc/postfix/list_uniq_mail
db@domain.ru
scaner@domain.ru
tb@domain.ru
создаём список где в строке указаны ip и email (в случае если для одного email указаны несколько IP то строка будет иметь вид "IP email newIP email)
for i in `cat /etc/postfix/list_uniq_mail`; do echo $(grep " $i" /etc/postfix/list_ip_mail | awk '{print $1="", $0}'); done > /etc/postfix/list_ip_mail_sovmestnij
cat /etc/postfix/list_ip_mail_sovmestnij
10.10.10.1 db@domain.ru
10.10.10.2 scaner@domain.ru 10.10.10.3 scaner@domain.ru 10.10.10.5 scaner@domain.ru
10.10.10.4 tb@domain.ru
for i in `cat /etc/postfix/list_ip_mail_sovmestnij | awk '{print $2}'`; do echo $(grep " $i" /etc/postfix/list_ip_mail_sovmestnij| sed "s/${i}//g") $i; done > /etc/postfix/ip_mail2
cat /etc/postfix/ip_mail2
10.10.10.1 db@domain.ru
10.10.10.2 10.10.10.3 10.10.10.5 scaner@domain.ru
10.10.10.4 tb@domain.ru
Нумеруем:
cat -n /etc/postfix/ip_mail2 > /etc/postfix/ip_mail
cat /etc/postfix/ip_mail
1 10.10.10.1 db@domain.ru
2 10.10.10.2 10.10.10.3 10.10.10.5 scaner@domain.ru
3 10.10.10.4 tb@domain.ru
# выполняем в цикле следуюещее: смотрим каждую строку и содержимое всех столбцов(кроме первого столбца"номер" и последнего столбца "почтовый ящик") записываем в отдельный файл с именем первого столбца строки (для этого мы их нумеровали)
while read line; do
echo $(echo $line | awk '{print $1="", $NF="", $0}') > /etc/postfix/access_mail/access_ip$(echo $line | awk '{print $1}');
done < /etc/postfix/ip_mail
На данном этапе создаются следующие файлы:
cat /etc/postfix/access_mail/access_ip1
10.10.10.1
cat /etc/postfix/access_mail/access_ip2
10.10.10.2 10.10.10.3 10.10.10.5
cat /etc/postfix/access_mail/access_ip3
10.10.10.4
#делаем перенос строк внутри файла:
for i in `ls /etc/postfix/access_mail/access_ip*`; do sed -i 's/ /\n/g' $i; done
cat /etc/postfix/access_mail/access_ip2
10.10.10.2
10.10.10.3
10.10.10.5
#добавляем в конце каждой стройки ОК
for i in `ls /etc/postfix/access_mail/access_ip*`; do sed -i 's/$/ OK/' $i; done
cat /etc/postfix/access_mail/access_ip2
10.10.10.2 OK
10.10.10.3 OK
10.10.10.5 OK
# выполняем в цикле следуюещее: смотрим каждую строку и содержимое последнего столбца записываем в файл /etc/postfix/access_mail/mail_list
while read line; do
echo "$(echo $line | awk '{print $NF}') class_domain$(echo $line | awk '{print $1}')" >> /etc/postfix/access_mail/mail_list;
done < /etc/postfix/ip_mail
cat /etc/postfix/access_mail/mail_list
db@domain.ru class_domain1
scaner@domain.ru class_domain2
tb@domain.ru class_domain3
# Возвращаем /etc/postfix/list_ip_mail к первоначальному виду ip mail т.е. убираем нумерацию
cat /etc/postfix/list_ip_mail
10.10.10.1 db@domain.ru
10.10.10.2 scaner@domain.ru
10.10.10.3 scaner@domain.ru
10.10.10.4 tb@domain.ru
10.10.10.5 scaner@domain.ru
Выполняем postmap для всех файлов в директории /etc/postfix/access_mail/
for i in `ls /etc/postfix/access_mail/`; do postmap /etc/postfix/access_mail/$i; done
Создаются файлы с расширением .db
# Отсекаем всё содержимое после smtpd_sender_restrictions из главноего конфигурационного файла postfix и создаём его резервную копию
cat /etc/postfix/main.cf | grep -B 100000 ^smtpd_sender_restrictions > /etc/postfix/main.cf2
mv /etc/postfix/main.cf /etc/postfix/main.cf.BACK.`date +%d-%m-%Y-%R`
mv /etc/postfix/main.cf2 /etc/postfix/main.cf
ll /etc/postfix/main.cf.BACK.*
-rw-r--r-- 1 root root 5637 Jan 30 15:40 /etc/postfix/main.cf.BACK.31-01-2019-09:26
# Получаем список классов в одну строку через запятую (tr -s '\r\n' ' ')-убирает перевод строки
for i in `cat /etc/postfix/access_mail/mail_list | awk '{print $2}'`; do echo $i,| tr -s '\r\n' ' '; done > $p/spisok_vseh_classov_v_stroku
cat spisok_vseh_classov_v_stroku
class_domain1, class_domain2, class_domain3,
# Записываем в переменную klassi список классов через запяпую. (sed 's/ //' убираем пробелы) (sed 's/,$//' - убираем последнюю запятую)
klassi=`cat $p/spisok_vseh_classov_v_stroku | sed 's/ //g' | sed 's/,$//'`
# записываем классы в конфиг файл
echo "smtpd_restriction_classes = $klassi" >> /etc/postfix/main.cf
cat /etc/postfix/main.cf | tail -2
smtpd_sender_restrictions = check_sender_access hash:/etc/postfix/access_mail/mail_list, reject
smtpd_restriction_classes = class_domain1,class_domain2,class_domain3
# Добавляем классы в конфиг файл postfix
for i in `cat -n /etc/postfix/access_mail/mail_list | awk '{print $1}'`; do echo "class_domain$i = check_client_access hash:/etc/postfix/access_mail/access_ip$i, reject"; done >> /etc/postfix/main.cf
cat /etc/postfix/main.cf | tail -5
smtpd_sender_restrictions = check_sender_access hash:/etc/postfix/access_mail/mail_list, reject
smtpd_restriction_classes = class_domain1,class_domain2,class_domain3
class_domain1 = check_client_access hash:/etc/postfix/access_mail/access_ip1, reject
class_domain2 = check_client_access hash:/etc/postfix/access_mail/access_ip2, reject
class_domain3 = check_client_access hash:/etc/postfix/access_mail/access_ip3, reject