Debian + Postfix + Dovecot + Multidomain + SSL + IPv6 + OpenVPN + Көп интерфейстер + SpamAssassin-learn + Байланыс

Бұл мақала заманауи пошта серверін орнату туралы.
Postfix + Dovecot. SPF + DKIM + rDNS. IPv6 көмегімен.
TSL шифрлауымен. Бірнеше домендерді қолдауымен - нақты SSL сертификаты бар бөлік.
Спамнан қорғау және басқа пошта серверлерінің жоғары спамға қарсы рейтингімен.
Бірнеше физикалық интерфейстерді қолдайды.
Қосылым IPv4 арқылы және IPv6 қамтамасыз ететін OpenVPN көмегімен.

Егер сіз осы технологиялардың барлығын үйренгіңіз келмесе, бірақ мұндай серверді орнатқыңыз келсе, онда бұл мақала сізге арналған.

Мақалада барлық егжей-тегжейлерді түсіндіруге тырыспайды. Түсіндірме стандарт ретінде конфигурацияланбаған немесе тұтынушы тұрғысынан маңызды болып табылатын нәрсеге барады.

Пошта серверін орнату мотивациясы менің көптен бергі арманым болды. Бұл ақымақ болып көрінуі мүмкін, бірақ IMHO, бұл сіздің сүйікті брендіңіздің жаңа көлігін армандағаннан әлдеқайда жақсы.

IPv6 орнатудың екі себебі бар. IT маманы өмір сүру үшін үнемі жаңа технологияларды үйренуі керек. Мен цензураға қарсы күреске өзімнің қарапайым үлесімді қосқым келеді.

OpenVPN орнатуға мотивация тек жергілікті құрылғыда жұмыс істейтін IPv6 алу болып табылады.
Бірнеше физикалық интерфейстерді орнатуға мотивация мынада: менің серверімде бір интерфейс «баяу, бірақ шектеусіз» және екіншісі «жылдам, бірақ тарифпен».

Байланыстыру параметрлерін орнатуға мотивация мынада: ISP тұрақсыз DNS серверін қамтамасыз етеді және Google кейде сәтсіздікке ұшырайды. Мен жеке пайдалануға арналған тұрақты DNS серверін қалаймын.

Мақала жазуға мотивация - мен нобайды 10 ай бұрын жаздым, мен оны екі рет қарадым. Авторға үнемі қажет болса да, басқаларға да қажет болу ықтималдығы жоғары.

Пошта сервері үшін әмбебап шешім жоқ. Бірақ мен «осылай істе, содан кейін бәрі дұрыс жұмыс істегенде, артық заттарды таста» сияқты бірдеңе жазуға тырысамын.

tech.ru компаниясында Colocation сервері бар. OVH, Hetzner, AWS-пен салыстыруға болады. Бұл мәселені шешу үшін tech.ru-мен ынтымақтастық әлдеқайда тиімді болады.

Серверде Debian 9 орнатылған.

Серверде 'eno2' және 'eno1' 2 интерфейсі бар. Біріншісі шектеусіз, ал екіншісі сәйкесінше жылдам.

3 статикалық IP мекенжайы бар, 'eno0' интерфейсінде XX.XX.XX.X1 және XX.XX.XX.X2 және XX.XX.XX.X1 және 'eno5' интерфейсінде XX.XX.XX.X2 .

Қол жетімді XXXX:XXXX:XXXX:XXXX::/64 `eno6` интерфейсіне тағайындалған IPv1 мекенжайларының пулы және одан XXXX:XXXX:XXXX:XXXX:1:2::/96 менің сұрауым бойынша `eno2`-ге тағайындалды.

'domain3.com', 'domain1.com', 'domain2.com' 3 домені бар. `domain1.com` және `domain3.com` үшін SSL сертификаты бар.

Менің Google есептік жазбам бар, оған пошта жәшігін ` байланыстырғым келеді[электрондық пошта қорғалған]` (хаттарды қабылдау және тікелей gmail интерфейсінен хат жіберу).
Пошта жәшігі` болуы керек[электрондық пошта қорғалған]`, менің gmail-де көргім келетін электрондық поштаның көшірмесі. ` атынан бірдеңе жібере алу сирек[электрондық пошта қорғалған]` веб-интерфейс арқылы.

Пошта жәшігі` болуы керек[электрондық пошта қорғалған]`, оны Иванов өзінің iPhone телефонынан пайдаланады.

Жіберілген электрондық хаттар барлық заманауи спамға қарсы талаптарға сай болуы керек.
Қоғамдық желілерде шифрлаудың ең жоғары деңгейі болуы керек.
Хаттарды жіберу және алу үшін IPv6 қолдауы болуы керек.
Электрондық хаттарды ешқашан жоймайтын SpamAssassin болуы керек. Ол не серпіледі, не өткізіп жібереді немесе IMAP «Спам» қалтасына жіберіледі.
SpamAssassin автооқыту конфигурациялануы керек: егер мен хатты Спам қалтасына жылжытсам, ол осыдан үйренеді; егер мен хатты Спам қалтасынан жылжытсам, ол осыдан үйренеді. SpamAssassin оқуының нәтижелері хаттың Спам қалтасында аяқталуына әсер етуі керек.
PHP сценарийлері берілген сервердегі кез келген домен атынан поштаны жібере алуы керек.
IPv6 жоқ клиентте IPv6 пайдалану мүмкіндігі бар openvpn қызметі болуы керек.

Алдымен интерфейстер мен маршруттауды конфигурациялау керек, соның ішінде IPv6.
Содан кейін сізге IPv4 арқылы қосылатын және клиентті статикалық-нақты IPv6 мекенжайымен қамтамасыз ететін OpenVPN конфигурациялау қажет болады. Бұл клиент сервердегі барлық IPv6 қызметтеріне және Интернеттегі кез келген IPv6 ресурстарына қол жеткізе алады.
Содан кейін сізге Postfix-ті хаттар + SPF + DKIM + rDNS және басқа да ұқсас нәрселерді жіберу үшін конфигурациялау қажет болады.
Содан кейін Dovecot конфигурациялау және Multidomain конфигурациялау қажет болады.
Содан кейін сізге SpamAssassin конфигурациялау және жаттығуды конфигурациялау қажет болады.
Соңында, Bind орнатыңыз.

============= Көп интерфейстер ============

Интерфейстерді конфигурациялау үшін оны «/etc/network/interfaces» ішіне жазу керек.

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
allow-hotplug eno1
iface eno1 inet static
        address XX.XX.XX.X0/24
        gateway XX.XX.XX.1
        dns-nameservers 127.0.0.1 213.248.1.6
        post-up ip route add XX.XX.XX.0/24 dev eno1 src XX.XX.XX.X0 table eno1t
        post-up ip route add default via XX.XX.XX.1 table eno1t
        post-up ip rule add table eno1t from XX.XX.XX.X0
        post-up ip rule add table eno1t to XX.XX.XX.X0

auto eno1:1
iface eno1:1 inet static
address XX.XX.XX.X1
netmask 255.255.255.0
        post-up ip rule add table eno1t from XX.XX.XX.X1
        post-up ip rule add table eno1t to XX.XX.XX.X1
        post-up   ip route add 10.8.0.0/24 dev tun0 src XX.XX.XX.X1 table eno1t
        post-down ip route del 10.8.0.0/24 dev tun0 src XX.XX.XX.X1 table eno1t

auto eno1:2
iface eno1:2 inet static
address XX.XX.XX.X2
netmask 255.255.255.0
        post-up ip rule add table eno1t from XX.XX.XX.X2
        post-up ip rule add table eno1t to XX.XX.XX.X2

iface eno1 inet6 static
        address XXXX:XXXX:XXXX:XXXX:1:1::/64
        gateway XXXX:XXXX:XXXX:XXXX::1
        up   ip -6 addr add XXXX:XXXX:XXXX:XXXX:1:1:1:1/64 dev $IFACE
        up   ip -6 addr add XXXX:XXXX:XXXX:XXXX:1:1:1:2/64 dev $IFACE
        down ip -6 addr del XXXX:XXXX:XXXX:XXXX:1:1:1:1/64 dev $IFACE
        down ip -6 addr del XXXX:XXXX:XXXX:XXXX:1:1:1:2/64 dev $IFACE

# The secondary network interface
allow-hotplug eno2
iface eno2 inet static
        address XX.XX.XX.X5
        netmask 255.255.255.0
        post-up   ip route add XX.XX.XX.0/24 dev eno2 src XX.XX.XX.X5 table eno2t
        post-up   ip route add default via XX.XX.XX.1 table eno2t
        post-up   ip rule add table eno2t from XX.XX.XX.X5
        post-up   ip rule add table eno2t to XX.XX.XX.X5
        post-up   ip route add 10.8.0.0/24 dev tun0 src XX.XX.XX.X5 table eno2t
        post-down ip route del 10.8.0.0/24 dev tun0 src XX.XX.XX.X5 table eno2t

iface eno2 inet6 static
        address XXXX:XXXX:XXXX:XXXX:1:2::/96
        up   ip -6 addr add XXXX:XXXX:XXXX:XXXX:1:2:1:1/64 dev $IFACE
        up   ip -6 addr add XXXX:XXXX:XXXX:XXXX:1:2:1:2/64 dev $IFACE
        down ip -6 addr del XXXX:XXXX:XXXX:XXXX:1:2:1:1/64 dev $IFACE
        down ip -6 addr del XXXX:XXXX:XXXX:XXXX:1:2:1:2/64 dev $IFACE

# OpenVPN network
iface tun0 inet6 static
        address XXXX:XXXX:XXXX:XXXX:1:3::/80

Бұл параметрлерді tech.ru сайтындағы кез келген серверде қолдануға болады (қолдаумен аздап үйлестіру арқылы) және ол бірден қажетінше жұмыс істейді.

Егер сізде Hetzner, OVH үшін ұқсас нәрселерді орнату тәжірибеңіз болса, онда бәрі басқаша. Қиынырақ.

eno1 — №1 желілік картаның атауы (баяу, бірақ шектеусіз).
eno2 — №2 желілік картаның атауы (жылдам, бірақ тарифі бар).
tun0 — OpenVPN виртуалды желі картасының атауы.
XX.XX.XX.X0 - eno4 бойынша IPv1 №1.
XX.XX.XX.X1 - eno4 бойынша IPv2 №1.
XX.XX.XX.X2 - eno4 бойынша IPv3 №1.
XX.XX.XX.X5 - eno4 бойынша IPv1 №2.
XX.XX.XX.1 - IPv4 шлюзі.
ХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХ:::/64 - бүкіл сервер үшін IPv6.
XXXX:XXXX:XXXX:XXXX:1:2::/96 - eno6 үшін IPv2, қалғанының бәрі eno1 ішіне өтеді.
XXXX:XXXX:XXXX:XXXX::1 — IPv6 шлюзі (оны басқаша жасауға болатынын/қажет екенін ескерген жөн. IPv6 қосқышын көрсетіңіз).
dns-nameservers - 127.0.0.1 көрсетілген (байланыстыру жергілікті түрде орнатылғандықтан) және 213.248.1.6 (бұл tech.ru сайтынан).

«кесте eno1t» және «кесте eno2t» - бұл маршрут-ережелердің мағынасы мынада: eno1 -> арқылы кіретін трафик ол арқылы кетеді, ал eno2 -> арқылы кіретін трафик ол арқылы кетеді. Сондай-ақ сервер бастаған қосылымдар eno1 арқылы өтеді.

ip route add default via XX.XX.XX.1 table eno1t

Бұл пәрменмен біз «table eno1t» -> белгіленген кез келген ережеге сәйкес келетін кез келген түсініксіз трафиктің eno1 интерфейсіне жіберілетінін көрсетеміз.

ip route add XX.XX.XX.0/24 dev eno1 src XX.XX.XX.X0 table eno1t

Бұл пәрменмен сервер бастаған кез келген трафик eno1 интерфейсіне бағытталуы керек екенін көрсетеміз.

ip rule add table eno1t from XX.XX.XX.X0
ip rule add table eno1t to XX.XX.XX.X0

Бұл пәрмен арқылы біз трафикті белгілеу ережелерін орнатамыз.

auto eno1:2
iface eno1:2 inet static
address XX.XX.XX.X2
netmask 255.255.255.0
        post-up ip rule add table eno1t from XX.XX.XX.X2
        post-up ip rule add table eno1t to XX.XX.XX.X2

Бұл блок eno4 интерфейсі үшін екінші IPv1 анықтайды.

ip route add 10.8.0.0/24 dev tun0 src XX.XX.XX.X1 table eno1t

Осы пәрмен арқылы біз OpenVPN клиенттерінен XX.XX.XX.X4-дан басқа жергілікті IPv0-ке бағытты орнатамыз.
Мен бұл пәрмен барлық IPv4 үшін неге жеткілікті екенін әлі түсінбеймін.

iface eno1 inet6 static
        address XXXX:XXXX:XXXX:XXXX:1:1::/64
        gateway XXXX:XXXX:XXXX:XXXX::1

Бұл жерде біз интерфейстің адресін орнаттық. Сервер оны «шығыс» мекенжайы ретінде пайдаланады. Қайта ешбір жолмен пайдаланылмайды.

Неліктен ":1:1::" соншалықты күрделі? OpenVPN дұрыс жұмыс істейді және тек осы үшін. Бұл туралы кейінірек.

Шлюз тақырыбында - ол осылай жұмыс істейді және бұл жақсы. Бірақ дұрыс жол - сервер қосылған коммутатордың IPv6 кодын көрсету.

Дегенмен, мен мұны істесем, қандай да бір себептермен IPv6 жұмысын тоқтатады. Бұл tech.ru проблемасының бір түрі шығар.

ip -6 addr add XXXX:XXXX:XXXX:XXXX:1:1:1:1/64 dev $IFACE

Бұл интерфейске IPv6 мекенжайын қосу. Егер сізге жүз мекенжай қажет болса, бұл файлдағы жүз жолды білдіреді.

iface eno1 inet6 static
        address XXXX:XXXX:XXXX:XXXX:1:1::/64
...
iface eno2 inet6 static
        address XXXX:XXXX:XXXX:XXXX:1:2::/96
...
iface tun0 inet6 static
        address XXXX:XXXX:XXXX:XXXX:1:3::/80

Түсінікті болу үшін барлық интерфейстердің мекенжайлары мен ішкі желілерін атап өттім.
eno1 - болуы керек/64« - өйткені бұл біздің барлық мекен-жайлар пулымыз.
tun0 - ішкі желі eno1-ден үлкен болуы керек. Әйтпесе, OpenVPN клиенттері үшін IPv6 шлюзін конфигурациялау мүмкін болмайды.
eno2 - ішкі желі tun0 мәнінен үлкен болуы керек. Әйтпесе, OpenVPN клиенттері жергілікті IPv6 мекенжайларына қол жеткізе алмайды.
Түсінікті болу үшін мен 16 ішкі желі қадамын таңдадым, бірақ қаласаңыз, сіз тіпті «1» қадамды жасай аласыз.
Сәйкесінше, 64+16 = 80, ал 80+16 = 96.

Одан да айқынырақ болу үшін:
XXXX:XXXX:XXXXX:XXXX:1:1:YYYY:YYYY - eno1 интерфейсіндегі арнайы сайттарға немесе қызметтерге тағайындалуы керек мекенжайлар.
XXXX:XXXX:XXXXX:XXXX:1:2:YYYY:YYYY - eno2 интерфейсіндегі арнайы сайттарға немесе қызметтерге тағайындалуы керек мекенжайлар.
XXXX:XXXX:XXXX:XXXX:1:3:YYYY:YYYY — OpenVPN клиенттеріне тағайындалуы немесе OpenVPN қызмет мекенжайлары ретінде пайдаланылуы тиіс мекенжайлар.

Желіні конфигурациялау үшін серверді қайта іске қосу мүмкіндігі болуы керек.
IPv4 өзгертулері орындалған кезде алынады (оны экранға орауды ұмытпаңыз - әйтпесе бұл пәрмен сервердегі желіні бұзады):

/etc/init.d/networking restart

«/etc/iproute2/rt_tables» файлының соңына қосыңыз:

100 eno1t
101 eno2t

Онсыз «/etc/network/interfaces» файлында теңшелетін кестелерді пайдалана алмайсыз.
Сандар бірегей және 65535-тен аз болуы керек.

IPv6 өзгерістерін қайта жүктеусіз оңай өзгертуге болады, бірақ ол үшін кем дегенде үш пәрменді үйрену керек:

ip -6 addr ...
ip -6 route ...
ip -6 neigh ...

"/etc/sysctl.conf" параметрін орнату

# Uncomment the next line to enable packet forwarding for IPv4
net.ipv4.ip_forward = 1

# Do not accept ICMP redirects (prevent MITM attacks)
net.ipv4.conf.all.accept_redirects = 0
net.ipv6.conf.all.accept_redirects = 0

# Do not send ICMP redirects (we are not a router)
net.ipv4.conf.all.send_redirects = 0

# For receiving ARP replies
net.ipv4.conf.all.arp_filter = 0
net.ipv4.conf.default.arp_filter = 0

# For sending ARP
net.ipv4.conf.all.arp_announce = 0
net.ipv4.conf.default.arp_announce = 0

# Enable IPv6
net.ipv6.conf.all.disable_ipv6 = 0
net.ipv6.conf.default.disable_ipv6 = 0
net.ipv6.conf.lo.disable_ipv6 = 0

# IPv6 configuration
net.ipv6.conf.all.autoconf = 1
net.ipv6.conf.all.accept_ra = 0

# For OpenVPN
net.ipv6.conf.all.forwarding = 1
net.ipv6.conf.all.proxy_ndp = 1

# For nginx on boot
net.ipv6.ip_nonlocal_bind = 1

Бұл менің серверімнің «sysctl» параметрлері. Маңызды нәрсені атап өтейін.

net.ipv4.ip_forward = 1

Онсыз OpenVPN мүлдем жұмыс істемейді.

net.ipv6.ip_nonlocal_bind = 1

Интерфейс қосылғаннан кейін бірден IPv6 (мысалы, nginx) байланыстыруға тырысатын кез келген адам қатені алады. Бұл мекенжай қолжетімді емес.

Мұндай жағдайды болдырмау үшін осындай баптау жасалады.

net.ipv6.conf.all.forwarding = 1
net.ipv6.conf.all.proxy_ndp = 1

Осы IPv6 параметрлерінсіз OpenVPN клиентінен трафик әлемге шықпайды.

Басқа параметрлер маңызды емес немесе не үшін екені есімде жоқ.
Бірақ мен оны «сол қалпында» қалдырамын.

Бұл файлға өзгертулер серверді қайта жүктемей-ақ алынуы үшін келесі пәрменді орындау керек:

sysctl -p

«Кесте» ережелері туралы толығырақ: habr.com/post/108690

============= OpenVPN =============

OpenVPN IPv4 iptablesсіз жұмыс істемейді.

Менің iptables VPN үшін келесідей:

iptables -A INPUT -p udp -s YY.YY.YY.YY --dport 1194 -j ACCEPT
iptables -A FORWARD -i tun0 -o eno1 -j ACCEPT
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eno1 -j SNAT --to-source XX.XX.XX.X0
##iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eno1 -j MASQUERADE
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -p udp --dport 1194 -j DROP
iptables -A FORWARD -p udp --dport 1194 -j DROP

YY.YY.YY.YY - жергілікті құрылғының тұрақты IPv4 мекенжайы.
10.8.0.0/24 - IPv4 openvpn желісі. Openvpn клиенттеріне арналған IPv4 мекенжайлары.
Ережелердің бірізділігі маңызды.

iptables -A INPUT -p udp -s YY.YY.YY.YY --dport 1194 -j ACCEPT
iptables -A FORWARD -i tun0 -o eno1 -j ACCEPT
...
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -p udp --dport 1194 -j DROP
iptables -A FORWARD -p udp --dport 1194 -j DROP

Бұл тек менің статикалық IP-ден OpenVPN пайдалана алатын шектеу.

iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eno1 -j SNAT --to-source XX.XX.XX.X0
  -- или --
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eno1 -j MASQUERADE

OpenVPN клиенттері мен Интернет арасында IPv4 пакеттерін жіберу үшін осы пәрмендердің бірін тіркеу қажет.

Әртүрлі жағдайлар үшін опциялардың бірі қолайлы емес.
Екі команда да менің жағдайыма сәйкес келеді.
Құжаттаманы оқығаннан кейін мен бірінші опцияны таңдадым, себебі ол CPU аз пайдаланады.

Қайта жүктегеннен кейін барлық iptables параметрлерін алу үшін оларды бір жерде сақтау керек.

iptables-save > /etc/iptables/rules.v4
ip6tables-save > /etc/iptables/rules.v6

Мұндай атаулар кездейсоқ таңдалмаған. Оларды «iptables-persistent» бумасы пайдаланады.

apt-get install iptables-persistent

Негізгі OpenVPN бумасын орнату:

apt-get install openvpn easy-rsa

Сертификаттар үлгісін орнатайық (мәндеріңізді ауыстырыңыз):

make-cadir ~/openvpn-ca
cd ~/openvpn-ca
ln -s openssl-1.0.0.cnf openssl.cnf

Сертификат үлгісінің параметрлерін өңдейік:

mcedit vars

...
# These are the default values for fields
# which will be placed in the certificate.
# Don't leave any of these fields blank.
export KEY_COUNTRY="RU"
export KEY_PROVINCE="Krasnodar"
export KEY_CITY="Dinskaya"
export KEY_ORG="Own"
export KEY_EMAIL="[email protected]"
export KEY_OU="VPN"

# X509 Subject Field
export KEY_NAME="server"
...

Сервер сертификатын жасаңыз:

cd ~/openvpn-ca
source vars
./clean-all
./build-ca
./build-key-server server
./build-dh
openvpn --genkey --secret keys/ta.key

Соңғы «client-name.opvn» файлдарын жасау мүмкіндігін дайындаймыз:

mkdir -p ~/client-configs/files
chmod 700 ~/client-configs/files
cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf ~/client-configs/base.conf
mcedit ~/client-configs/base.conf

# Client mode
client

# Interface tunnel type
dev tun

# TCP protocol
proto tcp-client

# Address/Port of VPN server
remote XX.XX.XX.X0 1194

# Don't bind to local port/address
nobind

# Don't need to re-read keys and re-create tun at restart
persist-key
persist-tun

# Remote peer must have a signed certificate
remote-cert-tls server
ns-cert-type server

# Enable compression
comp-lzo

# Custom
ns-cert-type server
tls-auth ta.key 1
cipher DES-EDE3-CBC

Барлық файлдарды бір opvn файлына біріктіретін сценарий дайындаймыз.

mcedit ~/client-configs/make_config.sh
chmod 700 ~/client-configs/make_config.sh

#!/bin/bash

# First argument: Client identifier

KEY_DIR=~/openvpn-ca/keys
OUTPUT_DIR=~/client-configs/files
BASE_CONFIG=~/client-configs/base.conf

cat ${BASE_CONFIG} 
    <(echo -e '<ca>') 
    ${KEY_DIR}/ca.crt 
    <(echo -e '</ca>n<cert>') 
    ${KEY_DIR}/.crt 
    <(echo -e '</cert>n<key>') 
    ${KEY_DIR}/.key 
    <(echo -e '</key>n<tls-auth>') 
    ${KEY_DIR}/ta.key 
    <(echo -e '</tls-auth>') 
    > ${OUTPUT_DIR}/.ovpn

Бірінші OpenVPN клиентін жасау:

cd ~/openvpn-ca
source vars
./build-key client-name
cd ~/client-configs
./make_config.sh client-name

«~/client-configs/files/client-name.ovpn» файлы клиенттің құрылғысына жіберіледі.

iOS клиенттері үшін келесі амалды орындау қажет:
"tls-auth" тегінің мазмұны түсініктемесіз болуы керек.
Сондай-ақ, «tls-auth» тегіне бірден «1-бағыт кілтін» қойыңыз.

OpenVPN сервер конфигурациясын конфигурациялайық:

cd ~/openvpn-ca/keys
cp ca.crt ca.key server.crt server.key ta.key dh2048.pem /etc/openvpn
gunzip -c /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz | tee /etc/openvpn/server.conf
mcedit /etc/openvpn/server.conf

# Listen port
port 1194

# Protocol
proto tcp-server

# IP tunnel
dev tun0
tun-ipv6
push tun-ipv6

# Master certificate
ca ca.crt

# Server certificate
cert server.crt

# Server private key
key server.key

# Diffie-Hellman parameters
dh dh2048.pem

# Allow clients to communicate with each other
client-to-client

# Client config dir
client-config-dir /etc/openvpn/ccd

# Run client-specific script on connection and disconnection
script-security 2
client-connect "/usr/bin/sudo -u root /etc/openvpn/server-clientconnect.sh"
client-disconnect "/usr/bin/sudo -u root /etc/openvpn/server-clientdisconnect.sh"

# Server mode and client subnets
server 10.8.0.0 255.255.255.0
server-ipv6 XXXX:XXXX:XXXX:XXXX:1:3::/80
topology subnet

# IPv6 routes
push "route-ipv6 XXXX:XXXX:XXXX:XXXX::/64"
push "route-ipv6 2000::/3"

# DNS (for Windows)
# These are OpenDNS
push "dhcp-option DNS 208.67.222.222"
push "dhcp-option DNS 208.67.220.220"

# Configure all clients to redirect their default network gateway through the VPN
push "redirect-gateway def1 bypass-dhcp"
push "redirect-gateway ipv6" #For iOS

# Don't need to re-read keys and re-create tun at restart
persist-key
persist-tun

# Ping every 10s. Timeout of 120s.
keepalive 10 120

# Enable compression
comp-lzo

# User and group
user vpn
group vpn

# Log a short status
status openvpn-status.log

# Logging verbosity
##verb 4

# Custom config
tls-auth ta.key 0
cipher DES-EDE3-CBC

Бұл әрбір клиент үшін статикалық мекенжай орнату үшін қажет (қажет емес, бірақ мен оны қолданамын):

# Client config dir
client-config-dir /etc/openvpn/ccd

Ең қиын және негізгі деталь.

Өкінішке орай, OpenVPN әлі клиенттер үшін IPv6 шлюзін дербес конфигурациялауды білмейді.
Мұны әрбір клиент үшін «қолмен» жіберу керек.

# Run client-specific script on connection and disconnection
script-security 2
client-connect "/usr/bin/sudo -u root /etc/openvpn/server-clientconnect.sh"
client-disconnect "/usr/bin/sudo -u root /etc/openvpn/server-clientdisconnect.sh"

“/etc/openvpn/server-clientconnect.sh” файлы:

#!/bin/sh

# Check client variables
if [ -z "$ifconfig_pool_remote_ip" ] || [ -z "$common_name" ]; then
        echo "Missing environment variable."
        exit 1
fi

# Load server variables
. /etc/openvpn/variables

ipv6=""

# Find out if there is a specific config with fixed IPv6 for this client
if [ -f "/etc/openvpn/ccd/$common_name" ]; then
        # Get fixed IPv6 from client config file
        ipv6=$(sed -nr 's/^.*ifconfig-ipv6-push[ t]+([0-9a-fA-F:]+).*$/1/p' "/etc/openvpn/ccd/$common_name")
        echo $ipv6
fi

# Get IPv6 from IPv4
if [ -z "$ipv6" ]; then
        ipp=$(echo "$ifconfig_pool_remote_ip" | cut -d. -f4)
        if ! [ "$ipp" -ge 2 -a "$ipp" -le 254 ] 2>/dev/null; then
                echo "Invalid IPv4 part."
                exit 1
        fi
        hexipp=$(printf '%x' $ipp)
        ipv6="$prefix$hexipp"
fi

# Create proxy rule
/sbin/ip -6 neigh add proxy $ipv6 dev eno1

“/etc/openvpn/server-clientdisconnect.sh” файлы:

#!/bin/sh

# Check client variables
if [ -z "$ifconfig_pool_remote_ip" ] || [ -z "$common_name" ]; then
        echo "Missing environment variable."
        exit 1
fi

# Load server variables
. /etc/openvpn/variables

ipv6=""

# Find out if there is a specific config with fixed IPv6 for this client
if [ -f "/etc/openvpn/ccd/$common_name" ]; then
        # Get fixed IPv6 from client config file
        ipv6=$(sed -nr 's/^.*ifconfig-ipv6-push[ t]+([0-9a-fA-F:]+).*$/1/p' "/etc/openvpn/ccd/$common_name")
fi

# Get IPv6 from IPv4
if [ -z "$ipv6" ]; then
        ipp=$(echo "$ifconfig_pool_remote_ip" | cut -d. -f4)
        if ! [ "$ipp" -ge 2 -a "$ipp" -le 254 ] 2>/dev/null; then
                echo "Invalid IPv4 part."
                exit 1
        fi
        hexipp=$(printf '%x' $ipp)
        ipv6="$prefix$hexipp"
fi

# Delete proxy rule
/sbin/ip -6 neigh del proxy $ipv6 dev eno1

Екі сценарий де «/etc/openvpn/variables» файлын пайдаланады:

# Subnet
prefix=XXXX:XXXX:XXXX:XXXX:2:
# netmask
prefixlen=112

Неліктен бұлай жазылғанын есіме түсіру қиын.

Енді желі маскасы = 112 біртүрлі көрінеді (дәл сол жерде 96 болуы керек).
Ал префикс біртүрлі, ол tun0 желісіне сәйкес келмейді.
Бірақ жақсы, мен оны сол күйінде қалдырамын.

cipher DES-EDE3-CBC

Бұл бәріне бірдей емес - мен қосылымды шифрлаудың осы әдісін таңдадым.

OpenVPN IPv4 орнату туралы қосымша ақпарат алыңыз.

OpenVPN IPv6 орнату туралы қосымша ақпарат алыңыз.

============= Постфикс =============

Негізгі буманы орнату:

apt-get install postfix

Орнатқан кезде «интернет сайтын» таңдаңыз.

Менің "/etc/postfix/main.cf" келесідей көрінеді:

smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
biff = no

# appending .domain is the MUA's job.
append_dot_mydomain = no

readme_directory = no

# See http://www.postfix.org/COMPATIBILITY_README.html -- default to 2 on
# fresh installs.
compatibility_level = 2

# TLS parameters
smtpd_tls_cert_file=/etc/ssl/domain1.com.2018.chained.crt
smtpd_tls_key_file=/etc/ssl/domain1.com.2018.key
smtpd_use_tls=yes
smtpd_tls_auth_only = yes
smtp_bind_address = XX.XX.XX.X0
smtp_bind_address6 = XXXX:XXXX:XXXX:XXXX:1:1:1:1

smtp_tls_security_level = may
smtp_tls_ciphers = export
smtp_tls_protocols = !SSLv2, !SSLv3
smtp_tls_loglevel = 1

smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination
myhostname = domain1.com
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = domain1.com
mydestination = localhost
relayhost =
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
inet_protocols = ipv4

internal_mail_filter_classes = bounce

# Storage type
virtual_transport = lmtp:unix:private/dovecot-lmtp
virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
virtual_alias_maps = mysql:/etc/postfix/mysql-virtual-alias-maps.cf

# SMTP-Auth settings
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
smtpd_recipient_restrictions =
        permit_sasl_authenticated,
        permit_mynetworks,
        #reject_invalid_hostname,
        #reject_unknown_recipient_domain,
        reject_unauth_destination,
        reject_rbl_client sbl.spamhaus.org,
        check_policy_service unix:private/policyd-spf

smtpd_helo_restrictions =
        #reject_invalid_helo_hostname,
        #reject_non_fqdn_helo_hostname,
        reject_unknown_helo_hostname

smtpd_client_restrictions =
        permit_mynetworks,
        permit_sasl_authenticated,
        reject_non_fqdn_helo_hostname,
        permit

# SPF
policyd-spf_time_limit = 3600

# OpenDKIM
milter_default_action = accept
milter_protocol = 6
smtpd_milters = unix:var/run/opendkim/opendkim.sock
non_smtpd_milters = unix:var/run/opendkim/opendkim.sock

# IP address per domain
sender_dependent_default_transport_maps = pcre:/etc/postfix/sdd_transport.pcre

Осы конфигурацияның егжей-тегжейлерін қарастырайық.

smtpd_tls_cert_file=/etc/ssl/domain1.com.2018.chained.crt
smtpd_tls_key_file=/etc/ssl/domain1.com.2018.key

Хабаровск тұрғындарының айтуынша, бұл блокта «жалған ақпарат пен дұрыс емес тезистер» бар.Мен мансапты бастағаннан кейін 8 жылдан кейін ғана SSL қалай жұмыс істейтінін түсіне бастадым.

Сондықтан, мен SSL-ді қалай пайдалану керектігін сипаттай аламын («Ол қалай жұмыс істейді?» және «Ол неге жұмыс істейді?» Деген сұрақтарға жауап бермей).

Заманауи шифрлаудың негізі - кілттер жұбын (таңбалардың өте ұзын екі жолын) құру.

Бір «кілт» жеке, екіншісі «қоғамдық». Біз жеке кілтті өте мұқият құпия сақтаймыз. Біз ашық кілтті барлығына таратамыз.

Ашық кілттің көмегімен мәтін жолын тек жеке кілттің иесі ғана шифрын шеше алатындай шифрлауға болады.
Бұл технологияның негізі.

№1 қадам - ​​https сайттары.
Сайтқа кіру кезінде браузер веб-серверден сайттың https екенін біледі және сондықтан ашық кілтті сұрайды.
Веб-сервер ашық кілтті береді. Браузер http-сұранысты шифрлау және оны жіберу үшін ашық кілтті пайдаланады.
http-сұраныс мазмұнын тек жеке кілті барлар ғана оқи алады, яғни сұрау жіберілген сервер ғана.
Http-сұранысында кем дегенде URI бар. Сондықтан, егер ел бүкіл сайтқа емес, белгілі бір бетке кіруді шектеуге тырысса, https сайттары үшін мұны істеу мүмкін емес.

№2 қадам – шифрланған жауап.
Веб-сервер жолда оңай оқуға болатын жауапты ұсынады.
Шешім өте қарапайым - браузер жергілікті түрде әрбір https сайты үшін бірдей жеке-жалпы кілт жұбын жасайды.
Сайттың ашық кілтін сұраумен бірге ол өзінің жергілікті ашық кілтін жібереді.
Веб-сервер оны есте сақтайды және http-жауапты жіберу кезінде оны белгілі бір клиенттің ашық кілтімен шифрлайды.
Енді http-жауапты клиент браузерінің жеке кілтінің иесі ғана шеше алады (яғни клиенттің өзі).

No3 қадам – жалпыға ортақ арна арқылы қауіпсіз байланыс орнату.
№ 2 мысалда осалдық бар - ізгі ниетті адамдарға http-сұранысты ұстауға және ашық кілт туралы ақпаратты өңдеуге ештеңе кедергі келтірмейді.
Осылайша, делдал байланыс арнасы өзгергенше жіберілген және қабылданған хабарламалардың барлық мазмұнын анық көреді.
Мұнымен күресу өте қарапайым - браузердің ашық кілтін веб-сервердің ашық кілтімен шифрланған хабарлама ретінде жіберіңіз.
Содан кейін веб-сервер алдымен «сіздің ашық кілтіңіз осындай» сияқты жауап жібереді және бұл хабарды бірдей ашық кілтпен шифрлайды.
Браузер жауапты қарайды - егер «сіздің ашық кілтіңіз осындай» хабары алынса, бұл байланыс арнасының қауіпсіз екеніне 100% кепілдік береді.
Ол қаншалықты қауіпсіз?
Мұндай қауіпсіз байланыс арнасын құрудың өзі пинг*2 жылдамдығымен жүреді. Мысалы, 20 мс.
Шабуылдаушыда тараптардың бірінің жеке кілті алдын ала болуы керек. Немесе бірнеше миллисекунд ішінде жеке кілтті табыңыз.
Бір заманауи жеке кілтті бұзу суперкомпьютерде ондаған жылдарды алады.

№4 қадам – ашық кілттердің жалпы мәліметтер базасы.
Осы оқиғаның барлығында шабуылдаушының клиент пен сервер арасындағы байланыс арнасында отыру мүмкіндігі бар екені анық.
Клиент өзін сервер, ал сервер өзін клиент ретінде көрсете алады. Және екі бағыттағы жұп пернелерді эмуляциялаңыз.
Содан кейін шабуылдаушы барлық трафикті көреді және трафикті «өңдеу» мүмкіндігіне ие болады.
Мысалы, ақша жіберуге болатын мекенжайды өзгертіңіз немесе интернет-банкингтен құпия сөзді көшіріңіз немесе «қарсы» мазмұнды блоктаңыз.
Мұндай шабуылдаушылармен күресу үшін олар әрбір https сайты үшін ашық кілттері бар жалпыға қолжетімді деректер базасын ойлап тапты.
Әрбір браузер 200-ге жуық осындай деректер базасының бар екенін «біледі». Бұл кез келген браузерде алдын ала орнатылған.
«Білім» әр сертификаттың ашық кілтімен қамтамасыз етіледі. Яғни, әрбір нақты сертификаттау орталығына қосылу жалған болуы мүмкін емес.

Енді https үшін SSL қалай пайдалану керектігі туралы қарапайым түсінік бар.
Егер сіз миыңызды пайдалансаңыз, арнайы қызметтердің бұл құрылымдағы нәрсені қалай бұзатыны белгілі болады. Бірақ бұл оларға үлкен күш жұмсайды.
Ал NSA немесе CIA-дан кіші ұйымдар - тіпті VIP-лер үшін де қорғаныс деңгейін бұзу мүмкін емес.

Мен ssh қосылымдары туралы да қосамын. Онда ашық кілттер жоқ, сондықтан не істей аласыз? Мәселе екі жолмен шешіледі.
Құпия сөз ssh опциясы:
Бірінші қосылым кезінде ssh клиенті ssh серверінен жаңа ашық кілт бар екенін ескертуі керек.
Әрі қарай қосылымдар кезінде «ssh серверінен жаңа ашық кілт» ескертуі пайда болса, бұл олардың сізді тыңдауға тырысатынын білдіреді.
Немесе сіз бірінші қосылымыңызда тыңдалды, бірақ енді сіз сервермен делдалсыз сөйлесесіз.
Шындығында, телефонды тыңдау фактісі оңай, тез және оңай анықталатындықтан, бұл шабуыл нақты клиент үшін ерекше жағдайларда ғана қолданылады.

Перне бойынша ssh опциясы:
Біз флэш-дискіні аламыз, оған ssh серверінің жеке кілтін жазамыз (бұл үшін шарттар мен көптеген маңызды нюанстар бар, бірақ мен пайдалану нұсқауларын емес, білім беру бағдарламасын жазып жатырмын).
Біз ашық кілтті ssh клиенті болатын машинада қалдырамыз және оны құпия сақтаймыз.
Біз флэш-дискіні серверге әкелеміз, оны енгіземіз, жеке кілтті көшіреміз және флэш-дискіні өртеп, күлді желге шашамыз (немесе кем дегенде нөлдермен пішімдееміз).
Мұның бәрі - мұндай операциядан кейін мұндай ssh ​​қосылымын бұзу мүмкін болмайды. Әрине, 10 жылдан кейін трафикті суперкомпьютерде көруге болады, бірақ бұл басқа әңгіме.

Оффтоп үшін кешірім сұраймын.

Енді теория белгілі болды. Мен сізге SSL сертификатын жасау ағыны туралы айтып беремін.

«Openssl genrsa» көмегімен біз ашық кілт үшін жеке кілт және «бос орындар» жасаймыз.
Біз «бланкілерді» үшінші тарап компаниясына жібереміз, оған қарапайым сертификат үшін шамамен $9 төлейміз.

Бірнеше сағаттан кейін біз осы үшінші тарап компаниясынан «ашық» кілтті және бірнеше ашық кілттер жинағын аламыз.

Неліктен үшінші тарап компаниясы менің ашық кілтімді тіркеу үшін төлеуі керек - бұл бөлек мәселе, біз бұл жерде оны қарастырмаймыз.

Енді жазудың нені білдіретіні түсінікті:

smtpd_tls_key_file=/etc/ssl/domain1.com.2018.key

“/etc/ssl” қалтасы ssl мәселелеріне арналған барлық файлдарды қамтиды.
domain1.com — домен атауы.
2018 жыл – кілтті жасау жылы.
«кілт» - файлдың жеке кілт екенін көрсету.

Және бұл файлдың мағынасы:

smtpd_tls_cert_file=/etc/ssl/domain1.com.2018.chained.crt
domain1.com — домен атауы.
2018 жыл – кілтті жасау жылы.
шынжырлы – ашық кілттер тізбегі бар екенін белгілеу (бірінші – біздің ашық кілт, ал қалғаны – ашық кілтті шығарған компаниядан алынған).
crt - дайын сертификаттың бар екендігінің белгісі (техникалық түсініктемелері бар ашық кілт).

smtp_bind_address = XX.XX.XX.X0
smtp_bind_address6 = XXXX:XXXX:XXXX:XXXX:1:1:1:1

Бұл параметр бұл жағдайда пайдаланылмайды, бірақ мысал ретінде жазылған.

Өйткені бұл параметрдегі қате серверден спамның жіберілуіне әкеледі (сіздің еркіңізсіз).

Содан кейін бәріне кінәлі емес екеніңізді дәлелдеңіз.

recipient_delimiter = +

Көптеген адамдар білмеуі мүмкін, бірақ бұл электрондық пошталарды рейтингтеуге арналған стандартты таңба және оны қазіргі заманғы пошта серверлерінің көпшілігі қолдайды.

Мысалы, егер сізде пошта жәшігіңіз болса "[электрондық пошта қорғалған]"жіберіп көріңіз"[электрондық пошта қорғалған]-Одан не шыққанын қараңыз.

inet_protocols = ipv4

Бұл шатастыруы мүмкін.

Бірақ бұл жай ғана олай емес. Әрбір жаңа домен әдепкі бойынша тек IPv4 болып табылады, содан кейін мен әрқайсысы үшін жеке IPv6 қосамын.

virtual_transport = lmtp:unix:private/dovecot-lmtp
virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
virtual_alias_maps = mysql:/etc/postfix/mysql-virtual-alias-maps.cf

Мұнда біз барлық кіріс хаттардың көгершін үйіне жіберілетінін көрсетеміз.
Ал доменге, пошта жәшігіне, бүркеншік атқа қатысты ережелер – дерекқордан қараңыз.

/etc/postfix/mysql-virtual-mailbox-domains.cf

user = usermail
password = mailpassword
hosts = 127.0.0.1
dbname = servermail
query = SELECT 1 FROM virtual_domains WHERE name='%s'

/etc/postfix/mysql-virtual-mailbox-maps.cf

user = usermail
password = mailpassword
hosts = 127.0.0.1
dbname = servermail
query = SELECT 1 FROM virtual_users WHERE email='%s'

/etc/postfix/mysql-virtual-alias-maps.cf

user = usermail
password = mailpassword
hosts = 127.0.0.1
dbname = servermail
query = SELECT destination FROM virtual_aliases WHERE source='%s'

# SMTP-Auth settings
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes

Енді postfix поштаны dovecot көмегімен авторизациядан кейін ғана одан әрі жіберуге қабылдауға болатынын біледі.

Мен бұл жерде неге қайталанғанын шынымен түсінбеймін. Біз «виртуалды_тасымалда» қажет нәрсенің барлығын көрсеттік.

Бірақ постфикс жүйесі өте ескі - бұл ескі күндерден алынған кері әсер болуы мүмкін.

smtpd_recipient_restrictions =
        ...

smtpd_helo_restrictions =
        ...

smtpd_client_restrictions =
        ...

Бұл әр пошта сервері үшін басқаша конфигурациялануы мүмкін.

Менің иелігімде 3 пошта сервері бар және бұл параметрлер әртүрлі пайдалану талаптарына байланысты өте әртүрлі.

Сіз оны мұқият конфигурациялауыңыз керек - әйтпесе спам сізге түседі немесе одан да жаманы - сізден спам шығады.

# SPF
policyd-spf_time_limit = 3600

Кіріс әріптердің SPF деңгейін тексеруге қатысты кейбір плагиндерді орнату.

# OpenDKIM
milter_default_action = accept
milter_protocol = 6
smtpd_milters = unix:var/run/opendkim/opendkim.sock
non_smtpd_milters = unix:var/run/opendkim/opendkim.sock

Параметр біз барлық шығыс электрондық хаттармен DKIM қолтаңбасын беруіміз керек.

# IP address per domain
sender_dependent_default_transport_maps = pcre:/etc/postfix/sdd_transport.pcre

Бұл PHP сценарийлерінен хаттарды жіберу кезінде хаттарды бағыттаудың негізгі детальдары.

“/etc/postfix/sdd_transport.pcre” файлы:

/^[email protected]$/ domain1:
/^[email protected]$/ domain2:
/^[email protected]$/ domain3:
/@domain1.com$/             domain1:
/@domain2.com$/             domain2:
/@domain3.com$/             domain3:

Сол жақта тұрақты өрнектер бар. Оң жақта әріпті белгілейтін жапсырма бар.
Белгіге сәйкес постфикс - белгілі бір әріп үшін тағы бірнеше конфигурация жолын ескереді.

Постфикстің нақты әріп үшін қалай қайта конфигурацияланатыны «master.cf» ішінде көрсетіледі.

4, 5, 6 жолдар негізгі болып табылады. Қай доменнің атынан хат жіберіп жатырмыз, біз осы белгіні қоямыз.
Бірақ ескі кодта PHP сценарийлерінде «қайдан» өрісі әрқашан көрсетілмейді. Содан кейін пайдаланушы аты көмекке келеді.

Мақала қазірдің өзінде кең - мен nginx+fpm орнату арқылы алаңдатқым келмейді.

Қысқаша айтқанда, әрбір сайт үшін біз өзінің Linux-пайдаланушы иесін орнатамыз. Және сәйкесінше сіздің fpm-пул.

Fpm-pool кез келген php нұсқасын пайдаланады (бір серверде php-дің әртүрлі нұсқаларын және тіпті көрші сайттар үшін әртүрлі php.ini-ді еш қиындықсыз пайдалануға болатын кезде өте жақсы).

Сонымен, «www-domain2» белгілі бір Linux пайдаланушысының domain2.com веб-сайты бар. Бұл сайтта "Кімнен" өрісін көрсетпестен электрондық хаттарды жіберуге арналған код бар.

Сонымен, бұл жағдайда да хаттар дұрыс жіберіледі және ешқашан спамға түспейді.

Менің "/etc/postfix/master.cf" келесідей көрінеді:

...
smtp      inet  n       -       y       -       -       smtpd
  -o content_filter=spamassassin
...
submission inet n       -       y       -       -       smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
...
policyd-spf  unix  -       n       n       -       0       spawn
    user=policyd-spf argv=/usr/bin/policyd-spf

spamassassin unix -     n       n       -       -       pipe
    user=spamd argv=/usr/bin/spamc -f -e
    /usr/sbin/sendmail -oi -f ${sender} ${recipient}
...
domain1  unix -       -       n       -       -       smtp
   -o smtp_bind_address=XX.XX.XX.X1
   -o smtp_helo_name=domain1.com
   -o inet_protocols=all
   -o smtp_bind_address6=XXXX:XXXX:XXXX:XXXX:1:1:1:1
   -o syslog_name=postfix-domain1

domain2  unix -       -       n       -       -       smtp
   -o smtp_bind_address=XX.XX.XX.X5
   -o smtp_helo_name=domain2.com
   -o inet_protocols=all
   -o smtp_bind_address6=XXXX:XXXX:XXXX:XXXX:1:2:1:1
   -o syslog_name=postfix-domain2

domain3  unix -       -       n       -       -       smtp
   -o smtp_bind_address=XX.XX.XX.X2
   -o smtp_helo_name=domain3
   -o inet_protocols=all
   -o smtp_bind_address6=XXXX:XXXX:XXXX:XXXX:1:1:5:1
   -o syslog_name=postfix-domain3

Файл толық көлемде берілмейді - ол қазірдің өзінде өте үлкен.
Мен тек ненің өзгергенін атап өттім.

smtp      inet  n       -       y       -       -       smtpd
  -o content_filter=spamassassin
...
spamassassin unix -     n       n       -       -       pipe
    user=spamd argv=/usr/bin/spamc -f -e
    /usr/sbin/sendmail -oi -f ${sender} ${recipient}

Бұл спамассасинге қатысты параметрлер, бұл туралы кейінірек.

submission inet n       -       y       -       -       smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject

Біз сізге 587 порты арқылы пошта серверіне қосылуға мүмкіндік береміз.
Ол үшін жүйеге кіру керек.

policyd-spf  unix  -       n       n       -       0       spawn
    user=policyd-spf argv=/usr/bin/policyd-spf

SPF тексеруін қосыңыз.

apt-get install postfix-policyd-spf-python

Жоғарыдағы SPF тексерулеріне арналған буманы орнатайық.

domain1  unix -       -       n       -       -       smtp
   -o smtp_bind_address=XX.XX.XX.X1
   -o smtp_helo_name=domain1.com
   -o inet_protocols=all
   -o smtp_bind_address6=XXXX:XXXX:XXXX:XXXX:1:1:1:1
   -o syslog_name=postfix-domain1

Және бұл ең қызықты нәрсе. Бұл белгілі бір IPv4/IPv6 мекенжайынан белгілі бір домен үшін хаттарды жіберу мүмкіндігі.

Бұл rDNS үшін жасалады. rDNS – IP мекенжайы бойынша жолды қабылдау процесі.
Ал пошта үшін бұл мүмкіндік helo электрондық пошта жіберілген мекенжайдың rDNS сәйкестігін растау үшін пайдаланылады.

Егер сәлемдеме хат жіберілген электрондық пошта доменіне сәйкес келмесе, спам ұпайлары беріледі.

Helo rDNS сәйкес келмейді - көптеген спам ұпайлары беріледі.
Тиісінше, әрбір доменнің өзінің IP мекенжайы болуы керек.
OVH үшін - консольде rDNS көрсетуге болады.
tech.ru үшін - мәселе қолдау арқылы шешіледі.
AWS үшін мәселе қолдау арқылы шешіледі.
«inet_protocols» және «smtp_bind_address6» - біз IPv6 қолдауын қосамыз.
IPv6 үшін сізге rDNS тіркеу қажет.
«syslog_name» - бұл журналдарды оқуға ыңғайлы.

Сертификаттарды сатып алыңыз Мен мұнда ұсынамын.

Мұнда postfix+dovecot сілтемесін орнату.

SPF параметрін орнату.

============= Dovecot =============

apt-get install dovecot-imapd dovecot-pop3d dovecot-lmtpd dovecot-mysql dovecot-antispam

Mysql орнату, бумаларды өздері орнату.

"/etc/dovecot/conf.d/10-auth.conf" файлы

disable_plaintext_auth = yes
auth_mechanisms = plain login

Авторизация тек шифрланған.

«/etc/dovecot/conf.d/10-mail.conf» файлы

mail_location = maildir:/var/mail/vhosts/%d/%n

Мұнда біз әріптерді сақтау орнын көрсетеміз.

Мен олардың файлдарда сақталуын және домен бойынша топтастырылғанын қалаймын.

"/etc/dovecot/conf.d/10-master.conf" файлы

service imap-login {
  inet_listener imap {
    port = 0
  }
  inet_listener imaps {
    address = XX.XX.XX.X1, XX.XX.XX.X2, XX.XX.XX.X5, [XXXX:XXXX:XXXX:XXXX:1:1:1:1], [XXXX:XXXX:XXXX:XXXX:1:2:1:1], [XXXX:XXXX:XXXX:XXXX:1:1:5:1]
    port = 993
    ssl = yes
  }
}
service pop3-login {
  inet_listener pop3 {
    port = 0
  }
  inet_listener pop3s {
    address = XX.XX.XX.X1, XX.XX.XX.X2, XX.XX.XX.X5, [XXXX:XXXX:XXXX:XXXX:1:1:1:1], [XXXX:XXXX:XXXX:XXXX:1:2:1:1], [XXXX:XXXX:XXXX:XXXX:1:1:5:1]
    port = 995
    ssl = yes
  }
}
service lmtp {
  unix_listener /var/spool/postfix/private/dovecot-lmtp {
    mode = 0600
    user = postfix
    group = postfix
  }
}
service imap {
}
service pop3 {
}
service auth {
  unix_listener auth-userdb {
    mode = 0600
    user = vmail
  }

  unix_listener /var/spool/postfix/private/auth {
    mode = 0666
    user = postfix
    group = postfix
  }
  user = dovecot
}
service auth-worker {
  user = vmail
}
service dict {
  unix_listener dict {
  }
}

Бұл көгершін конфигурациясының негізгі файлы.
Мұнда біз қорғалмаған қосылымдарды өшіреміз.
Және қауіпсіз қосылымдарды қосыңыз.

"/etc/dovecot/conf.d/10-ssl.conf" файлы

ssl = required
ssl_cert = </etc/nginx/ssl/domain1.com.2018.chained.crt
ssl_key = </etc/nginx/ssl/domain1.com.2018.key
local XX.XX.XX.X5 {
  ssl_cert = </etc/nginx/ssl/domain2.com.2018.chained.crt
  ssl_key =  </etc/nginx/ssl/domain2.com.2018.key
}

ssl орнату. Біз ssl қажет екенін көрсетеміз.
Және сертификаттың өзі. Ал маңызды деталь – «жергілікті» директивалар. Қай жергілікті IPv4-ке қосылу кезінде қолданылатын SSL сертификатын көрсетеді.

Айтпақшы, IPv6 бұл жерде конфигурацияланбаған, мен бұл олқылықты кейін түзетемін.
XX.XX.XX.X5 (домен2) - сертификат жоқ. Клиенттерді қосу үшін domain1.com мекенжайын көрсету керек.
XX.XX.XX.X2 (domain3) - сертификат бар, клиенттерді қосу үшін domain1.com немесе domain3.com көрсетуге болады.

"/etc/dovecot/conf.d/15-lda.conf" файлы

protocol lda {
  mail_plugins = $mail_plugins sieve
}

Бұл болашақта спамассасинге қажет болады.

"/etc/dovecot/conf.d/20-imap.conf" файлы

protocol imap {
  mail_plugins = $mail_plugins antispam
}

Бұл спамға қарсы плагин. «Спам» қалтасына/қайта жіберу кезінде спамассасинді үйрету үшін қажет.

"/etc/dovecot/conf.d/20-pop3.conf" файлы

protocol pop3 {
}

Дәл осындай файл бар.

"/etc/dovecot/conf.d/20-lmtp.conf" файлы

protocol lmtp {
  mail_plugins = $mail_plugins sieve
  postmaster_address = [email protected]
}

lmtp орнату.

"/etc/dovecot/conf.d/90-antispam.conf" файлы

plugin {
  antispam_backend = pipe
  antispam_trash = Trash;trash
  antispam_spam = Junk;Spam;SPAM
  antispam_pipe_program_spam_arg = --spam
  antispam_pipe_program_notspam_arg = --ham
  antispam_pipe_program = /usr/bin/sa-learn
  antispam_pipe_program_args = --username=%Lu
}

Спам қалтасына/қайта жіберу кезіндегі Spamassasin жаттығу параметрлері.

"/etc/dovecot/conf.d/90-sieve.conf" файлы

plugin {
  sieve = ~/.dovecot.sieve
  sieve_dir = ~/sieve
  sieve_after = /var/lib/dovecot/sieve/default.sieve
}

Кіріс әріптермен не істеу керектігін көрсететін файл.

"/var/lib/dovecot/sieve/default.sieve" файлы

require ["fileinto", "mailbox"];

if header :contains "X-Spam-Flag" "YES" {
        fileinto :create "Spam";
}

Файлды құрастыру керек: “sievec default.sieve”.

"/etc/dovecot/conf.d/auth-sql.conf.ext" файлы

passdb {
  driver = sql
  args = /etc/dovecot/dovecot-sql.conf.ext
}
userdb {
  driver = static
  args = uid=vmail gid=vmail home=/var/mail/vhosts/%d/%n
}

Авторизация үшін sql файлдарын көрсету.
Ал авторизация әдісі ретінде файлдың өзі қолданылады.

"/etc/dovecot/dovecot-sql.conf.ext" файлы

driver = mysql
connect = host=127.0.0.1 dbname=servermail user=usermail password=password
default_pass_scheme = SHA512-CRYPT
password_query = SELECT email as user, password FROM virtual_users WHERE email='%u';

Бұл постфикстің ұқсас параметрлеріне сәйкес келеді.

"/etc/dovecot/dovecot.conf" файлы

protocols = imap lmtp pop3
listen = *, ::
dict {
}
!include conf.d/*.conf
!include_try local.conf

Негізгі конфигурация файлы.
Ең бастысы, біз мұнда көрсетеміз - хаттамаларды қосыңыз.

============= SpamAssassin =============

apt-get install spamassassin spamc

Пакеттерді орнатайық.

adduser spamd --disabled-login

Кімнің атынан пайдаланушыны қосайық.

systemctl enable spamassassin.service

Жүктеу кезінде спамассасин қызметін автоматты түрде жүктеуді қосамыз.

"/etc/default/spamassassin" файлы:

CRON=1

Ережелерді автоматты түрде жаңартуды «әдепкі бойынша» қосу арқылы.

«/etc/spamassassin/local.cf» файлы:

report_safe 0

use_bayes          1
bayes_auto_learn   1
bayes_auto_expire  1
bayes_store_module Mail::SpamAssassin::BayesStore::MySQL
bayes_sql_dsn      DBI:mysql:sa:localhost:3306
bayes_sql_username sa
bayes_sql_password password

MySQL-де «sa» пайдаланушысымен «password» құпия сөзі бар «sa» дерекқорын жасау керек (адекватты нәрсемен ауыстырыңыз).

report_safe - бұл хаттың орнына спам электрондық поштасының есебін жібереді.
use_bayes — спамассасин машинасын үйрену параметрлері.

Қалған spamassassin параметрлері мақалада бұрын қолданылған.

Жалпы параметр "спамассасин".
Жаңа спам электрондық пошталарын IMAP «Спам» қалтасына жылжыту туралы.
Dovecot + SpamAssassin қарапайым комбинациясы туралы.
Мен imap қалталарындағы әріптерді жылжыту кезінде spamassasin оқу теориясын оқуды ұсынамын (және мен оны пайдалануды ұсынбаймын).

============= Қауымдастыққа үндеу =============

Мен сондай-ақ қоғамдастыққа жіберілген хаттардың қауіпсіздік деңгейін қалай арттыруға болатыны туралы идеяны айтқым келеді. Себебі мен пошта тақырыбына қатты еніп кеткенмін.

Пайдаланушы өз клиентінде (outlook, thunderbird, браузер-плагин, ...) жұп пернелер жасай алады. Қоғамдық және жеке. Қоғамдық - DNS жүйесіне жіберу. Жеке - клиентте сақтаңыз. Пошта серверлері белгілі бір алушыға жіберу үшін ашық кілтті пайдалана алады.

Мұндай хаттармен спамнан қорғау үшін (иә, пошта сервері мазмұнды көре алмайды) - сізге 3 ереже енгізу қажет:

  1. Міндетті нақты DKIM қолтаңбасы, міндетті SPF, міндетті rDNS.
  2. Спамға қарсы оқыту тақырыбы бойынша нейрондық желі + клиент жағында оған арналған деректер базасы.
  3. Шифрлау алгоритмі жіберуші тарап қабылдаушы тарапқа қарағанда шифрлауға CPU қуатын 100 есе көп жұмсайтындай болуы керек.

Қоғамдық хаттардан басқа, «қауіпсіз хат алмасуды бастау үшін» стандартты ұсыныс хатын әзірлеңіз. Пайдаланушылардың бірі (пошта жәшігі) қосымшасы бар хатты басқа пошта жәшігіне жібереді. Хатта хат алмасу үшін қауіпсіз байланыс арнасын және пошта жәшігінің иесінің ашық кілтін (клиент жағында жабық кілті бар) іске қосу туралы мәтіндік ұсыныс бар.

Сіз тіпті әрбір хат алмасу үшін арнайы бірнеше кілт жасай аласыз. Алушы пайдаланушы бұл ұсынысты қабылдап, өзінің ашық кілтін жібере алады (сонымен бірге осы хат алмасу үшін арнайы жасалған). Содан кейін бірінші пайдаланушы қызметтік бақылау хатын жібереді (екінші пайдаланушының ашық кілтімен шифрланған) - оны алғаннан кейін екінші пайдаланушы қалыптасқан байланыс арнасын сенімді деп санай алады. Әрі қарай, екінші пайдаланушы бақылау хатын жібереді - содан кейін бірінші пайдаланушы да қалыптасқан арнаны қауіпсіз деп санай алады.

Жолда кілттерді ұстап алумен күресу үшін хаттамада флэш-диск арқылы кем дегенде бір ашық кілтті беру мүмкіндігі қарастырылуы керек.

Ең бастысы, бәрі жұмыс істейді («оны кім төлейді?» Деген сұрақ):
10 жылға 3 доллардан басталатын пошта сертификаттарын енгізіңіз. Бұл жіберушіге DNS-де «менің ашық кілттерім сол жерде» екенін көрсетуге мүмкіндік береді. Және олар сізге қауіпсіз қосылымды бастау мүмкіндігін береді. Сонымен қатар, мұндай қосылымдарды қабылдау тегін.
gmail өз пайдаланушыларын монетизациялауда. 10 жылға $3 үшін - қауіпсіз хат алмасу арналарын құру құқығы.

============= Қорытынды =============

Бүкіл мақаланы тексеру үшін мен бір айға арнайы серверді жалға алып, SSL сертификаты бар домен сатып алмақ болдым.

Бірақ өмірлік жағдайлар дамыды, сондықтан бұл мәселе 2 айға созылды.
Сөйтіп, тағы да бос уақыт болған соң, басылымның тағы бір жылға созылып кетуіне тәуекел етпей, мақаланы сол күйінде жариялауды жөн көрдім.

Егер «бірақ бұл жеткілікті түрде егжей-тегжейлі сипатталмаған» сияқты көптеген сұрақтар туындаса, жаңа домен мен жаңа SSL сертификаты бар арнайы серверді алып, оны одан да егжей-тегжейлі сипаттауға күш болуы мүмкін. ең бастысы, барлық жетіспейтін маңызды мәліметтерді анықтаңыз.

Мен сондай-ақ пошталық куәліктер туралы идеялар туралы пікір алғым келеді. Егер сізге идея ұнаса, мен rfc үшін нобай жазуға күш табуға тырысамын.

Мақаланың үлкен бөліктерін көшіргенде осы мақалаға сілтеме беріңіз.
Кез келген басқа тілге аударған кезде осы мақалаға сілтеме беріңіз.
Мен оны ағылшын тіліне өзім аударуға тырысамын және сілтемелерді қалдырамын.


Ақпарат көзі: www.habr.com

пікір қалдыру