Debian + Postfix + Dovecot + Multidomain + SSL + IPv6 + OpenVPN + Multi-interfeyslər + SpamAssassin-öyrənmək + Bağlamaq

Bu məqalə müasir poçt serverinin necə qurulacağından bəhs edir.
Postfix + Dovecot. SPF + DKIM + rDNS. IPv6 ilə.
TSL şifrələməsi ilə. Çox sayda domen dəstəyi ilə - real SSL sertifikatı olan hissə.
Antispam qorunması və digər poçt serverlərindən yüksək antispam reytinqi ilə.
Çoxlu fiziki interfeysləri dəstəkləyir.
Bağlantı IPv4 vasitəsilə olan və IPv6 təmin edən OpenVPN ilə.

Bütün bu texnologiyaları öyrənmək istəmirsinizsə, lakin belə bir server qurmaq istəyirsinizsə, bu məqalə sizin üçündür.

Məqalədə hər bir detalı izah etməyə cəhd göstərilmir. İzahat standart olaraq konfiqurasiya olunmayan və ya istehlakçı baxımından vacib olana gedir.

Poçt serveri qurmaq motivasiyası mənim çoxdankı arzum olub. Bu axmaq səslənə bilər, amma IMHO, sevimli markanızdan yeni bir avtomobil xəyal etməkdən daha yaxşıdır.

IPv6 qurmaq üçün iki motivasiya var. İT mütəxəssisi sağ qalmaq üçün daim yeni texnologiyalar öyrənməlidir. Mən senzura ilə mübarizəyə öz təvazökar töhfəmi vermək istərdim.

OpenVPN qurmaq üçün motivasiya yalnız yerli maşında IPv6-nın işləməsini təmin etməkdir.
Bir neçə fiziki interfeys qurmaq üçün motivasiya ondan ibarətdir ki, mənim serverimdə bir interfeys “yavaş, lakin qeyri-məhdud”, digəri isə “sürətli, lakin tarifli” interfeysə malikdir.

Bağlama parametrlərini qurmaq üçün motivasiya ondan ibarətdir ki, mənim ISP qeyri-sabit DNS serveri təmin edir və google da bəzən uğursuz olur. Mən şəxsi istifadə üçün sabit DNS server istəyirəm.

Məqalə yazmaq üçün motivasiya - 10 ay əvvəl qaralama yazmışdım və artıq ona iki dəfə baxmışam. Müəllifin buna müntəzəm ehtiyacı olsa belə, başqalarının da buna ehtiyac duyma ehtimalı yüksəkdir.

Poçt serveri üçün universal həll yoxdur. Amma mən “bunu et, sonra hər şey lazım olduğu kimi işlədikdə, əlavə əşyaları at” kimi bir şey yazmağa çalışacağam.

tech.ru şirkətində Colocation server var. OVH, Hetzner, AWS ilə müqayisə etmək olar. Bu problemi həll etmək üçün tech.ru ilə əməkdaşlıq daha səmərəli olacaq.

Debian 9 serverdə quraşdırılıb.

Serverdə 'eno2' və 'eno1' 2 interfeys var. Birincisi qeyri-məhdud, ikincisi isə müvafiq olaraq sürətlidir.

`eno3` interfeysində XX.XX.XX.X0 və XX.XX.XX.X1 və XX.XX.XX.X2 və `eno1` interfeysində XX.XX.XX.X5 olmaqla 2 statik IP ünvanı var. .

Mövcud XXXX:XXXX:XXXX:XXXX::/64 `eno6` interfeysinə təyin edilmiş IPv1 ünvanları hovuzu və ondan XXXX:XXXX:XXXX:XXXX:1:2::/96 mənim xahişimlə `eno2`-yə təyin edildi.

'domain3.com', 'domain1.com', 'domain2.com' 3 domen var. `domain1.com` və `domain3.com` üçün SSL sertifikatı var.

Poçt qutumu əlaqələndirmək istədiyim Google hesabım var[e-poçt qorunur]` (poçtun qəbulu və birbaşa gmail interfeysindən poçt göndərilməsi).
Poçt qutusu olmalıdır`[e-poçt qorunur]`, gmail-də görmək istədiyim e-poçtun surəti. Və ` adından bir şey göndərə bilmək nadir hallarda olur[e-poçt qorunur]` veb interfeysi vasitəsilə.

Poçt qutusu olmalıdır`[e-poçt qorunur]`, İvanovun iPhone-dan istifadə edəcəyi.

Göndərilən e-poçtlar bütün müasir antispam tələblərinə uyğun olmalıdır.
İctimai şəbəkələrdə təmin edilən şifrələmənin ən yüksək səviyyəsi olmalıdır.
Həm məktubların göndərilməsi, həm də alınması üçün IPv6 dəstəyi olmalıdır.
E-poçtları heç vaxt silməyəcək bir SpamAssassin olmalıdır. Və ya sıçrayacaq, ya keçəcək və ya IMAP “Spam” qovluğuna göndəriləcək.
SpamAssassin avtomatik öyrənmə konfiqurasiya edilməlidir: məktubu Spam qovluğuna köçürsəm, o, bundan öyrənəcək; Mən Spam qovluğundan məktubu köçürsəm, bundan öyrənəcək. SpamAssassin təliminin nəticələri məktubun Spam qovluğuna daxil olub-olmamasına təsir göstərməlidir.
PHP skriptləri verilmiş serverdə istənilən domen adından poçt göndərə bilməlidir.
IPv6 olmayan müştəridə IPv6-dan istifadə etmək imkanı olan openvpn xidməti olmalıdır.

Əvvəlcə IPv6 daxil olmaqla interfeysləri və marşrutlaşdırmanı konfiqurasiya etməlisiniz.
Sonra IPv4 vasitəsilə qoşulacaq və müştərini statik-real IPv6 ünvanı ilə təmin edəcək OpenVPN-i konfiqurasiya etməlisiniz. Bu müştəri serverdəki bütün IPv6 xidmətlərinə və İnternetdəki istənilən IPv6 resurslarına çıxış əldə edəcək.
Sonra Postfix-i məktublar + SPF + DKIM + rDNS və digər oxşar kiçik şeyləri göndərmək üçün konfiqurasiya etməlisiniz.
Sonra Dovecot-u konfiqurasiya etməli və Multidomain-i konfiqurasiya etməlisiniz.
Sonra SpamAssassin-i konfiqurasiya etməli və təlimi konfiqurasiya etməlisiniz.
Nəhayət, Bind-i quraşdırın.

============= Çox interfeysli =============

İnterfeysləri konfiqurasiya etmək üçün bunu “/etc/network/interfaces” bölməsinə yazmalısınız.

# 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

Bu parametrlər tech.ru-da istənilən serverdə tətbiq oluna bilər (dəstəklə bir az koordinasiya ilə) və o, lazım olduğu kimi dərhal işləyəcək.

Hetzner, OVH üçün oxşar şeylər qurmaq təcrübəniz varsa, orada fərqlidir. Daha çətin.

eno1 №1 şəbəkə kartının adıdır (yavaş, lakin məhdudiyyətsiz).
eno2 №2 şəbəkə kartının adıdır (sürətli, lakin tarifli).
tun0 OpenVPN-dən virtual şəbəkə kartının adıdır.
XX.XX.XX.X0 - eno4-də IPv1 #1.
XX.XX.XX.X1 - eno4-də IPv2 #1.
XX.XX.XX.X2 - eno4-də IPv3 #1.
XX.XX.XX.X5 - eno4-də IPv1 #2.
XX.XX.XX.1 - IPv4 şlüzü.
XXXX:XXXX:XXXX:XXXX::/64 - Bütün server üçün IPv6.
XXXX:XXXX:XXXX:XXXX:1:2::/96 - eno6 üçün IPv2, kənardan qalan hər şey eno1-ə keçir.
XXXX:XXXX:XXXX:XXXX::1 — IPv6 şlüz (qeyd etmək lazımdır ki, bu, fərqli şəkildə edilə bilər/edilməməlidir. IPv6 keçidini göstərin).
dns-nameservers - 127.0.0.1 göstərilir (bağlama yerli olaraq quraşdırıldığı üçün) və 213.248.1.6 (bu tech.ru saytındandır).

“table eno1t” və “table eno2t” - bu marşrut-qaydaların mənası ondan ibarətdir ki, eno1 -> vasitəsilə daxil olan trafik oradan çıxacaq, eno2 -> vasitəsilə daxil olan trafik isə oradan çıxacaq. Həmçinin server tərəfindən başlanan bağlantılar eno1-dən keçəcək.

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

Bu əmrlə biz müəyyən edirik ki, “table eno1t” -> işarələnmiş hər hansı bir qaydaya düşən hər hansı anlaşılmaz trafik eno1 interfeysinə göndərilməlidir.

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

Bu əmrlə server tərəfindən başlanan hər hansı trafikin eno1 interfeysinə yönəldilməsini müəyyən edirik.

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

Bu əmrlə biz trafikin işarələnməsi qaydalarını təyin edirik.

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

Bu blok eno4 interfeysi üçün ikinci IPv1 təyin edir.

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

Bu əmrlə biz OpenVPN müştərilərindən XX.XX.XX.X4 istisna olmaqla yerli IPv0-ə marşrutu təyin etdik.
Bu əmrin bütün IPv4 üçün niyə kifayət etdiyini hələ də anlamıram.

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

Bu, interfeysin özü üçün ünvanı təyin etdiyimiz yerdir. Server onu "gediş" ünvanı kimi istifadə edəcək. Yenidən heç bir şəkildə istifadə olunmayacaq.

":1:1::" niyə belə mürəkkəbdir? Beləliklə, OpenVPN düzgün işləyir və yalnız bunun üçün. Bu haqda daha sonra.

Şluz mövzusunda - bu belə işləyir və yaxşıdır. Ancaq düzgün yol, serverin qoşulduğu keçidin IPv6-nı burada göstərməkdir.

Ancaq bunu etsəm nədənsə IPv6 işləməyi dayandırır. Bu, yəqin ki, bir növ tech.ru problemidir.

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

Bu, interfeysə bir IPv6 ünvanı əlavə edir. Əgər sizə yüz ünvan lazımdırsa, bu, bu faylda yüz sətir deməkdir.

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

Bunu aydınlaşdırmaq üçün bütün interfeyslərin ünvanlarını və alt şəbəkələrini qeyd etdim.
eno1 - olmalıdır "/64" - çünki bu, bizim bütün ünvan hovuzumuzdur.
tun0 - alt şəbəkə eno1-dən böyük olmalıdır. Əks halda, OpenVPN müştəriləri üçün IPv6 şlüzünü konfiqurasiya etmək mümkün olmayacaq.
eno2 - alt şəbəkə tun0-dan böyük olmalıdır. Əks halda, OpenVPN müştəriləri yerli IPv6 ünvanlarına daxil ola bilməyəcəklər.
Aydınlıq üçün mən 16 alt şəbəkə addımını seçdim, lakin istəsəniz, hətta “1” addımı da edə bilərsiniz.
Müvafiq olaraq, 64+16 = 80 və 80+16 = 96.

Daha da aydınlıq üçün:
XXXX:XXXX:XXXX:XXXX:1:1:YYYY:YYYY eno1 interfeysində xüsusi saytlara və ya xidmətlərə təyin edilməli olan ünvanlardır.
XXXX:XXXX:XXXX:XXXX:1:2:YYYY:YYYY eno2 interfeysində xüsusi saytlara və ya xidmətlərə təyin edilməli olan ünvanlardır.
XXXX:XXXX:XXXX:XXXX:1:3:YYYY:YYYY OpenVPN müştərilərinə təyin edilməli və ya OpenVPN xidmət ünvanları kimi istifadə edilməli ünvanlardır.

Şəbəkəni konfiqurasiya etmək üçün serveri yenidən işə salmaq mümkün olmalıdır.
IPv4 dəyişiklikləri icra edildikdə qəbul edilir (onu ekrana bükməyi unutmayın - əks halda bu əmr sadəcə serverdəki şəbəkəni çökdürəcək):

/etc/init.d/networking restart

“/etc/iproute2/rt_tables” faylının sonuna əlavə edin:

100 eno1t
101 eno2t

Bu olmadan siz “/etc/network/interfaces” faylında xüsusi cədvəllərdən istifadə edə bilməzsiniz.
Rəqəmlər unikal və 65535-dən kiçik olmalıdır.

IPv6 dəyişiklikləri yenidən yükləmədən asanlıqla edilə bilər, lakin bunun üçün ən azı üç əmri öyrənməlisiniz:

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

"/etc/sysctl.conf" parametrləri

# 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

Bunlar mənim serverimin "sysctl" parametrləridir. Bir vacib şeyi qeyd edim.

net.ipv4.ip_forward = 1

Bu olmadan, OpenVPN ümumiyyətlə işləməyəcək.

net.ipv6.ip_nonlocal_bind = 1

İnterfeys açıldıqdan dərhal sonra IPv6-nı (məsələn, nginx) bağlamağa çalışan hər kəs xəta alacaq. Bu ünvan mövcud deyil.

Belə bir vəziyyətin qarşısını almaq üçün belə bir parametr edilir.

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

Bu IPv6 parametrləri olmadan, OpenVPN müştərisindən gələn trafik dünyaya çıxmır.

Digər parametrlər ya uyğun deyil, ya da nə üçün olduğunu xatırlamıram.
Ancaq hər halda, onu "olduğu kimi" buraxıram.

Bu fayldakı dəyişikliklərin serveri yenidən başlatmadan götürülməsi üçün əmri yerinə yetirməlisiniz:

sysctl -p

"Cədvəl" qaydaları haqqında ətraflı məlumat: habr.com/post/108690

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

OpenVPN IPv4 iptables olmadan işləmir.

Mənim iptables VPN üçün belədir:

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 yerli maşının statik IPv4 ünvanıdır.
10.8.0.0/24 - IPv4 openvpn şəbəkəsi. Openvpn müştəriləri üçün IPv4 ünvanları.
Qaydaların ardıcıllığı vacibdir.

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

Bu, yalnız mən statik IP-dən OpenVPN-dən istifadə edə biləcəyim bir məhdudiyyətdir.

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 müştəriləri və İnternet arasında IPv4 paketlərini yönləndirmək üçün bu əmrlərdən birini qeydiyyatdan keçirməlisiniz.

Fərqli hallar üçün variantlardan biri uyğun deyil.
Hər iki əmr mənim işimə uyğundur.
Sənədləri oxuduqdan sonra daha az CPU istifadə etdiyi üçün birinci variantı seçdim.

Yenidən başladıqdan sonra bütün iptables parametrlərinin götürülməsi üçün onları bir yerdə saxlamaq lazımdır.

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

Belə adlar təsadüfən seçilməyib. Onlar "iptables-persistent" paketi tərəfindən istifadə olunur.

apt-get install iptables-persistent

Əsas OpenVPN paketinin quraşdırılması:

apt-get install openvpn easy-rsa

Sertifikatlar üçün şablon quraq (dəyərlərinizi əvəz edin):

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

Sertifikat şablonunun parametrlərini redaktə edək:

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

Server sertifikatı yaradın:

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

Son “client-name.opvn” fayllarını yaratmaq qabiliyyətini hazırlayaq:

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

Bütün faylları bir opvn faylına birləşdirəcək bir skript hazırlayaq.

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

İlk OpenVPN müştərisinin yaradılması:

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

“~/client-configs/files/client-name.ovpn” faylı müştərinin cihazına göndərilir.

iOS müştəriləri üçün aşağıdakı hiylələri etməlisiniz:
"tls-auth" teqinin məzmunu şərhsiz olmalıdır.
Həm də “tls-auth” teqindən dərhal əvvəl “açar istiqamət 1” qoyun.

OpenVPN server konfiqurasiyasını konfiqurasiya edək:

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

Bu, hər bir müştəri üçün statik ünvan təyin etmək üçün lazımdır (lazım deyil, amma istifadə edirəm):

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

Ən çətin və əsas detal.

Təəssüf ki, OpenVPN hələ müştərilər üçün IPv6 şlüzünü müstəqil olaraq necə konfiqurasiya edəcəyini bilmir.
Bunu hər bir müştəri üçün “əl ilə” ötürməlisiniz.

# 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” faylı:

#!/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” faylı:

#!/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

Hər iki skript “/etc/openvpn/variables” faylından istifadə edir:

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

Niyə belə yazıldığını xatırlamaqda çətinlik çəkirəm.

İndi şəbəkə maskası = 112 qəribə görünür (orada 96 olmalıdır).
Və prefiks qəribədir, tun0 şəbəkəsinə uyğun gəlmir.
Amma yaxşı, mən onu olduğu kimi buraxacağam.

cipher DES-EDE3-CBC

Bu hər kəs üçün deyil - mən əlaqəni şifrələmənin bu üsulunu seçdim.

OpenVPN IPv4 quraşdırma haqqında ətraflı məlumat əldə edin.

OpenVPN IPv6 quraşdırma haqqında ətraflı məlumat əldə edin.

============= Postfiks =============

Əsas paketin quraşdırılması:

apt-get install postfix

Quraşdırarkən "internet saytı" seçin.

Mənim "/etc/postfix/main.cf" belə görünür:

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

Bu konfiqurasiyanın təfərrüatlarına baxaq.

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

Xabrovsk sakinlərinin sözlərinə görə, bu blokda “yanlış məlumat və yanlış tezislər” var.Karyeram başlayandan cəmi 8 il sonra SSL-in necə işlədiyini anlamağa başladım.

Buna görə də, mən SSL-dən necə istifadə edəcəyimi təsvir etmək azadlığından istifadə edəcəyəm (“Bu necə işləyir?” və “Niyə işləyir?” Suallarına cavab vermədən).

Müasir şifrələmənin əsasını açar cütünün (iki çox uzun simvol sətirinin) yaradılması təşkil edir.

Bir “açar” özəldir, digər açar isə “ictimai”dir. Şəxsi açarı çox diqqətlə gizli saxlayırıq. Açıq açarı hər kəsə paylayırıq.

Açıq açardan istifadə edərək, mətn sətirini şifrələyə bilərsiniz ki, yalnız şəxsi açarın sahibi onu deşifrə edə bilsin.
Bax, texnologiyanın bütün əsası budur.

Addım №1 - https saytları.
Sayta daxil olarkən brauzer veb serverdən saytın https olduğunu öyrənir və buna görə də açıq açar tələb edir.
Veb server açıq açarı verir. Brauzer http sorğusunu şifrələmək və göndərmək üçün açıq açardan istifadə edir.
Http-sorğunun məzmununu yalnız şəxsi açarı olanlar, yəni sorğunun edildiyi server oxuya bilər.
Http sorğusu ən azı URI ehtiva edir. Buna görə də, əgər bir ölkə bütün sayta deyil, konkret səhifəyə girişi məhdudlaşdırmağa çalışırsa, https saytları üçün bunu etmək mümkün deyil.

Addım №2 - şifrələnmiş cavab.
Veb server yolda asanlıqla oxuna bilən cavab verir.
Həll olduqca sadədir - brauzer yerli olaraq hər https saytı üçün eyni şəxsi-ictimai açar cütünü yaradır.
Saytın açıq açarı üçün sorğu ilə yanaşı, yerli açıq açarını da göndərir.
Veb server onu xatırlayır və http-cavab göndərərkən onu konkret müştərinin açıq açarı ilə şifrələyir.
İndi http-cavab yalnız müştərinin brauzerinin şəxsi açarının sahibi (yəni müştərinin özü) tərəfindən deşifrə edilə bilər.

Addım №3 - ictimai kanal vasitəsilə təhlükəsiz əlaqənin qurulması.
Nömrə 2-də zəiflik var - heç bir şey xeyirxahların http sorğusunu ələ keçirməsinə və açıq açar haqqında məlumatı redaktə etməyə mane olmur.
Beləliklə, vasitəçi rabitə kanalı dəyişənə qədər göndərilən və qəbul edilən mesajların bütün məzmununu aydın görəcək.
Bununla məşğul olmaq olduqca sadədir - sadəcə brauzerin açıq açarını veb serverin açıq açarı ilə şifrələnmiş mesaj kimi göndərin.
Daha sonra veb server əvvəlcə “ictimai açarınız belədir” kimi bir cavab göndərir və bu mesajı eyni açıq açarla şifrələyir.
Brauzer cavaba baxır - əgər "ictimai açarınız belədir" mesajı alınarsa, bu, bu rabitə kanalının təhlükəsiz olduğuna 100% zəmanətdir.
Nə qədər təhlükəsizdir?
Belə təhlükəsiz rabitə kanalının yaradılmasının özü ping*2 sürətində baş verir. Məsələn, 20ms.
Təcavüzkar əvvəlcədən tərəflərdən birinin şəxsi açarına sahib olmalıdır. Və ya bir neçə millisaniyə ərzində şəxsi açar tapın.
Bir müasir şəxsi açarın sındırılması superkompüterdə onilliklər çəkəcək.

Addım №4 - açıq açarların ictimai verilənlər bazası.
Aydındır ki, bütün bu hekayədə təcavüzkarın müştəri ilə server arasındakı əlaqə kanalında oturmaq imkanı var.
Müştəri özünü server, server isə müştəri kimi göstərə bilər. Və hər iki istiqamətdə bir cüt düyməni təqlid edin.
Sonra təcavüzkar bütün trafiki görəcək və trafiki "redaktə" edə biləcək.
Məsələn, pulun göndəriləcəyi ünvanı dəyişdirin və ya onlayn bankçılıqdan parolun surətini çıxarın və ya "qeyri-qanuni" məzmunu bloklayın.
Bu cür təcavüzkarlarla mübarizə aparmaq üçün hər https saytı üçün açıq açarları olan ictimai verilənlər bazası hazırladılar.
Hər bir brauzer 200-ə yaxın belə verilənlər bazasının mövcudluğu haqqında “bilir”. Bu, hər bir brauzerdə əvvəlcədən quraşdırılmış şəkildə gəlir.
“Bilik” hər bir sertifikatdan açıq açarla dəstəklənir. Yəni, hər bir xüsusi sertifikatlaşdırma orqanı ilə əlaqə saxtalaşdırıla bilməz.

İndi https üçün SSL-dən necə istifadə olunacağına dair sadə bir anlayış var.
Beyninizdən istifadə etsəniz, xüsusi xidmət orqanlarının bu strukturda nəyisə necə sındıra biləcəyi bəlli olacaq. Ancaq bu, onlara böyük səylər bahasına başa gələcək.
Və NSA və ya CIA-dan kiçik olan təşkilatlar - hətta VIP-lər üçün mövcud qorunma səviyyəsini sındırmaq demək olar ki, mümkün deyil.

Ssh əlaqələri haqqında da əlavə edəcəyəm. Orada açıq açarlar yoxdur, bəs siz nə edə bilərsiniz? Problem iki yolla həll olunur.
Seçim ssh-by-parol:
İlk qoşulma zamanı ssh müştərisi xəbərdar etməlidir ki, ssh serverindən yeni açıq açarımız var.
Sonrakı bağlantılar zamanı “ssh serverindən yeni açıq açar” xəbərdarlığı görünsə, bu, onların sizi dinləməyə çalışdıqları anlamına gələcək.
Yaxud ilk əlaqənizdə dinlənildiniz, amma indi serverlə vasitəçisiz əlaqə saxlayırsınız.
Əslində, telefon dinləmə faktının asanlıqla, tez və səy göstərmədən aşkarlanması səbəbindən bu hücum yalnız konkret müştəri üçün xüsusi hallarda istifadə olunur.

Seçim ssh-by-key:
Bir flash sürücü götürürük, üzərinə ssh serveri üçün şəxsi açar yazırıq (bunun üçün şərtlər və bir çox vacib nüanslar var, amma istifadə üçün təlimatlar deyil, təhsil proqramı yazıram).
Açıq açarı ssh müştərisinin olacağı maşında buraxırıq və onu da gizli saxlayırıq.
Fləş sürücünü serverə gətiririk, daxil edirik, şəxsi açarı kopyalayırıq və flash sürücüyü yandırırıq və külünü küləyə səpələyirik (ya da heç olmasa sıfırlarla formatlaşdırırıq).
Hamısı budur - belə bir əməliyyatdan sonra belə bir ssh bağlantısını sındırmaq mümkün olmayacaq. Əlbəttə ki, 10 ildən sonra bir superkompüterdə trafikə baxmaq mümkün olacaq - amma bu başqa hekayədir.

Offtopik üçün üzr istəyirəm.

Beləliklə, indi nəzəriyyə məlumdur. Mən sizə SSL sertifikatının yaradılması prosesi haqqında məlumat verəcəyəm.

“Openssl genrsa” istifadə edərək biz şəxsi açar və açıq açar üçün “boşluqlar” yaradırıq.
Biz “blankları” üçüncü tərəf şirkətinə göndəririk, ona ən sadə sertifikat üçün təxminən 9 dollar ödəyirik.

Bir neçə saatdan sonra biz bu üçüncü tərəf şirkətindən “ictimai” açarımızı və bir neçə açıq açar dəstini alırıq.

Nə üçün üçüncü tərəf şirkəti mənim açıq açarımın qeydiyyatı üçün pul ödəməlidir, ayrı bir sualdır, biz bunu burada nəzərdən keçirməyəcəyik.

İndi yazının mənasının nə olduğu aydın oldu:

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

“/etc/ssl” qovluğunda ssl problemləri üçün bütün fayllar var.
domain1.com — domen adı.
2018-ci il əsas yaradılış ilidir.
"açar" - faylın şəxsi açar olduğunu göstərən təyinat.

Və bu faylın mənası:

smtpd_tls_cert_file=/etc/ssl/domain1.com.2018.chained.crt
domain1.com — domen adı.
2018-ci il əsas yaradılış ilidir.
zəncirlənmiş - açıq açarlar zəncirinin olduğunu göstərən təyinat (birincisi açıq açarımızdır, qalanları isə açıq açarı verən şirkətdən gələnlərdir).
crt - hazır sertifikatın olduğunu göstərən işarə (texniki izahatları olan açıq açar).

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

Bu parametr bu halda istifadə edilmir, lakin nümunə kimi yazılır.

Çünki bu parametrdə olan xəta serverinizdən (sizin istəyiniz olmadan) spam göndərilməsinə səbəb olacaq.

Sonra hər kəsə sübut et ki, sən günahkar deyilsən.

recipient_delimiter = +

Çox adam bilmir, lakin bu, e-poçtların sıralanması üçün standart xarakterdir və əksər müasir poçt serverləri tərəfindən dəstəklənir.

Məsələn, poçt qutunuz varsa "[e-poçt qorunur]"göndərməyə çalışın"[e-poçt qorunur]"- görün nə çıxır.

inet_protocols = ipv4

Bu çaşdırıcı ola bilər.

Amma bu sadəcə olaraq belə deyil. Hər yeni domen standart olaraq yalnız IPv4-dür, sonra hər biri üçün ayrıca IPv6-nı yandırıram.

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

Burada bütün daxil olan məktubların göyərçinlərə getdiyini qeyd edirik.
Və domen, poçt qutusu, ləqəb qaydaları - verilənlər bazasına baxın.

/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

İndi postfiks bilir ki, poçt yalnız dovecot ilə avtorizasiyadan sonra sonrakı göndərilmək üçün qəbul edilə bilər.

Bunun niyə burada təkrarlandığını həqiqətən başa düşə bilmirəm. Biz artıq “virtual_nəqliyyat”da lazım olan hər şeyi qeyd etmişik.

Ancaq postfiks sistemi çox köhnədir - yəqin ki, bu, köhnə günlərdən bir geri dönüşdür.

smtpd_recipient_restrictions =
        ...

smtpd_helo_restrictions =
        ...

smtpd_client_restrictions =
        ...

Bu, hər bir poçt serveri üçün fərqli şəkildə konfiqurasiya edilə bilər.

Mənim ixtiyarımda 3 poçt serverim var və bu parametrlər müxtəlif istifadə tələblərinə görə çox fərqlidir.

Siz onu diqqətlə konfiqurasiya etməlisiniz - əks halda spam sizə daxil olacaq və ya daha da pisi - sizdən spam çıxacaq.

# SPF
policyd-spf_time_limit = 3600

Daxil olan məktubların SPF-nin yoxlanılması ilə bağlı bəzi plaginlərin qurulması.

# 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

Parametr ondan ibarətdir ki, biz bütün gedən e-poçtlarla DKIM imzası təqdim etməliyik.

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

Bu, PHP skriptlərindən məktublar göndərərkən məktubların yönləndirilməsində əsas detaldır.

“/etc/postfix/sdd_transport.pcre” faylı:

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

Solda müntəzəm ifadələr var. Sağda məktubu qeyd edən bir etiket var.
Etiketə uyğun olaraq postfix - müəyyən bir məktub üçün daha bir neçə konfiqurasiya xəttini nəzərə alacaq.

Müəyyən bir məktub üçün postfiksin dəqiq necə yenidən konfiqurasiya ediləcəyi “master.cf”də göstəriləcək.

4, 5, 6-cı sətirlər əsasdır. Məktubu hansı domen adından göndəririk, bu etiketi qoyuruq.
Ancaq köhnə kodda PHP skriptlərində “from” sahəsi həmişə göstərilmir. Sonra istifadəçi adı xilasetmə üçün gəlir.

Məqalə artıq genişdir - nginx+fpm qurmaqla diqqətimi yayındırmaq istəməzdim.

Qısaca olaraq, hər bir sayt üçün öz linux-istifadəçi sahibini təyin edirik. Və müvafiq olaraq fpm hovuzunuz.

Fpm-pool php-nin istənilən versiyasından istifadə edir (eyni serverdə php-nin müxtəlif versiyalarını və hətta qonşu saytlar üçün müxtəlif php.ini-ni problemsiz istifadə edə bildiyiniz zaman əladır).

Beləliklə, xüsusi linux istifadəçisi “www-domain2” domain2.com veb-saytına malikdir. Bu saytda e-məktubların From sahəsini göstərmədən göndərilməsi üçün kod var.

Belə ki, bu halda belə məktublar düzgün göndəriləcək və heç vaxt spama düşməyəcək.

Mənim "/etc/postfix/master.cf" belə görünür:

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

Fayl tam təqdim edilməyib - o, artıq çox böyükdür.
Mən yalnız nəyin dəyişdiyini qeyd etdim.

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}

Bunlar daha sonra spamassasin ilə əlaqəli parametrlərdir.

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

Biz sizə 587 portu vasitəsilə poçt serverinə qoşulmağa icazə veririk.
Bunu etmək üçün daxil olmalısınız.

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

SPF yoxlamasını aktivləşdirin.

apt-get install postfix-policyd-spf-python

Yuxarıdakı SPF yoxlamaları üçün paketi quraşdıraq.

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

Və ən maraqlısı da budur. Bu, müəyyən bir IPv4/IPv6 ünvanından müəyyən bir domen üçün məktublar göndərmək imkanıdır.

Bu rDNS xatirinə edilir. rDNS IP ünvanı ilə sətir qəbul etmə prosesidir.
Və poçt üçün bu xüsusiyyət helo-nun e-poçtun göndərildiyi ünvanın rDNS ilə tam uyğun olduğunu təsdiqləmək üçün istifadə olunur.

Helo məktubun göndərildiyi e-poçt domeninə uyğun gəlmirsə, spam xalları verilir.

Helo rDNS ilə uyğun gəlmir - çoxlu spam xalları verilir.
Müvafiq olaraq, hər bir domenin öz IP ünvanı olmalıdır.
OVH üçün - konsolda rDNS təyin etmək mümkündür.
tech.ru üçün - məsələ dəstək vasitəsilə həll olunur.
AWS üçün problem dəstək vasitəsilə həll edilir.
“inet_protocols” və “smtp_bind_address6” - biz IPv6 dəstəyini işə salırıq.
IPv6 üçün siz həmçinin rDNS-ni qeydiyyatdan keçirməlisiniz.
“syslog_name” - və bu, qeydləri oxumaq asanlığı üçündür.

Sertifikatlar alın Mən burada tövsiyə edirəm.

Burada postfix+dovecot linki qurulur.

SPF təyini.

============= Göyərçin =============

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

MySQL-in qurulması, paketlərin özlərinin quraşdırılması.

Fayl "/etc/dovecot/conf.d/10-auth.conf"

disable_plaintext_auth = yes
auth_mechanisms = plain login

Avtorizasiya yalnız şifrələnir.

Fayl "/etc/dovecot/conf.d/10-mail.conf"

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

Burada hərflərin saxlanma yerini göstəririk.

Mən onların fayllarda saxlanmasını və domenə görə qruplaşdırılmasını istəyirəm.

Fayl "/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 {
  }
}

Bu əsas göyərçin konfiqurasiya faylıdır.
Burada təminatsız əlaqələri söndürürük.
Və təhlükəsiz əlaqələri aktivləşdirin.

Fayl "/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 qurulması. Biz ssl tələb olunduğunu bildiririk.
Və sertifikatın özü. Və vacib bir detal “yerli” direktivdir. Hansı yerli IPv4-ə qoşulduqda hansı SSL sertifikatının istifadə olunacağını göstərir.

Yeri gəlmişkən, IPv6 burada konfiqurasiya edilməyib, bu səhvi sonra düzəldəcəm.
XX.XX.XX.X5 (domen2) - sertifikat yoxdur. Müştəriləri birləşdirmək üçün domain1.com ünvanını göstərməlisiniz.
XX.XX.XX.X2 (domen3) - sertifikat var, müştəriləri birləşdirmək üçün domain1.com və ya domain3.com ünvanını təyin edə bilərsiniz.

Fayl "/etc/dovecot/conf.d/15-lda.conf"

protocol lda {
  mail_plugins = $mail_plugins sieve
}

Bu, gələcəkdə spamassassin üçün lazım olacaq.

Fayl "/etc/dovecot/conf.d/20-imap.conf"

protocol imap {
  mail_plugins = $mail_plugins antispam
}

Bu antispam plaginidir. “Spam” qovluğuna/qovluğuna köçürmə zamanı spamassasin təlimi üçün lazımdır.

Fayl "/etc/dovecot/conf.d/20-pop3.conf"

protocol pop3 {
}

Sadəcə belə bir fayl var.

Fayl "/etc/dovecot/conf.d/20-lmtp.conf"

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

Lmtp-nin qurulması.

Fayl "/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
}

Spam qovluğuna/qovluğundan köçürmə zamanı Spamassasin təlim parametrləri.

Fayl "/etc/dovecot/conf.d/90-sieve.conf"

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

Gələn hərflərlə nə edəcəyini müəyyən edən fayl.

Fayl "/var/lib/dovecot/sieve/default.sieve"

require ["fileinto", "mailbox"];

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

Siz faylı tərtib etməlisiniz: “sievec default.sieve”.

Fayl "/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
}

Avtorizasiya üçün sql fayllarının təyin edilməsi.
Və faylın özü avtorizasiya metodu kimi istifadə olunur.

Fayl "/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';

Bu, postfiks üçün oxşar parametrlərə uyğundur.

Fayl "/etc/dovecot/dovecot.conf"

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

Əsas konfiqurasiya faylı.
Əsas odur ki, biz burada qeyd edirik - protokollar əlavə edin.

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

apt-get install spamassassin spamc

Gəlin paketləri quraşdıraq.

adduser spamd --disabled-login

Onun adından istifadəçi əlavə edək.

systemctl enable spamassassin.service

Yüklədikdə avtomatik yükləmə spamassassin xidmətini işə salırıq.

Fayl "/etc/default/spamassassin":

CRON=1

Qaydaların "standart olaraq" avtomatik yenilənməsini aktivləşdirməklə.

“/etc/spamassassin/local.cf” faylı:

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-də “sa” istifadəçisi ilə “parol” parolu ilə “sa” verilənlər bazası yaratmalısınız (adekvat bir şeylə əvəz edin).

report_safe - bu məktub əvəzinə spam e-poçt hesabatı göndərəcək.
use_bayes spamassassin maşın öyrənmə parametrləridir.

Qalan spamassassin parametrləri məqalənin əvvəlində istifadə edilmişdir.

Ümumi parametr "spamassassin".
Yeni Spam e-poçtlarının IMAP “Spam” qovluğuna köçürülməsi haqqında.
Dovecot + SpamAssassin-in sadə birləşməsi haqqında.
İmap qovluqlarında hərfləri köçürərkən spamassasin öyrənmə nəzəriyyəsini oxumağı məsləhət görürəm (və ondan istifadə etməyi məsləhət görmürəm).

============= İcmaya müraciət =============

Mən də cəmiyyətə göndərilən məktubların təhlükəsizlik səviyyəsini necə artırmaq barədə bir fikir atmaq istərdim. Çünki mən poçt mövzusuna çox qərq olmuşam.

Beləliklə, istifadəçi öz müştərisində bir cüt açar yarada bilər (outlook, thunderbird, browser-plugin, ...). İctimai və özəl. İctimai - DNS-ə göndərin. Şəxsi - müştəriyə qənaət edin. Poçt serverləri müəyyən bir alıcıya göndərmək üçün açıq açardan istifadə edə bilər.

Və belə məktublarla spamdan qorunmaq üçün (bəli, poçt serveri məzmuna baxa bilməyəcək) - 3 qaydanı təqdim etməlisiniz:

  1. Məcburi real DKIM imzası, məcburi SPF, məcburi rDNS.
  2. Antispam təlimi mövzusunda neyron şəbəkəsi + müştəri tərəfində bunun üçün verilənlər bazası.
  3. Şifrələmə alqoritmi elə olmalıdır ki, göndərən tərəf qəbul edən tərəfə nisbətən şifrələmə üçün 100 dəfə çox CPU gücünü sərf etməlidir.

İctimai məktublara əlavə olaraq, “təhlükəsiz yazışmalara başlamaq üçün” standart təklif məktubu hazırlayın. İstifadəçilərdən biri (poçt qutusu) başqa bir poçt qutusuna əlavə ilə məktub göndərir. Məktubda yazışmalar üçün təhlükəsiz rabitə kanalının işə salınması və poçt qutusu sahibinin açıq açarı (müştəri tərəfində gizli açar ilə) üçün mətn təklifi var.

Hətta hər yazışma üçün xüsusi olaraq bir neçə açar edə bilərsiniz. Alıcı istifadəçi bu təklifi qəbul edə və açıq açarını göndərə bilər (həmçinin bu yazışma üçün xüsusi hazırlanmışdır). Sonra, birinci istifadəçi xidmətə nəzarət məktubu göndərir (ikinci istifadəçinin açıq açarı ilə şifrələnmişdir) - onu aldıqdan sonra ikinci istifadəçi formalaşmış rabitə kanalını etibarlı hesab edə bilər. Sonra ikinci istifadəçi nəzarət məktubu göndərir - və sonra birinci istifadəçi də formalaşmış kanalı təhlükəsiz hesab edə bilər.

Yolda açarların tutulması ilə mübarizə aparmaq üçün protokol bir flash sürücüdən istifadə edərək ən azı bir açıq açarın ötürülməsi imkanını təmin etməlidir.

Ən əsası isə odur ki, hamısı işləyir (sual "bunun pulunu kim ödəyəcək?"):
10 il üçün 3 dollardan başlayan poçt sertifikatlarını daxil edin. Bu, göndərənə DNS-də "mənim ictimai açarlarımın orada olduğunu" göstərməsinə imkan verəcəkdir. Və onlar sizə təhlükəsiz əlaqəyə başlamaq imkanı verəcəklər. Eyni zamanda, bu cür əlaqələri qəbul etmək pulsuzdur.
gmail nəhayət istifadəçilərini pul qazanır. 10 ildə 3 dollara - təhlükəsiz yazışma kanalları yaratmaq hüququ.

============= Nəticə =============

Bütün məqaləni sınamaq üçün bir ay müddətinə xüsusi server icarəyə götürüb SSL sertifikatı olan bir domen alacaqdım.

Amma həyat şəraiti belə inkişaf etdi ki, bu məsələ 2 ay uzandı.
Beləliklə, yenidən boş vaxtım olanda, nəşrin daha bir il uzanması riskinə düşməkdənsə, məqaləni olduğu kimi dərc etmək qərarına gəldim.

Əgər “lakin bu kifayət qədər təfərrüatlı şəkildə təsvir olunmayıb” kimi kifayət qədər çox suallar varsa, o zaman yeni domen və yeni SSL sertifikatı olan xüsusi server götürmək və onu daha ətraflı təsvir etmək və daha çoxunu təsvir etmək gücü olacaq. ən əsası, bütün çatışmayan vacib detalları müəyyənləşdirin.

Mən həmçinin poçt sertifikatları haqqında fikirlər haqqında rəy almaq istərdim. İdeyanı bəyənirsinizsə, rfc üçün qaralama yazmaq üçün güc tapmağa çalışacağam.

Məqalənin böyük hissələrini köçürərkən bu məqaləyə keçid verin.
Hər hansı digər dilə tərcümə edərkən bu məqaləyə keçid verin.
Mən bunu ingilis dilinə özüm tərcümə etməyə və çarpaz istinadlar buraxmağa çalışacağam.


Mənbə: www.habr.com

Добавить комментарий