Debian + Postfix + Dovecot + Çoklu Alan Adı + SSL + IPv6 + OpenVPN + Çoklu Arayüzler + SpamAssassin-learn + Bind

Bu makale modern bir posta sunucusunun nasıl kurulacağıyla ilgilidir.
Postfix + Güvercin. SPF + DKIM + rDNS. IPv6 ile.
TSL şifrelemesi ile. Birden fazla alan adı desteğiyle - gerçek bir SSL sertifikasına katılın.
Antispam koruması ve diğer posta sunucularından gelen yüksek antispam derecelendirmesi ile.
Birden fazla fiziksel arayüzü destekler.
Bağlantı IPv4 üzerinden olan ve IPv6 sağlayan OpenVPN ile.

Eğer tüm bu teknolojileri öğrenmek istemiyor ama böyle bir sunucu kurmak istiyorsanız bu yazı tam size göre.

Makale her ayrıntıyı açıklamaya çalışmıyor. Açıklama, standart olarak yapılandırılmayan veya tüketici açısından önemli olan şeylere yöneliktir.

Bir posta sunucusu kurma motivasyonu uzun zamandır hayalimdi. Bu kulağa aptalca gelebilir ama IMHO, en sevdiğiniz markanın yeni bir arabasını hayal etmekten çok daha iyi.

IPv6'yı kurmanın iki nedeni vardır. Bir BT uzmanının hayatta kalabilmesi için sürekli olarak yeni teknolojileri öğrenmesi gerekir. Sansüre karşı mücadeleye mütevazı bir katkıda bulunmak isterim.

OpenVPN kurmanın amacı IPv6'nın yerel makinede çalışmasını sağlamaktır.
Birkaç fiziksel arayüz kurmanın motivasyonu, sunucumda bir arayüzün "yavaş ama sınırsız" ve diğerinin "hızlı ama tarifeli" olmasıydı.

Bind ayarlarını kurmanın nedeni, İSS'min dengesiz bir DNS sunucusu sağlaması ve Google'ın da bazen başarısız olmasıdır. Kişisel kullanım için kararlı bir DNS sunucusu istiyorum.

Makale yazma motivasyonu - 10 ay önce bir taslak yazdım ve ona daha önce iki kez baktım. Yazarın düzenli olarak ihtiyacı olsa bile başkalarının da buna ihtiyaç duyması ihtimali yüksektir.

Posta sunucusu için evrensel bir çözüm yoktur. Ama "bunu yap ve sonra, her şey olması gerektiği gibi çalıştığında, fazlalıkları at" gibi bir şey yazmaya çalışacağım.

Tech.ru şirketinin bir Colocation sunucusu var. OVH, Hetzner, AWS ile karşılaştırmak mümkün. Bu sorunu çözmek için tech.ru ile işbirliği yapmak çok daha etkili olacaktır.

Sunucuda Debian 9 kuruludur.

Sunucunun `eno2` ve `eno1` olmak üzere 2 arayüzü vardır. Birincisi sınırsız, ikincisi ise hızlı.

3 statik IP adresi vardır; `eno0` arayüzünde XX.XX.XX.X1 ve XX.XX.XX.X2 ve XX.XX.XX.X1 ve `eno5` arayüzünde XX.XX.XX.X2. .

Mevcut XXXX:XXXX:XXXX:XXXX::/64 "eno6" arayüzüne atanan IPv1 adreslerinden oluşan bir havuz ve benim isteğim üzerine bu arayüzden XXXX:XXXX:XXXX:XXXX:1:2::/96 "eno2"ye atandı.

`domain3.com`, `domain1.com`, `domain2.com` olmak üzere 3 alan adı vardır. ``domain1.com` ve `domain3.com` için SSL sertifikası bulunmaktadır.

Posta kutumu bağlamak istediğim bir Google hesabım var[e-posta korumalı]` (doğrudan gmail arayüzünden posta alma ve posta gönderme).
Bir posta kutusu olmalı[e-posta korumalı]`, Gmail'imde görmek istediğim e-postanın bir kopyası. Ve adına bir şey gönderebilmek nadirdir.[e-posta korumalı]`web arayüzü aracılığıyla.

Bir posta kutusu olmalı[e-posta korumalı]Ivanov'un iPhone'undan kullanacağı.

Gönderilen e-postalar tüm modern antispam gerekliliklerine uygun olmalıdır.
Genel ağlarda sağlanan en yüksek düzeyde şifreleme bulunmalıdır.
Hem mektup göndermek hem de almak için IPv6 desteği olmalıdır.
E-postaları asla silmeyecek bir SpamAssassin olmalı. Ve ya geri dönecek, atlayacak ya da IMAP “Spam” klasörüne gönderecektir.
SpamAssassin otomatik öğrenmesi yapılandırılmalıdır: Bir mektubu Spam klasörüne taşırsam, bundan öğrenecektir; Bir mektubu Spam klasöründen taşırsam bundan öğrenecektir. SpamAssassin eğitiminin sonuçları, mektubun Spam klasörüne düşüp düşmeyeceğini etkileyecektir.
PHP betikleri belirli bir sunucudaki herhangi bir etki alanı adına posta gönderebilmelidir.
IPv6'ya sahip olmayan bir istemcide IPv6'yı kullanma yeteneğine sahip bir openvpn hizmeti bulunmalıdır.

Öncelikle IPv6 dahil arayüzleri ve yönlendirmeyi yapılandırmanız gerekir.
Daha sonra IPv4 aracılığıyla bağlanacak ve istemciye statik-gerçek bir IPv6 adresi sağlayacak OpenVPN'i yapılandırmanız gerekecektir. Bu istemci, sunucudaki tüm IPv6 hizmetlerine ve İnternet'teki tüm IPv6 kaynaklarına erişime sahip olacaktır.
O zaman Postfix'i mektup + SPF + DKIM + rDNS ve diğer benzer küçük şeyleri gönderecek şekilde yapılandırmanız gerekecektir.
Daha sonra Dovecot'u yapılandırmanız ve Multidomain'i yapılandırmanız gerekecektir.
Daha sonra SpamAssassin'i yapılandırmanız ve eğitimi yapılandırmanız gerekecektir.
Son olarak Bind'i yükleyin.

============== Çoklu arayüzler ==============

Arayüzleri yapılandırmak için bunu “/etc/network/interfaces” içerisine yazmanız gerekmektedir.

# 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 ayarlar tech.ru'daki herhangi bir sunucuya uygulanabilir (destekle küçük bir koordinasyonla) ve hemen olması gerektiği gibi çalışacaktır.

Hetzner, OVH için benzer şeyleri ayarlama deneyiminiz varsa, orada durum farklıdır. Daha zor.

eno1, 1 numaralı ağ kartının adıdır (yavaş ama sınırsız).
eno2, 2 numaralı ağ kartının adıdır (hızlı, ancak tarifeli).
tun0, OpenVPN'in sanal ağ kartının adıdır.
XX.XX.XX.X0 - eno4'de IPv1 #1.
XX.XX.XX.X1 - eno4'de IPv2 #1.
XX.XX.XX.X2 - eno4'de IPv3 #1.
XX.XX.XX.X5 - eno4'de IPv1 #2.
XX.XX.XX.1 - IPv4 ağ geçidi.
XXXX:XXXX:XXXX:XXXX::/64 - Sunucunun tamamı için IPv6.
XXXX:XXXX:XXXX:XXXX:1:2::/96 - eno6 için IPv2, dışarıdan gelen her şey eno1'e gider.
XXXX:XXXX:XXXX:XXXX::1 — IPv6 ağ geçidi (bunun farklı şekilde yapılabileceğini/yapılması gerektiğini belirtmekte fayda var. IPv6 anahtarını belirtin).
dns-nameservers - 127.0.0.1 belirtilir (çünkü bağlama yerel olarak kurulur) ve 213.248.1.6 (bu tech.ru'dandır).

"table eno1t" ve "table eno2t" - bu rota kurallarının anlamı, eno1 -> üzerinden giren trafiğin buradan çıkacağı ve eno2 -> üzerinden giren trafiğin buradan çıkacağıdır. Ayrıca sunucu tarafından başlatılan bağlantılar da eno1 üzerinden geçecektir.

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

Bu komutla “table eno1t” -> işaretli herhangi bir kural kapsamına giren anlaşılmaz trafiğin eno1 arayüzüne gönderilmesini belirtiyoruz.

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

Bu komutla sunucu tarafından başlatılan her türlü trafiğin eno1 arayüzüne yönlendirilmesi gerektiğini belirtiyoruz.

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

Bu komutla trafiği işaretleme kurallarını belirliyoruz.

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 arayüzü için ikinci bir IPv1 belirtir.

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

Bu komutla OpenVPN istemcilerinden XX.XX.XX.X4 hariç yerel IPv0'e rotayı ayarlıyoruz.
Bu komutun neden tüm IPv4 için yeterli olduğunu hala anlamıyorum.

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

Arayüzün adresini burada ayarlıyoruz. Sunucu bunu “giden” adres olarak kullanacaktır. Bir daha hiçbir şekilde kullanılmayacaktır.

":1:1::" neden bu kadar karmaşık? Böylece OpenVPN doğru şekilde ve yalnızca bunun için çalışır. Bu konuda daha sonra daha fazla bilgi vereceğiz.

Ağ geçidi konusuna gelince, bu şekilde çalışır ve bunda bir sorun yoktur. Ancak doğru yol burada sunucunun bağlı olduğu anahtarın IPv6'sını belirtmektir.

Ancak bunu yaparsam bazı nedenlerden dolayı IPv6 çalışmayı durduruyor. Bu muhtemelen bir tür tech.ru sorunudur.

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

Bu, arayüze bir IPv6 adresi eklemektir. Yüz adrese ihtiyacınız varsa bu, bu dosyada yüz satır anlamına gelir.

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

Açıkça belirtmek için tüm arayüzlerin adreslerini ve alt ağlarını not ettim.
eno1 - " olmalıdır/64" - çünkü bu bizim adres havuzumuzun tamamı.
tun0 - alt ağ eno1'den büyük olmalıdır. Aksi takdirde OpenVPN istemcileri için bir IPv6 ağ geçidi yapılandırmak mümkün olmayacaktır.
eno2 - alt ağ tun0'dan büyük olmalıdır. Aksi takdirde OpenVPN istemcileri yerel IPv6 adreslerine erişemeyecektir.
Netlik sağlamak için 16'lık bir alt ağ adımı seçtim, ancak dilerseniz “1” adımını bile yapabilirsiniz.
Buna göre 64+16 = 80 ve 80+16 = 96 olur.

Daha da fazla netlik için:
XXXX:XXXX:XXXX:XXXX:1:1:YYYY:YYYY, eno1 arayüzündeki belirli sitelere veya hizmetlere atanması gereken adreslerdir.
XXXX:XXXX:XXXX:XXXX:1:2:YYYY:YYYY, eno2 arayüzündeki belirli sitelere veya hizmetlere atanması gereken adreslerdir.
XXXX:XXXX:XXXX:XXXX:1:3:YYYY:YYYY, OpenVPN istemcilerine atanması veya OpenVPN hizmet adresleri olarak kullanılması gereken adreslerdir.

Ağı yapılandırmak için sunucuyu yeniden başlatmak mümkün olmalıdır.
IPv4 değişiklikleri yürütüldüğünde algılanır (ekrana sardığınızdan emin olun - aksi takdirde bu komut sunucudaki ağı çökertir):

/etc/init.d/networking restart

“/etc/iproute2/rt_tables” dosyasının sonuna ekleyin:

100 eno1t
101 eno2t

Bu olmadan “/etc/network/interfaces” dosyasındaki özel tabloları kullanamazsınız.
Sayılar benzersiz ve 65535'ten küçük olmalıdır.

IPv6 değişiklikleri yeniden başlatmaya gerek kalmadan kolayca değiştirilebilir, ancak bunu yapmak için en az üç komutu öğrenmeniz gerekir:

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

"/etc/sysctl.conf" ayarı

# 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 sunucumun "sysctl" ayarlarıdır. Önemli bir şeye değineyim.

net.ipv4.ip_forward = 1

Bu olmadan OpenVPN hiç çalışmayacaktır.

net.ipv6.ip_nonlocal_bind = 1

Arayüz açıldıktan hemen sonra IPv6'yı (örneğin nginx) bağlamaya çalışan herkes bir hata alacaktır. Bu adresin mevcut olmaması.

Böyle bir durumun yaşanmaması için böyle bir ayar yapılır.

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

Bu IPv6 ayarları olmadan OpenVPN istemcisinden gelen trafik dünyaya yayılmaz.

Diğer ayarlar ya konuyla alakalı değil ya da ne işe yaradıklarını hatırlamıyorum.
Ama her ihtimale karşı, onu "olduğu gibi" bırakıyorum.

Bu dosyada yapılan değişikliklerin sunucuyu yeniden başlatmadan alınması için şu komutu çalıştırmanız gerekir:

sysctl -p

"Tablo" kuralları hakkında daha fazla ayrıntı: habr.com/post/108690

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

OpenVPN IPv4 iptables olmadan çalışmaz.

VPN için iptables'ım şöyle:

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, yerel makinenin statik IPv4 adresimdir.
10.8.0.0/24 - IPv4 openvpn ağı. Openvpn istemcileri için IPv4 adresleri.
Kuralların tutarlılığı önemlidir.

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, OpenVPN'i statik IP'mden yalnızca benim kullanabileceğim bir sınırlamadır.

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

IPv4 paketlerini OpenVPN istemcileri ile İnternet arasında iletmek için bu komutlardan birini kaydetmeniz gerekir.

Farklı durumlar için seçeneklerden biri uygun değildir.
Her iki komut da benim durumuma uygun.
Belgeleri okuduktan sonra daha az CPU kullandığı için ilk seçeneği seçtim.

Yeniden başlatmanın ardından tüm iptables ayarlarının alınabilmesi için bunları bir yere kaydetmeniz gerekir.

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

Bu isimler tesadüfen seçilmedi. "iptables-persistent" paketi tarafından kullanılırlar.

apt-get install iptables-persistent

Ana OpenVPN paketinin kurulması:

apt-get install openvpn easy-rsa

Sertifikalar için bir şablon oluşturalım (değerlerinizi değiştirin):

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

Sertifika şablonu ayarlarını düzenleyelim:

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

Bir sunucu sertifikası oluşturun:

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

Son “istemci-adı.opvn” dosyalarını oluşturma yeteneğini hazırlayalım:

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

Tüm dosyaları tek bir opvn dosyasında birleştirecek bir script hazırlayalım.

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 istemcisini oluşturma:

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

“~/client-configs/files/client-name.ovpn” dosyası istemcinin cihazına gönderilir.

İOS istemcileri için aşağıdaki numarayı yapmanız gerekecektir:
"tls-auth" etiketinin içeriği yorumsuz olmalıdır.
Ayrıca "tls-auth" etiketinin hemen önüne "key-direction 1" yazın.

OpenVPN sunucu yapılandırmasını yapılandıralım:

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

Her istemciye statik bir adres ayarlamak için bu gereklidir (gerekli değil, ancak kullanıyorum):

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

En zor ve önemli detay.

Ne yazık ki OpenVPN, istemciler için bir IPv6 ağ geçidinin bağımsız olarak nasıl yapılandırılacağını henüz bilmiyor.
Bunu her müşteri için “manuel olarak” iletmeniz gerekir.

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

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

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

Her iki komut dosyası da “/etc/openvpn/variables” dosyasını kullanır:

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

Neden böyle yazıldığını hatırlamakta zorlanıyorum.

Şimdi netmask = 112 tuhaf görünüyor (burada 96 olması gerekiyor).
Ve önek garip, tun0 ağıyla eşleşmiyor.
Ama tamam, olduğu gibi bırakacağım.

cipher DES-EDE3-CBC

Bu herkes için değil - bağlantıyı şifrelemek için bu yöntemi seçtim.

OpenVPN IPv4'ü kurma hakkında daha fazla bilgi edinin.

OpenVPN IPv6'ü kurma hakkında daha fazla bilgi edinin.

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

Ana paketin kurulumu:

apt-get install postfix

Kurulum sırasında “internet sitesi” seçeneğini seçin.

"/etc/postfix/main.cf" dosyam şöyle görünüyor:

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 yapılandırmanın ayrıntılarına bakalım.

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

Khabrovsk sakinlerine göre bu blok “yanlış bilgi ve yanlış tezler” içeriyor.Kariyerimin başlangıcından sadece 8 yıl sonra SSL'nin nasıl çalıştığını anlamaya başladım.

Bu nedenle, SSL'nin nasıl kullanılacağını açıklama özgürlüğünü kullanacağım (“Nasıl çalışıyor?” ve “Neden çalışıyor?” sorularını yanıtlamadan).

Modern şifrelemenin temeli bir anahtar çiftinin (çok uzun iki karakter dizisi) oluşturulmasıdır.

Bir “anahtar” özeldir, diğer anahtar ise “genel”dir. Özel anahtarı çok dikkatli bir şekilde gizli tutuyoruz. Genel anahtarı herkese dağıtıyoruz.

Genel anahtar kullanarak, bir metin dizesini yalnızca özel anahtarın sahibinin şifresini çözebileceği şekilde şifreleyebilirsiniz.
İşte teknolojinin tüm temeli budur.

Adım #1 – https siteleri.
Bir siteye erişirken tarayıcı, web sunucusundan sitenin https olduğunu öğrenir ve bu nedenle bir ortak anahtar ister.
Web sunucusu genel anahtarı verir. Tarayıcı, http isteğini şifrelemek ve göndermek için genel anahtarı kullanır.
Bir http isteğinin içeriği yalnızca özel anahtara sahip olanlar, yani yalnızca isteğin yapıldığı sunucu tarafından okunabilir.
Http isteği en az bir URI içeriyor. Dolayısıyla bir ülke sitenin tamamına değil de belirli bir sayfaya erişimi kısıtlamaya çalışıyorsa https siteleri için bunu yapmak imkansızdır.

Adım #2 - şifrelenmiş yanıt.
Web sunucusu yolda kolayca okunabilecek bir yanıt sağlar.
Çözüm son derece basittir; tarayıcı, her https sitesi için aynı özel-genel anahtar çiftini yerel olarak oluşturur.
Ve sitenin genel anahtarı talebiyle birlikte yerel genel anahtarını da gönderir.
Web sunucusu bunu hatırlar ve http yanıtı gönderirken bunu belirli bir istemcinin genel anahtarıyla şifreler.
Artık http yanıtının şifresi yalnızca müşterinin tarayıcı özel anahtarının sahibi (yani müşterinin kendisi) tarafından çözülebilir.

Adım No. 3 - halka açık bir kanal üzerinden güvenli bir bağlantı kurmak.
2 numaralı örnekte bir güvenlik açığı bulunmaktadır; hiçbir şey, iyi niyetli kişilerin bir http isteğini ele geçirmesini ve genel anahtarla ilgili bilgileri düzenlemesini engellemez.
Böylece aracı, iletişim kanalı değişene kadar gönderilen ve alınan mesajların tüm içeriğini net bir şekilde görecektir.
Bununla başa çıkmak son derece basittir; tarayıcının genel anahtarını, web sunucusunun genel anahtarıyla şifrelenmiş bir mesaj olarak göndermeniz yeterlidir.
Web sunucusu daha sonra önce “genel anahtarınız şöyle” şeklinde bir yanıt gönderir ve bu mesajı aynı genel anahtarla şifreler.
Tarayıcı cevaba bakar - eğer "genel anahtarınız böyle" mesajı alınırsa, bu, bu iletişim kanalının güvenli olduğunun %100 garantisidir.
Ne kadar güvenli?
Böyle güvenli bir iletişim kanalının oluşturulması ping*2 hızında gerçekleşir. Örneğin 20ms.
Saldırganın önceden taraflardan birinin özel anahtarına sahip olması gerekir. Veya birkaç milisaniye içinde özel anahtarı bulun.
Bir süper bilgisayarda modern bir özel anahtarın hacklenmesi onlarca yıl sürecektir.

Adım #4 - Genel anahtarların genel veritabanı.
Açıkçası, tüm bu hikayede bir saldırganın istemci ile sunucu arasındaki iletişim kanalında oturma fırsatı var.
İstemci sunucu gibi davranabilir ve sunucu da istemci gibi davranabilir. Ve her iki yönde de bir çift anahtarı taklit edin.
Daha sonra saldırgan tüm trafiği görecek ve trafiği "düzenleyebilecek".
Örneğin, paranın gönderileceği adresi değiştirin veya internet bankacılığından şifreyi kopyalayın veya “sakıncalı” içeriği engelleyin.
Bu tür saldırganlarla mücadele etmek için her https sitesi için ortak anahtarların bulunduğu genel bir veritabanı oluşturdular.
Her tarayıcı bu tür yaklaşık 200 veritabanının varlığını "bilir". Bu, her tarayıcıya önceden yüklenmiş olarak gelir.
“Bilgi” her sertifikanın ortak anahtarıyla desteklenir. Yani, her bir sertifika yetkilisine olan bağlantının sahtesi yapılamaz.

Artık https için SSL'nin nasıl kullanılacağına dair basit bir anlayış var.
Beyninizi kullanırsanız özel servislerin bu yapıdaki bir şeyi nasıl hackleyebildiği ortaya çıkacaktır. Ancak bu onların korkunç çabalarına mal olacak.
Ve NSA veya CIA'den daha küçük kuruluşlarda, VIP'ler için bile mevcut koruma düzeyini hacklemek neredeyse imkansızdır.

Ayrıca ssh bağlantıları hakkında da ekleyeceğim. Orada ortak anahtar yok, peki ne yapabilirsiniz? Sorun iki şekilde çözülüyor.
Şifreye göre ssh seçeneği:
İlk bağlantı sırasında ssh istemcisi, ssh sunucusundan yeni bir ortak anahtarımız olduğu konusunda uyarmalıdır.
Daha sonraki bağlantılar sırasında “ssh sunucusundan yeni ortak anahtar” uyarısı görünürse, bu sizi gizlice dinlemeye çalıştıkları anlamına gelecektir.
Veya ilk bağlantınızda gizlice dinlendiniz ama artık sunucuyla aracılar olmadan iletişim kuruyorsunuz.
Aslında telefon dinleme gerçeğinin kolay, hızlı ve zahmetsizce ortaya çıkması nedeniyle, bu saldırı yalnızca belirli bir müşteriye yönelik özel durumlarda kullanılmaktadır.

Anahtara göre ssh seçeneği:
Bir flash sürücü alıyoruz, üzerine ssh sunucusunun özel anahtarını yazıyoruz (bunun için şartlar ve birçok önemli nüans var, ancak kullanım talimatları değil, bir eğitim programı yazıyorum).
Genel anahtarı ssh istemcisinin olacağı makineye bırakıyoruz ve onu da gizli tutuyoruz.
Flash sürücüyü sunucuya getiriyoruz, takıyoruz, özel anahtarı kopyalıyoruz ve flash sürücüyü yakıp küllerini rüzgara saçıyoruz (veya en azından sıfırlarla biçimlendiriyoruz).
Hepsi bu - böyle bir işlemden sonra böyle bir ssh bağlantısını kesmek imkansız olacak. Elbette 10 yıl içinde bir süper bilgisayardaki trafiği görüntülemek mümkün olacak, ancak bu farklı bir hikaye.

Offtopic için özür dilerim.

Artık teori biliniyor. Sizlere SSL sertifikası oluşturma akışını anlatacağım.

“Openssl genrsa”yı kullanarak özel bir anahtar ve genel anahtar için “boşluklar” oluşturuyoruz.
"Boşları" üçüncü taraf bir şirkete gönderiyoruz ve en basit sertifika için yaklaşık 9 dolar ödüyoruz.

Birkaç saat sonra, bu üçüncü taraf şirketten "genel" anahtarımızı ve birkaç genel anahtar setimizi alıyoruz.

Açık anahtarımın kaydı için neden üçüncü taraf bir şirketin ödeme yapması gerektiği ayrı bir sorudur, bunu burada ele almayacağız.

Artık yazıtın anlamının ne olduğu açık:

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

“/etc/ssl” klasörü SSL sorunlarına ilişkin tüm dosyaları içerir.
domain1.com – alan adı.
2018 anahtar yaratımın yılıdır.
“anahtar” - dosyanın özel bir anahtar olduğunun belirtilmesi.

Ve bu dosyanın anlamı:

smtpd_tls_cert_file=/etc/ssl/domain1.com.2018.chained.crt
domain1.com – alan adı.
2018 anahtar yaratımın yılıdır.
zincirleme - bir genel anahtar zincirinin bulunduğunun belirtilmesi (ilki bizim genel anahtarımızdır ve geri kalanı, genel anahtarı veren şirketten gelenlerdir).
crt - hazır bir sertifikanın bulunduğunun belirtilmesi (teknik açıklamalar içeren ortak anahtar).

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

Bu ayar bu durumda kullanılmaz ancak örnek olarak yazılmıştır.

Çünkü bu parametrede yapılacak bir hata sunucunuzdan (sizin isteğiniz dışında) spam gönderilmesine yol açacaktır.

O zaman herkese suçlu olmadığınızı kanıtlayın.

recipient_delimiter = +

Pek çok kişi bilmiyor olabilir, ancak bu, e-postaları sıralamak için standart bir karakterdir ve çoğu modern posta sunucusu tarafından desteklenir.

Örneğin, bir posta kutunuz varsa "[e-posta korumalı]"şuraya göndermeyi dene"[e-posta korumalı]"- bak ne çıktı.

inet_protocols = ipv4

Bu kafa karıştırıcı olabilir.

Ama bu sadece böyle değil. Her yeni alan adı varsayılan olarak yalnızca IPv4'tür, ardından her biri için IPv6'yı ayrı ayrı açıyorum.

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 gelen tüm maillerin dovecot'a gideceğini belirtiyoruz.
Ve etki alanı, posta kutusu, takma ad kuralları - veritabanına bakı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-posta kutusu-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

Artık postfix, postaların yalnızca dovecot ile yetkilendirme sonrasında daha fazla gönderim için kabul edilebileceğini biliyor.

Bunun neden burada kopyalandığını gerçekten anlamıyorum. “virtual_transport”ta ihtiyaç duyulan her şeyi zaten belirttik.

Ancak postfix sistemi çok eski; muhtemelen eski günlerin bir gerilemesi.

smtpd_recipient_restrictions =
        ...

smtpd_helo_restrictions =
        ...

smtpd_client_restrictions =
        ...

Bu, her posta sunucusu için farklı şekilde yapılandırılabilir.

Elimde 3 posta sunucum var ve bu ayarlar, farklı kullanım gereksinimleri nedeniyle çok farklı.

Bunu dikkatli bir şekilde yapılandırmanız gerekir - aksi takdirde spam size akacak veya daha da kötüsü, spam sizden akacaktır.

# SPF
policyd-spf_time_limit = 3600

Gelen mektupların SPF'sinin kontrol edilmesiyle ilgili bazı eklentilerin kurulumu.

# 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

Ayar, giden tüm e-postalarda bir DKIM imzası sağlamamız gerektiği yönündedir.

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

Bu, PHP betiklerinden mektup gönderirken harf yönlendirmede önemli bir ayrıntıdır.

Dosya “/etc/postfix/sdd_transport.pcre”:

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

Sol tarafta düzenli ifadeler var. Sağda mektubu işaretleyen bir etiket var.
Etikete uygun Postfix - belirli bir harf için birkaç yapılandırma satırını daha dikkate alacaktır.

Belirli bir harf için postfix'in tam olarak nasıl yeniden yapılandırılacağı "master.cf" dosyasında belirtilecektir.

4, 5, 6 numaralı satırlar ana satırlardır. Mektubu hangi domain adına gönderiyoruz, bu etiketi koyuyoruz.
Ancak eski koddaki PHP betiklerinde “from” alanı her zaman belirtilmez. Daha sonra kullanıcı adı kurtarmaya gelir.

Makale zaten oldukça kapsamlı; nginx+fpm kurulumuyla dikkatimin dağılmasını istemem.

Kısaca her site için kendi linux kullanıcı sahibini belirliyoruz. Ve buna göre fpm havuzunuz.

Fpm-pool, php'nin herhangi bir sürümünü kullanır (aynı sunucuda php'nin farklı sürümlerini ve hatta komşu siteler için farklı php.ini'yi sorunsuz bir şekilde kullanabilmeniz harikadır).

Yani, belirli bir linux kullanıcısı olan “www-domain2”, domain2.com web sitesine sahiptir. Bu site, kimden alanını belirtmeden e-posta göndermek için bir koda sahiptir.

Yani bu durumda bile mektuplar doğru şekilde gönderilecek ve asla spam'e düşmeyecek.

"/etc/postfix/master.cf" dosyam şöyle görünüyor:

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

Dosya tam olarak sağlanmadı - zaten çok büyük.
Sadece neyin değiştiğini not ettim.

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 spamassasin ile ilgili ayarlardır, buna daha sonra değineceğiz.

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

Posta sunucusuna 587 numaralı bağlantı noktası üzerinden bağlanmanıza izin veriyoruz.
Bunu yapmak için giriş yapmalısınız.

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

SPF kontrolünü etkinleştirin.

apt-get install postfix-policyd-spf-python

Yukarıdaki SPF kontrolleri için paketi yükleyelim.

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

Ve bu en ilginç şey. Bu, belirli bir IPv4/IPv6 adresinden belirli bir alan adı için mektup gönderme yeteneğidir.

Bu rDNS uğruna yapılır. rDNS, IP adresine göre bir dize alma işlemidir.
Posta için ise bu özellik, helo'nun e-postanın gönderildiği adresin rDNS'si ile tam olarak eşleştiğini doğrulamak için kullanılır.

Helo, mektubun gönderildiği e-posta alan adıyla eşleşmiyorsa spam puanı verilir.

Helo, rDNS ile eşleşmiyor; çok sayıda spam puanı veriliyor.
Buna göre her alan adının kendine ait IP adresine sahip olması gerekir.
OVH için - konsolda rDNS'yi belirtmek mümkündür.
Tech.ru için - sorun destek aracılığıyla çözüldü.
AWS için sorun destek aracılığıyla çözüldü.
“inet_protocols” ve “smtp_bind_address6” - IPv6 desteğini etkinleştiriyoruz.
IPv6 için ayrıca rDNS'yi kaydetmeniz gerekir.
“syslog_name” - ve bu, günlükleri okumayı kolaylaştırmak içindir.

Sertifika satın al burayı tavsiye ederim.

Postfix+güvercin bağlantısını burada kuruyoruz.

SPF'nin ayarlanması.

============== Güvercin =============

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

MySQL'i kurmak, paketleri kendileri kurmak.

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

disable_plaintext_auth = yes
auth_mechanisms = plain login

Yetkilendirme yalnızca şifrelenir.

Dosya “/etc/dovecot/conf.d/10-mail.conf”

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

Burada harflerin saklanacağı yeri belirtiyoruz.

Bunların dosyalarda saklanmasını ve etki alanına göre gruplandırılmasını istiyorum.

Dosya "/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 ana güvercinlik yapılandırma dosyasıdır.
Burada güvenli olmayan bağlantıları devre dışı bırakıyoruz.
Ve güvenli bağlantıları etkinleştirin.

Dosya "/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'yi ayarlama. SSL'nin gerekli olduğunu belirtiyoruz.
Ve sertifikanın kendisi. Ve önemli bir detay da “yerel” direktiftir. Hangi yerel IPv4'e bağlanırken hangi SSL sertifikasının kullanılacağını belirtir.

Bu arada, IPv6 burada yapılandırılmamış, bu ihmali daha sonra düzelteceğim.
XX.XX.XX.X5 (etki alanı2) - sertifika yok. İstemcileri bağlamak için domain1.com'u belirtmeniz gerekir.
XX.XX.XX.X2 (domain3) - bir sertifika var, istemcilere bağlanmak için domain1.com veya domain3.com'u belirtebilirsiniz.

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

protocol lda {
  mail_plugins = $mail_plugins sieve
}

Gelecekte spamassassin için buna ihtiyaç duyulacak.

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

protocol imap {
  mail_plugins = $mail_plugins antispam
}

Bu bir antispam eklentisidir. “Spam” klasörüne/klasöründen aktarım sırasında spamassasin eğitimi için gereklidir.

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

protocol pop3 {
}

Böyle bir dosya var.

Dosya “/etc/dovecot/conf.d/20-lmtp.conf”

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

lmtp'yi ayarlama.

Dosya "/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 klasörüne/klasöründen aktarım sırasında Spamassasin eğitim ayarları.

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

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

Gelen harflerle ne yapılacağını belirten bir dosya.

"/var/lib/dovecot/sieve/default.sieve" dosyası

require ["fileinto", "mailbox"];

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

Dosyayı derlemeniz gerekiyor: “sievec default.sieve”.

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

Yetkilendirme için sql dosyalarını belirtme.
Ve dosyanın kendisi bir yetkilendirme yöntemi olarak kullanılır.

Dosya "/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, postfix için benzer ayarlara karşılık gelir.

Dosya "/etc/dovecot/dovecot.conf"

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

Ana yapılandırma dosyası.
Önemli olan burada şunu belirtmemizdir; protokolleri ekleyin.

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

apt-get install spamassassin spamc

Paketleri kuralım.

adduser spamd --disabled-login

Adına bir kullanıcı ekleyelim.

systemctl enable spamassassin.service

Yükleme sonrasında otomatik yükleme spamassassin hizmetini etkinleştiriyoruz.

"/etc/default/spamassassin" dosyası:

CRON=1

Kuralların "varsayılan olarak" otomatik güncellenmesini etkinleştirerek.

Dosya “/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'de "sa" kullanıcısı ve "password" parolasıyla bir "sa" veritabanı oluşturmanız gerekir (yeterli bir şeyle değiştirin).

report_safe - bu, mektup yerine spam e-posta raporu gönderecektir.
use_bayes, spamassassin makine öğrenimi ayarlarıdır.

Geriye kalan spamassassin ayarları makalenin başlarında kullanılmıştı.

Genel ayar "spamassassin".
Yeni Spam e-postalarını IMAP "Spam" klasörüne taşıma hakkında.
Dovecot + SpamAssassin'in basit bir kombinasyonu hakkında.
İmap klasörlerindeki harfleri taşırken spamassasin öğrenme teorisini okumanızı tavsiye ederim (ve kullanmanızı tavsiye etmem).

============= Topluluğa itiraz =============

Ayrıca topluluğa, iletilen mektupların güvenlik düzeyinin nasıl artırılacağı konusunda bir fikir vermek istiyorum. Posta konusuna o kadar dalmış durumdayım ki.

Böylece kullanıcı istemcisinde bir çift anahtar oluşturabilir (outlook, Thunderbird, tarayıcı eklentisi, ...). Kamu ve özel. Genel - DNS'ye gönder. Özel - istemciden tasarruf edin. Posta sunucuları, belirli bir alıcıya göndermek için ortak bir anahtar kullanabilecektir.

Ve bu tür mektuplarla spam'e karşı koruma sağlamak için (evet, posta sunucusu içeriği görüntüleyemeyecektir) - 3 kural eklemeniz gerekecek:

  1. Zorunlu gerçek DKIM imzası, zorunlu SPF, zorunlu rDNS.
  2. Antispam eğitimi konusunda bir sinir ağı + müşteri tarafında bunun için bir veritabanı.
  3. Şifreleme algoritması, gönderen tarafın şifrelemeye alıcı tarafa göre 100 kat daha fazla CPU gücü harcamasını sağlayacak şekilde olmalıdır.

Kamu mektuplarına ek olarak, "güvenli yazışmalara başlamak için" standart bir teklif mektubu geliştirin. Kullanıcılardan biri (posta kutusu) başka bir posta kutusuna eki olan bir mektup gönderir. Mektup, yazışmalar için güvenli bir iletişim kanalı başlatmak için bir metin teklifi ve posta kutusu sahibinin genel anahtarını (müşteri tarafında özel bir anahtarla) içerir.

Her yazışma için özel olarak birkaç anahtar bile yapabilirsiniz. Alıcı kullanıcı bu teklifi kabul edebilir ve kendi genel anahtarını (ayrıca bu yazışma için özel olarak hazırlanmış) gönderebilir. Daha sonra, birinci kullanıcı, ikinci kullanıcının oluşturulan iletişim kanalını güvenilir olarak kabul edebileceği bir hizmet kontrol mektubu (ikinci kullanıcının genel anahtarıyla şifrelenmiş) gönderir. Daha sonra ikinci kullanıcı bir kontrol mektubu gönderir ve ardından birinci kullanıcı da oluşturulan kanalın güvenli olduğunu düşünebilir.

Yolda anahtarların ele geçirilmesiyle mücadele etmek için protokolün, bir flash sürücü kullanarak en az bir genel anahtarın iletilmesi olasılığını sağlaması gerekir.

Ve en önemlisi her şeyin işe yaramasıdır (soru "Bunun parasını kim ödeyecek?"):
10 yıl boyunca 3 ABD dolarından başlayan posta sertifikalarını girin. Bu, gönderenin DNS'de "genel anahtarlarımın orada olduğunu" belirtmesine olanak tanır. Ve size güvenli bir bağlantı kurma fırsatı verecekler. Aynı zamanda bu tür bağlantıları kabul etmek ücretsizdir.
Gmail nihayet kullanıcılarından para kazanmaya başlıyor. 10 yıl başına 3 ABD doları karşılığında - güvenli yazışma kanalları oluşturma hakkı.

============= Sonuç =============

Yazının tamamını test etmek için bir aylığına özel bir sunucu kiralayıp SSL sertifikalı bir alan adı satın alacaktım.

Ancak hayat şartları gelişti ve bu konu 2 ay kadar sürdü.
Ve böylece, tekrar boş zamanım olduğunda, yayının bir yıl daha ertelenmesi riskini almak yerine makaleyi olduğu gibi yayınlamaya karar verdim.

"Ancak bu yeterince ayrıntılı olarak açıklanmadı" gibi pek çok soru varsa, o zaman muhtemelen yeni bir alan adına ve yeni bir SSL sertifikasına sahip özel bir sunucu alıp bunu daha ayrıntılı olarak açıklama gücü olacaktır ve çoğu Daha da önemlisi, eksik olan tüm önemli ayrıntıları belirleyin.

Ayrıca posta sertifikalarıyla ilgili fikirler hakkında da geri bildirim almak isterim. Eğer fikir hoşunuza giderse RFC için bir taslak yazacak gücü bulmaya çalışacağım.

Bir makalenin büyük bölümlerini kopyalarken bu makaleye bir bağlantı verin.
Başka bir dile çevirirken bu makaleye bir bağlantı verin.
Bunu kendim İngilizceye çevirmeye çalışacağım ve çapraz referanslar bırakacağım.


Kaynak: habr.com

Yorum ekle