Debian + Postfix + Dovecot + Multidomain + SSL + IPv6 + OpenVPN + Мулти-интерфејси + SpamAssassin-learn + Bind

Оваа статија е за тоа како да поставите модерен сервер за пошта.
Постфикс + Гулабарник. SPF + DKIM + rDNS. Со IPv6.
Со TSL енкрипција. Со поддршка за повеќе домени - дел со вистински SSL сертификат.
Со антиспам заштита и висок антиспам рејтинг од други сервери за пошта.
Поддржува повеќе физички интерфејси.
Со OpenVPN, врската со која е преку IPv4, и која обезбедува IPv6.

Ако не сакате да ги научите сите овие технологии, но сакате да поставите таков сервер, тогаш оваа статија е за вас.

Написот не се обидува да ги објасни сите детали. Објаснувањето оди на она што не е конфигурирано како стандардно или е важно од гледна точка на потрошувачот.

Мотивацијата за поставување сервер за пошта беше мој долгогодишен сон. Ова можеби звучи глупаво, но IMHO е многу подобро отколку да сонувате за нов автомобил од вашата омилена марка.

Постојат две мотивации за поставување IPv6. ИТ специјалист треба постојано да учи нови технологии за да преживее. Би сакал да дадам мојот скромен придонес во борбата против цензурата.

Мотивацијата за поставување OpenVPN е само IPv6 да работи на локалната машина.
Мотивацијата за поставување на неколку физички интерфејси е тоа што на мојот сервер имам еден интерфејс „бавен, но неограничен“ и друг „брз, но со тарифа“.

Мотивацијата за поставување на поставките за Bind е тоа што мојот интернет провајдер обезбедува нестабилен DNS сервер, а google исто така понекогаш не успева. Сакам стабилен DNS сервер за лична употреба.

Мотивација да напишам статија - Напишав нацрт пред 10 месеци и веќе двапати го погледнав. Дури и ако на авторот редовно му треба, постои голема веројатност дека ќе им треба и на другите.

Не постои универзално решение за сервер за пошта. Но, ќе се обидам да напишам нешто како „направете го ова и тогаш, кога сè ќе функционира како што треба, исфрлете ги дополнителните работи“.

Компанијата tech.ru има сервер за колокација. Можно е да се спореди со OVH, Hetzner, AWS. За да се реши овој проблем, соработката со tech.ru ќе биде многу поефикасна.

Дебиан 9 е инсталиран на серверот.

Серверот има 2 интерфејси „eno1“ и „eno2“. Првиот е неограничен, а вториот е брз, соодветно.

Има 3 статични IP адреси, XX.XX.XX.X0 и XX.XX.XX.X1 и XX.XX.XX.X2 на интерфејсот `eno1` и XX.XX.XX.X5 на интерфејсот `eno2` .

Достапно XXXX:XXXX:XXXX:XXXX::/64 базен од IPv6 адреси кои се доделени на интерфејсот `eno1` и од него XXXX:XXXX:XXXX:XXXX:1:2::/96 беше доделен на `eno2` на мое барање.

Постојат 3 домени „domain1.com“, „domain2.com“, „domain3.com“. Постои SSL сертификат за „domain1.com“ и „domain3.com“.

Имам сметка на Google со која би сакал да го поврзам моето поштенско сандаче[заштитена по е-пошта]` (примање пошта и испраќање пошта директно од интерфејсот на gmail).
Мора да има поштенско сандаче`[заштитена по е-пошта]`, копија од е-поштата од која сакам да видам во мојот gmail. И ретко е да можеш да испратиш нешто во име на `[заштитена по е-пошта]` преку веб-интерфејсот.

Мора да има поштенско сандаче`[заштитена по е-пошта]`, што Иванов ќе го користи од својот iPhone.

Испратените пораки мора да бидат во согласност со сите современи барања за антиспам.
Мора да има највисоко ниво на шифрирање обезбедено во јавните мрежи.
Треба да има поддршка за IPv6 и за испраќање и примање писма.
Треба да има SpamAssassin кој никогаш нема да брише е-пошта. И или ќе отскокне или ќе прескокне или ќе се испрати во папката IMAP „Spam“.
Мора да се конфигурира автоматското учење SpamAssassin: ако преместам писмо во папката Spam, таа ќе научи од ова; ако преместам писмо од папката Spam, ќе научи од ова. Резултатите од обуката за SpamAssassin треба да влијаат на тоа дали писмото ќе заврши во папката Spam.
PHP скриптите мора да можат да испраќаат пошта во име на кој било домен на даден сервер.
Треба да има услуга openvpn, со можност за користење IPv6 на клиент кој нема IPv6.

Прво треба да ги конфигурирате интерфејсите и рутирањето, вклучително и IPv6.
Потоа ќе треба да го конфигурирате OpenVPN, кој ќе се поврзе преку IPv4 и ќе му обезбеди на клиентот статичко-реална IPv6 адреса. Овој клиент ќе има пристап до сите 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 - IPv4 #1 на eno1.
XX.XX.XX.X1 - IPv4 #2 на eno1.
XX.XX.XX.X2 - IPv4 #3 на eno1.
XX.XX.XX.X5 - IPv4 #1 на eno2.
XX.XX.XX.1 - порта IPv4.
XXXX:XXXX:XXXX:XXXX::/64 - IPv6 за целиот сервер.
XXXX:XXXX:XXXX:XXXX:1:2::/96 - IPv6 за eno2, се друго однадвор оди во eno1.
XXXX:XXXX:XXXX:XXXX::1 — порта IPv6 (вреди да се напомене дека ова може/треба да се направи поинаку. Наведете го прекинувачот IPv6).
dns-nameservers - 127.0.0.1 е означен (бидејќи bind е инсталиран локално) и 213.248.1.6 (ова е од tech.ru).

„табела eno1t“ и „table eno2t“ - значењето на овие рути-правила е дека сообраќајот што влегува преку eno1 -> би излегувал преку него, а сообраќајот што влегува преку eno2 -> би излегувал преку него. И, исто така, врските иницирани од серверот ќе поминат преку eno1.

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

Со оваа команда наведуваме дека секој неразбирлив сообраќај што потпаѓа под кое било правило означено со „табела 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

Овој блок одредува втор IPv4 за интерфејсот eno1.

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

Со оваа команда ја поставивме рутата од клиентите на OpenVPN до локалниот IPv4 освен XX.XX.XX.X0.
Сè уште не разбирам зошто оваа команда е доволна за сите 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. Во спротивно, нема да биде можно да се конфигурира портата IPv6 за клиентите на OpenVPN.
eno2 - подмрежата мора да биде поголема од tun0. Во спротивно, клиентите на OpenVPN нема да можат да пристапат до локалните IPv6 адреси.
За јасност, избрав чекор на подмрежа од 16, но ако сакате, можете дури и да направите чекор „1“.
Според тоа, 64 + 16 = 80 и 80 + 16 = 96.

За уште поголема јасност:
XXXX:XXXX:XXXX:XXXX:1:1:YYYY:YYYY се адреси кои треба да се доделат на одредени локации или услуги на интерфејсот eno1.
XXXX:XXXX:XXXX:XXXX:1:2:YYYY:YYYY се адреси кои треба да се доделат на одредени локации или услуги на интерфејсот eno2.
XXXX:XXXX:XXXX:XXXX:1:3:ГГГГ:ГГГГ се адреси што треба да им се доделат на клиентите на 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 мрежа. IPv4 адреси за openvpn клиенти.
Конзистентноста на правилата е важна.

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

Ова е ограничување така што само јас можам да користам OpenVPN од мојата статична IP адреса.

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

За да препраќате IPv4 пакети помеѓу клиентите на OpenVPN и Интернет, треба да регистрирате една од овие команди.

За различни случаи, една од опциите не е погодна.
Двете команди се погодни за мојот случај.
Откако ја прочитав документацијата, ја избрав првата опција бидејќи користи помалку процесор.

За да може сите поставки на 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“ мора да биде без коментари.
Исто така, ставете „key-direction 1“ веднаш пред ознаката „tls-auth“.

Ајде да ја конфигурираме конфигурацијата на серверот 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

Тешко ми е да се сетам зошто е вака напишано.

Сега netmask = 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-одговорот може да се дешифрира само од сопственикот на приватниот клуч на прелистувачот на клиентот (т.е. самиот клиент).

Чекор бр. 3 - воспоставување безбедна врска преку јавен канал.
Има ранливост во примерот бр. 2 - ништо не ги спречува добронамерниците да пресретнат http-барање и да уредуваат информации за јавниот клуч.
Така, посредникот јасно ќе ја види целата содржина на испратените и примените пораки додека не се промени каналот за комуникација.
Справувањето со ова е исклучително едноставно - само испратете го јавниот клуч на прелистувачот како порака шифрирана со јавниот клуч на веб-серверот.
Веб-серверот потоа прво испраќа одговор како „вашиот јавен клуч е вака“ и ја шифрира оваа порака со истиот јавен клуч.
Прелистувачот го гледа одговорот - ако е примена пораката „вашиот јавен клуч е ваков“ - тогаш ова е 100% гаранција дека овој канал за комуникација е безбеден.
Колку е безбедно?
Самото создавање на таков безбеден комуникациски канал се случува со брзина од пинг*2. На пример 20 ms.
Напаѓачот мора однапред да го има приватниот клуч на една од страните. Или најдете приватен клуч за неколку милисекунди.
За хакирање на еден модерен приватен клуч ќе бидат потребни децении на суперкомпјутер.

Чекор # 4 - јавна база на податоци за јавни клучеви.
Очигледно, во целата оваа приказна постои можност напаѓачот да седне на каналот за комуникација помеѓу клиентот и серверот.
Клиентот може да се преправа дека е серверот, а серверот може да се преправа дека е клиентот. И емулирајте пар клучеви во двете насоки.
Тогаш напаѓачот ќе го види целиот сообраќај и ќе може да го „уреди“ сообраќајот.
На пример, сменете ја адресата каде да испраќате пари или копирајте ја лозинката од онлајн банкарството или блокирајте „непристојна“ содржина.
За борба против таквите напаѓачи, тие дојдоа до јавна база на податоци со јавни клучеви за секоја страница https.
Секој прелистувач „знае“ за постоењето на околу 200 такви бази на податоци. Ова е претходно инсталирано во секој прелистувач.
„Знаење“ е поддржано со јавен клуч од секој сертификат. Односно, врската со секој конкретен орган за сертификација не може да се лажира.

Сега има едноставно разбирање за тоа како да се користи SSL за https.
Ако го користите вашиот мозок, ќе ви стане јасно како специјалните служби можат да хакираат нешто во оваа структура. Но, тоа ќе ги чини монструозни напори.
И организации помали од НСА или ЦИА - речиси е невозможно да се хакира постојното ниво на заштита, дури и за ВИП.

Ќе додадам и за ssh врски. Нема јавни клучеви таму, па што можете да направите? Прашањето се решава на два начина.
Опција ssh-by-password:
При првата врска, 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 е година на создавање на клучните.
chained - ознака дека постои синџир на јавни клучеви (првиот е нашиот јавен клуч, а останатите се она што дојде од компанијата што го издала јавниот клуч).
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

Овде наведуваме дека целата дојдовна пошта оди во dovecot.
И правилата за домен, поштенско сандаче, алијас - погледнете во базата на податоци.

/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.

Навистина не разбирам зошто ова е дуплицирано овде. Веќе наведовме сè што е потребно во „virtual_transport“.

Но, системот за постфикс е многу стар - веројатно тоа е враќање од старите денови.

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 за соседните сајтови без проблеми).

Значи, специфичен корисник на Linux „www-domain2“ има веб-страница 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}

Ова се поставки поврзани со spamassasin, повеќе за тоа подоцна.

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.

============= Гулабарник ==============

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 {
  }
}

Ова е главната конфигурациска датотека на Dovecot.
Овде ги оневозможуваме необезбедените врски.
И овозможете безбедни врски.

Датотека "/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 е потребен.
И самиот сертификат. А важен детал е „локалната“ директива. Покажува кој SSL сертификат да се користи при поврзување на кој локален IPv4.

Патем, IPv6 не е конфигуриран овде, ќе го поправам овој пропуст подоцна.
XX.XX.XX.X5 (домен2) - без сертификат. За да поврзете клиенти треба да наведете domain1.com.
XX.XX.XX.X2 (домен3) - има сертификат, можете да наведете domain1.com или domain3.com за поврзување клиенти.

Датотека „/etc/dovecot/conf.d/15-lda.conf“

protocol lda {
  mail_plugins = $mail_plugins sieve
}

Ова ќе биде потребно за spamassassin во иднина.

Датотека "/etc/dovecot/conf.d/20-imap.conf"

protocol imap {
  mail_plugins = $mail_plugins antispam
}

Ова е додаток за антиспам. Потребно е за обука на spamassasin во моментот на префрлање во/од папката „Spam“.

Датотека "/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 во моментот на префрлање во/од папката Spam.

Датотека "/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

Ја овозможуваме услугата за автоматско вчитување spamassassin при вчитувањето.

Датотека „/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

Треба да креирате база на податоци „sa“ во mysql со корисникот „sa“ со лозинка „password“ (заменете со нешто соодветно).

report_safe - ова ќе испрати извештај за спам-пошта наместо писмо.
use_bayes се поставки за машинско учење spamassassin.

Останатите поставки за spamassassin беа користени претходно во статијата.

Општа поставка „спаматер“.
За преместување на нови Спам-мејлови во папката „Спам“ IMAP.
За едноставна комбинација на Dovecot + SpamAssassin.
Препорачувам да ја прочитате теоријата за учење spamassasin кога преместувате букви во папките imap (и не препорачувам да ја користите).

============= Апел до заедницата ==============

Исто така, би сакал да фрлам идеја во заедницата за тоа како да се зголеми нивото на безбедност на препратените писма. Бидејќи сум толку длабоко навлезен во темата за пошта.

За да може корисникот да креира пар клучеви на својот клиент (outlook, thunderbird, прелистувач-приклучок, ...). Јавни и приватни. Јавно - испратете до DNS. Приватно - заштедете на клиентот. Серверите за пошта ќе можат да користат јавен клуч за испраќање до одреден примач.

И за да се заштитите од спам со такви букви (да, серверот за пошта нема да може да ја гледа содржината) - ќе треба да воведете 3 правила:

  1. Задолжителен вистински DKIM потпис, задолжителен SPF, задолжителен rDNS.
  2. Неврална мрежа на тема антиспам обука + база на податоци за неа на страната на клиентот.
  3. Алгоритмот за шифрирање мора да биде таков што страната што испраќа мора да потроши 100 пати повеќе моќ на процесорот за шифрирање отколку страната примач.

Покрај јавните писма, развијте стандардно писмо со предлог „за да започнете сигурна кореспонденција“. Еден од корисниците (поштенско сандаче) испраќа писмо со прилог до друго поштенско сандаче. Писмото содржи текстуален предлог за започнување безбеден комуникациски канал за кореспонденција и јавниот клуч на сопственикот на поштенското сандаче (со приватен клуч на клиентската страна).

Можете дури и да направите неколку клучеви специјално за секоја кореспонденција. Корисникот-примач може да ја прифати оваа понуда и да го испрати својот јавен клуч (исто така направен специјално за оваа кореспонденција). Следно, првиот корисник испраќа писмо за контрола на услугата (шифрирана со јавниот клуч на вториот корисник) - по приемот на кој вториот корисник може да го смета формираниот канал за комуникација доверлив. Следно, вториот корисник испраќа контролна буква - а потоа и првиот корисник може да го смета формираниот канал за безбеден.

За борба против пресретнувањето на клучевите на патот, протоколот мора да обезбеди можност за пренос на најмалку еден јавен клуч со помош на флеш-уред.

И најважно е дека сето тоа функционира (прашањето е „кој ќе плати за тоа?“):
Внесете поштенски сертификати со почеток од 10 $ за 3 години. Што ќе му овозможи на испраќачот да покаже во dns дека „моите јавни клучеви се таму“. И тие ќе ви дадат можност да започнете сигурна врска. Во исто време, прифаќањето такви врски е бесплатно.
gmail конечно ги монетизира своите корисници. За 10 долари на 3 години - право да креирате безбедни канали за кореспонденција.

============== Заклучок ==============

За да ја тестирам целата статија, требаше да изнајмувам посветен сервер за еден месец и да купам домен со SSL сертификат.

Но, животните околности се развија, па ова прашање се одолговлекуваше 2 месеци.
И така, кога повторно имав слободно време, решив да ја објавам статијата како што е, наместо да ризикувам објавувањето да се одолговлекува уште една година.

Ако има доста прашања како „но ова не е опишано во доволно детали“, тогаш веројатно ќе има сила да земете посветен сервер со нов домен и нов SSL сертификат и да го опишете уште подетално и, повеќето што е важно, идентификувајте ги сите важни детали што недостасуваат.

Исто така, би сакал да добијам повратни информации за идеите за поштенските сертификати. Ако ви се допаѓа идејата, ќе се обидам да најдам сила да напишам нацрт за rfc.

Кога копирате големи делови од статија, наведете линк до овој напис.
Кога преведувате на кој било друг јазик, наведете врска до овој напис.
Ќе се обидам сам да го преведам на англиски и да оставам вкрстени референци.


Извор: www.habr.com

Додадете коментар