Debian + Postfix + Dovecot + Multidomain + SSL + IPv6 + OpenVPN + Көп интерфейстер + SpamAssassin-үйрөнүү + Bind

Бул макалада заманбап почта серверин кантип орнотуу керек.
Postfix + Dovecot. SPF + DKIM + rDNS. IPv6 менен.
TSL шифрлөө менен. бир нече домендердин колдоосу менен - ​​чыныгы SSL тастыктамасы менен бөлүгү.
Спамдан коргоо жана башка почта серверлеринин жогорку антиспам рейтинги менен.
Бир нече физикалык интерфейстерди колдойт.
OpenVPN менен, туташуу IPv4 аркылуу жана IPv6 камсыз кылат.

Эгер сиз бул технологиялардын баарын үйрөнгүңүз келбесе, бирок мындай серверди орноткуңуз келсе, анда бул макала сиз үчүн.

Макала ар бир майда-чүйдөсүнө чейин түшүндүрүүгө аракет кылбайт. Түшүндүрмө стандарт катары конфигурацияланбаган же керектөөчүнүн көз карашы боюнча маанилүү нерсеге барат.

Почта серверин орнотуу менин көптөн берки кыялым болчу. Бул акылсыз сезилиши мүмкүн, бирок 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 даректер бар, XX.XX.XX.X0 жана XX.XX.XX.X1 жана XX.XX.XX.X2 `eno1` интерфейсинде жана XX.XX.XX.X5 `eno2` интерфейсинде .

Жеткиликтүү 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:XXXXX:XXXX:1:2::/96 - eno6 үчүн IPv2, сырттан калган бардык нерсе eno1ге кирет.
XXXX:XXXX:XXXXX: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

Бул буйрук менен биз "таблица 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:XXXXX:XXXXX:XXXX:1:1:YYYY:YYYY - eno1 интерфейсинде белгилүү сайттарга же кызматтарга дайындалышы керек болгон даректер.
XXXX:XXXXX:XXXXX:XXXX:1:2:YYYY:YYYY - eno2 интерфейсинде белгилүү сайттарга же кызматтарга дайындалышы керек болгон даректер.
XXXX:XXXX:XXXXX: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 орнотуу жөнүндө көбүрөөк билүү.

============= Postfix =============

Негизги пакетти орнотуу:

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 мс.
Чабуулчуда алдын ала тараптардын биринин купуя ачкычы болушу керек. Же бир нече миллисекундда купуя ачкычты табыңыз.
Бир заманбап жеке ачкычты бузуп алуу суперкомпьютерде ондогон жылдарды талап кылат.

№4-кадам – ачык ачкычтардын жалпы маалымат базасы.
Албетте, бул окуяда чабуулчуга кардар менен сервердин ортосундагы байланыш каналында отуруу мүмкүнчүлүгү бар.
Кардар өзүн сервер, ал эми сервер кардар деп көрсөтө алат. Жана эки багытта бир жуп баскычтарды туураңыз.
Ошондо чабуулчу бардык трафикти көрүп, трафикти "редакциялай" алат.
Мисалы, акча жөнөтө турган даректи өзгөртүңүз же онлайн банкингден сырсөздү көчүрүңүз же "каршы" мазмунду бөгөттөңүз.
Мындай чабуулчулар менен күрөшүү үчүн алар ар бир https сайты үчүн ачык ачкычтары бар коомдук маалымат базасын ойлоп табышты.
Ар бир браузер 200гө жакын ушундай маалымат базаларынын бар экенин "билет". Бул ар бир браузерде алдын ала орнотулган.
"Билим" ар бир сертификаттын ачык ачкычы менен бекемделет. Башкача айтканда, ар бир конкреттүү тастыктоочу орган менен байланыш жасалма болушу мүмкүн эмес.

Эми https үчүн SSLди кантип колдонуу керектиги жөнүндө жөнөкөй түшүнүк бар.
Эгер сиз мээңизди колдонсоңуз, атайын кызматтар бул структурадагы бир нерсени кантип бузуп алаары айкын болот. Бирок бул алар үчүн чоң аракеттерди талап кылат.
Ал эми NSA же ЦРУга караганда азыраак уюмдар - бул 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 менен авторизациялангандан кийин гана андан ары жөнөтүү үчүн кабыл алынарын билет.

Бул жерде эмне үчүн кайталанып жатканын мен чынында түшүнбөйм. Биз буга чейин "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:

Сол жакта туруктуу сөз айкаштары бар. Оң жакта катты белгилеген белги бар.
Белгиге ылайык Postfix - белгилүү бир кат үчүн дагы бир нече конфигурация линияларын эске алат.

Белгилүү бир тамга үчүн постфикс кантип кайра конфигурацияланары "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 кат жөнөтүлгөн электрондук почта доменине дал келбесе, спам упайлары берилет.

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
}

Бул келечекте spamassassin үчүн керек болот.

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

protocol imap {
  mail_plugins = $mail_plugins antispam
}

Бул антиспам плагини. "Спам" папкасына/которуп жатканда spamassasinди үйрөтүү үчүн керек.

Файл "/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

Жүктөп жатканда автоматтык жүктөө 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

Сиз MySQLде “sa” деген колдонуучу менен “пароль” сырсөзү менен “sa” маалымат базасын түзүшүңүз керек (адекваттуу нерсе менен алмаштырыңыз).

report_safe - бул каттын ордуна спам электрондук почта билдирүүсүн жөнөтөт.
use_bayes - spamassassin машина үйрөнүү жөндөөлөрү.

Калган 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 үчүн долбоор жазууга күч табууга аракет кылам.

Макаланын чоң бөлүктөрүн көчүрүп жатканда бул макалага шилтеме бериңиз.
Башка тилге которууда бул макалага шилтеме бериңиз.
Мен аны англис тилине өзүм которуп, кайчылаш шилтемелерди калтырганга аракет кылам.


Source: www.habr.com

Комментарий кошуу