Debian + Postfix + Dovecot + Multidomain + SSL + IPv6 + OpenVPN + Multi-interfaces + SpamAssassin-learn + Bind

Artikel ini adalah tentang cara menyediakan pelayan mel moden.
Postfix + Dovecot. SPF + DKIM + rDNS. Dengan IPv6.
Dengan penyulitan TSL. Dengan sokongan untuk berbilang domain - bahagian dengan sijil SSL sebenar.
Dengan perlindungan antispam dan penarafan antispam yang tinggi daripada pelayan mel lain.
Menyokong pelbagai antara muka fizikal.
Dengan OpenVPN, sambungannya melalui IPv4, dan yang menyediakan IPv6.

Jika anda tidak mahu mempelajari semua teknologi ini, tetapi ingin menyediakan pelayan sedemikian, maka artikel ini adalah untuk anda.

Artikel itu tidak cuba menjelaskan setiap butiran. Penjelasan mengenai perkara yang tidak dikonfigurasikan sebagai standard atau penting dari sudut pandangan pengguna.

Motivasi untuk menyediakan pelayan mel telah menjadi impian saya sejak sekian lama. Ini mungkin kedengaran bodoh, tetapi IMHO, ia jauh lebih baik daripada mengimpikan kereta baharu daripada jenama kegemaran anda.

Terdapat dua motivasi untuk menyediakan IPv6. Pakar IT perlu mempelajari teknologi baharu secara berterusan untuk terus hidup. Saya ingin membuat sumbangan sederhana saya untuk memerangi penapisan.

Motivasi untuk menyediakan OpenVPN hanyalah untuk membolehkan IPv6 berfungsi pada mesin tempatan.
Motivasi untuk menyediakan beberapa antara muka fizikal ialah pada pelayan saya, saya mempunyai satu antara muka "lambat tetapi tidak terhad" dan satu lagi "cepat tetapi dengan tarif".

Motivasi untuk menyediakan tetapan Bind ialah ISP saya menyediakan pelayan DNS yang tidak stabil, dan google juga kadangkala gagal. Saya mahukan pelayan DNS yang stabil untuk kegunaan peribadi.

Motivasi untuk menulis artikel - Saya menulis draf 10 bulan yang lalu, dan saya sudah melihatnya dua kali. Walaupun penulis kerap memerlukannya, terdapat kebarangkalian tinggi bahawa orang lain juga memerlukannya.

Tiada penyelesaian universal untuk pelayan mel. Tetapi saya akan cuba menulis sesuatu seperti "buat ini dan kemudian, apabila semuanya berfungsi sebagaimana mestinya, buang bahan tambahan."

Syarikat tech.ru mempunyai pelayan Colocation. Ia adalah mungkin untuk membandingkan dengan OVH, Hetzner, AWS. Untuk menyelesaikan masalah ini, kerjasama dengan tech.ru akan menjadi lebih berkesan.

Debian 9 dipasang pada pelayan.

Pelayan mempunyai 2 antara muka `eno1` dan `eno2`. Yang pertama adalah tidak terhad, dan yang kedua adalah pantas, masing-masing.

Terdapat 3 alamat IP statik, XX.XX.XX.X0 dan XX.XX.XX.X1 dan XX.XX.XX.X2 pada antara muka `eno1` dan XX.XX.XX.X5 pada antara muka `eno2` .

Tersedia XXXX:XXXX:XXXX:XXXX::/64 kumpulan alamat IPv6 yang diperuntukkan kepada antara muka `eno1` dan daripadanya XXXX:XXXX:XXXX:XXXX:1:2::/96 telah diperuntukkan kepada `eno2` atas permintaan saya.

Terdapat 3 domain `domain1.com`, `domain2.com`, `domain3.com`. Terdapat sijil SSL untuk `domain1.com` dan `domain3.com`.

Saya mempunyai akaun Google yang saya ingin pautkan peti mel saya[e-mel dilindungi]` (menerima mel dan menghantar mel terus dari antara muka gmail).
Mesti ada peti surat`[e-mel dilindungi]`, salinan e-mel yang saya ingin lihat dalam gmail saya. Dan jarang sekali dapat menghantar sesuatu bagi pihak `[e-mel dilindungi]` melalui antara muka web.

Mesti ada peti surat`[e-mel dilindungi]`, yang akan digunakan oleh Ivanov daripada iPhonenya.

E-mel yang dihantar mesti mematuhi semua keperluan antispam moden.
Mesti ada tahap penyulitan tertinggi yang disediakan dalam rangkaian awam.
Perlu ada sokongan IPv6 untuk menghantar dan menerima surat.
Perlu ada SpamAssassin yang tidak akan memadam e-mel. Dan ia akan sama ada melantun atau melangkau atau menghantar ke folder "Spam" IMAP.
Pembelajaran automatik SpamAssassin mesti dikonfigurasikan: jika saya memindahkan surat ke folder Spam, ia akan belajar daripada ini; jika saya memindahkan surat dari folder Spam, ia akan belajar daripada ini. Hasil latihan SpamAssassin harus mempengaruhi sama ada surat itu berakhir dalam folder Spam.
Skrip PHP mesti boleh menghantar mel bagi pihak mana-mana domain pada pelayan tertentu.
Perlu ada perkhidmatan openvpn, dengan keupayaan untuk menggunakan IPv6 pada klien yang tidak mempunyai IPv6.

Mula-mula anda perlu mengkonfigurasi antara muka dan penghalaan, termasuk IPv6.
Kemudian anda perlu mengkonfigurasi OpenVPN, yang akan menyambung melalui IPv4 dan menyediakan klien alamat IPv6 statik-sebenar. Pelanggan ini akan mempunyai akses kepada semua perkhidmatan IPv6 pada pelayan dan akses kepada mana-mana sumber IPv6 di Internet.
Kemudian anda perlu mengkonfigurasi Postfix untuk menghantar surat + SPF + DKIM + rDNS dan perkara kecil lain yang serupa.
Kemudian anda perlu mengkonfigurasi Dovecot dan mengkonfigurasi Multidomain.
Kemudian anda perlu mengkonfigurasi SpamAssassin dan mengkonfigurasi latihan.
Akhir sekali, pasang Bind.

============= Pelbagai antara muka =============

Untuk mengkonfigurasi antara muka, anda perlu menulis ini dalam "/etc/network/interfaces".

# The loopback network interface
auto lo
iface lo inet loopback

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

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

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

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

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

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

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

Tetapan ini boleh digunakan pada mana-mana pelayan dalam tech.ru (dengan sedikit penyelarasan dengan sokongan) dan ia akan berfungsi dengan serta-merta.

Jika anda mempunyai pengalaman menyediakan perkara yang serupa untuk Hetzner, OVH, ia berbeza di sana. Lebih sukar.

eno1 ialah nama kad rangkaian #1 (perlahan tetapi tidak terhad).
eno2 ialah nama kad rangkaian #2 (cepat, tetapi dengan tarif).
tun0 ialah nama kad rangkaian maya daripada OpenVPN.
XX.XX.XX.X0 - IPv4 #1 pada eno1.
XX.XX.XX.X1 - IPv4 #2 pada eno1.
XX.XX.XX.X2 - IPv4 #3 pada eno1.
XX.XX.XX.X5 - IPv4 #1 pada eno2.
XX.XX.XX.1 - get laluan IPv4.
XXXX:XXXX:XXXX:XXXX::/64 - IPv6 untuk keseluruhan pelayan.
XXXX:XXXX:XXXX:XXXX:1:2::/96 - IPv6 untuk eno2, semua yang lain dari luar masuk ke eno1.
XXXX:XXXX:XXXX:XXXX::1 β€” Gerbang IPv6 (perlu diperhatikan bahawa ini boleh/harus dilakukan secara berbeza. Tentukan suis IPv6).
dns-nameservers - 127.0.0.1 ditunjukkan (kerana bind dipasang secara tempatan) dan 213.248.1.6 (ini dari tech.ru).

β€œjadual eno1t” dan β€œjadual eno2t” - maksud peraturan laluan ini ialah trafik yang masuk melalui eno1 -> akan keluar melaluinya dan trafik yang masuk melalui eno2 -> akan keluar melaluinya. Dan juga sambungan yang dimulakan oleh pelayan akan melalui eno1.

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

Dengan arahan ini kami menyatakan bahawa sebarang trafik yang tidak dapat difahami yang berada di bawah mana-mana peraturan bertanda "table eno1t" -> dihantar ke antara muka eno1.

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

Dengan arahan ini kami menyatakan bahawa sebarang trafik yang dimulakan oleh pelayan harus diarahkan ke antara muka eno1.

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

Dengan arahan ini kami menetapkan peraturan untuk menandakan trafik.

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

Blok ini menentukan IPv4 kedua untuk antara muka eno1.

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

Dengan arahan ini kami menetapkan laluan daripada klien OpenVPN ke IPv4 tempatan kecuali XX.XX.XX.X0.
Saya masih tidak faham mengapa arahan ini cukup untuk semua IPv4.

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

Di sinilah kami menetapkan alamat untuk antara muka itu sendiri. Pelayan akan menggunakannya sebagai alamat "keluar". Tidak akan digunakan dalam apa jua cara lagi.

Mengapa ":1:1::" begitu rumit? Supaya OpenVPN berfungsi dengan betul dan hanya untuk ini. Lebih lanjut mengenai ini kemudian.

Mengenai topik get laluan - begitulah cara ia berfungsi dan tidak mengapa. Tetapi cara yang betul ialah menunjukkan di sini IPv6 suis yang mana pelayan disambungkan.

Walau bagaimanapun, atas sebab tertentu IPv6 berhenti berfungsi jika saya melakukan ini. Ini mungkin sejenis masalah tech.ru.

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

Ini menambah alamat IPv6 pada antara muka. Jika anda memerlukan seratus alamat, itu bermakna seratus baris dalam fail ini.

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

Saya perhatikan alamat dan subnet semua antara muka untuk menjelaskannya.
eno1 - mestilah "/64" - kerana ini adalah keseluruhan kumpulan alamat kami.
tun0 - subnet mestilah lebih besar daripada eno1. Jika tidak, ia tidak akan dapat mengkonfigurasi get laluan IPv6 untuk klien OpenVPN.
eno2 - subnet mestilah lebih besar daripada tun0. Jika tidak, klien OpenVPN tidak akan dapat mengakses alamat IPv6 tempatan.
Untuk kejelasan, saya memilih langkah subnet 16, tetapi jika anda mahu, anda juga boleh melakukan langkah "1".
Oleh itu, 64+16 = 80, dan 80+16 = 96.

Untuk lebih jelas lagi:
XXXX:XXXX:XXXX:XXXX:1:1:YYYY:YYYY ialah alamat yang harus diberikan kepada tapak atau perkhidmatan tertentu pada antara muka eno1.
XXXX:XXXX:XXXX:XXXX:1:2:YYYY:YYYY ialah alamat yang harus diberikan kepada tapak atau perkhidmatan tertentu pada antara muka eno2.
XXXX:XXXX:XXXX:XXXX:1:3:YYYY:YYYY ialah alamat yang harus diberikan kepada klien OpenVPN atau digunakan sebagai alamat perkhidmatan OpenVPN.

Untuk mengkonfigurasi rangkaian, mungkin untuk memulakan semula pelayan.
Perubahan IPv4 diambil apabila dilaksanakan (pastikan untuk membungkusnya dalam skrin - jika tidak, arahan ini hanya akan merosakkan rangkaian pada pelayan):

/etc/init.d/networking restart

Tambahkan pada penghujung fail "/etc/iproute2/rt_tables":

100 eno1t
101 eno2t

Tanpa ini, anda tidak boleh menggunakan jadual tersuai dalam fail "/etc/network/interfaces".
Nombor mestilah unik dan kurang daripada 65535.

Perubahan IPv6 boleh diubah dengan mudah tanpa but semula, tetapi untuk melakukan ini anda perlu mempelajari sekurang-kurangnya tiga arahan:

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

Tetapan "/etc/sysctl.conf"

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

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

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

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

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

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

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

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

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

Ini ialah tetapan "sysctl" pelayan saya. Biar saya nyatakan sesuatu yang penting.

net.ipv4.ip_forward = 1

Tanpa ini, OpenVPN tidak akan berfungsi sama sekali.

net.ipv6.ip_nonlocal_bind = 1

Sesiapa sahaja yang cuba mengikat IPv6 (contohnya nginx) serta-merta selepas antara muka siap akan menerima ralat. Bahawa alamat ini tidak tersedia.

Untuk mengelakkan situasi sedemikian, tetapan sedemikian dibuat.

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

Tanpa tetapan IPv6 ini, trafik daripada klien OpenVPN tidak keluar ke dunia.

Tetapan lain sama ada tidak berkaitan atau saya tidak ingat untuk kegunaannya.
Tetapi untuk berjaga-jaga, saya biarkan "seadanya".

Untuk membolehkan perubahan pada fail ini diambil tanpa but semula pelayan, anda perlu menjalankan arahan:

sysctl -p

Butiran lanjut tentang peraturan "jadual": habr.com/post/108690

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

OpenVPN IPv4 tidak berfungsi tanpa iptables.

iptables saya adalah seperti ini untuk VPN:

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

YY.YY.YY.YY ialah alamat IPv4 statik saya bagi mesin tempatan.
10.8.0.0/24 - Rangkaian IPv4 openvpn. Alamat IPv4 untuk klien openvpn.
Konsistensi peraturan adalah penting.

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

Ini adalah had supaya hanya saya boleh menggunakan OpenVPN daripada IP statik saya.

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

Untuk memajukan paket IPv4 antara klien OpenVPN dan Internet, anda perlu mendaftarkan salah satu daripada arahan ini.

Untuk kes yang berbeza, salah satu pilihan tidak sesuai.
Kedua-dua arahan sesuai untuk kes saya.
Selepas membaca dokumentasi, saya memilih pilihan pertama kerana ia menggunakan kurang CPU.

Agar semua tetapan iptables diambil selepas but semula, anda perlu menyimpannya di suatu tempat.

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

Nama sedemikian tidak dipilih secara kebetulan. Ia digunakan oleh pakej "iptables-persistent".

apt-get install iptables-persistent

Memasang pakej OpenVPN utama:

apt-get install openvpn easy-rsa

Mari sediakan templat untuk sijil (gantikan nilai anda):

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

Mari edit tetapan templat sijil:

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

Buat sijil pelayan:

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

Mari sediakan keupayaan untuk mencipta fail "client-name.opvn" terakhir:

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

Mari sediakan skrip yang akan menggabungkan semua fail ke dalam satu fail opvn.

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

#!/bin/bash

# First argument: Client identifier

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

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

Mencipta klien OpenVPN pertama:

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

Fail "~/client-configs/files/client-name.ovpn" dihantar ke peranti klien.

Untuk pelanggan iOS anda perlu melakukan helah berikut:
Kandungan teg "tls-auth" mestilah tanpa ulasan.
Dan letakkan juga "arah kekunci 1" sejurus sebelum teg "tls-auth".

Mari konfigurasikan konfigurasi pelayan OpenVPN:

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

# Listen port
port 1194

# Protocol
proto tcp-server

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

# Master certificate
ca ca.crt

# Server certificate
cert server.crt

# Server private key
key server.key

# Diffie-Hellman parameters
dh dh2048.pem

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

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

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

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

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

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

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

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

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

# Enable compression
comp-lzo

# User and group
user vpn
group vpn

# Log a short status
status openvpn-status.log

# Logging verbosity
##verb 4

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

Ini diperlukan untuk menetapkan alamat statik untuk setiap pelanggan (tidak perlu, tetapi saya menggunakannya):

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

Perincian yang paling sukar dan penting.

Malangnya, OpenVPN belum tahu cara mengkonfigurasi get laluan IPv6 secara bebas untuk pelanggan.
Anda perlu "secara manual" memajukan ini untuk setiap pelanggan.

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

Fail "/etc/openvpn/server-clientconnect.sh":

#!/bin/sh

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

# Load server variables
. /etc/openvpn/variables

ipv6=""

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

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

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

Fail "/etc/openvpn/server-clientdisconnect.sh":

#!/bin/sh

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

# Load server variables
. /etc/openvpn/variables

ipv6=""

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

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

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

Kedua-dua skrip menggunakan fail "/etc/openvpn/variables":

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

Saya sukar untuk mengingati mengapa ia ditulis sedemikian.

Sekarang netmask = 112 kelihatan pelik (sepatutnya 96 di sana).
Dan awalan itu pelik, ia tidak sepadan dengan rangkaian tun0.
Tapi baiklah, saya biarkan seperti sedia ada.

cipher DES-EDE3-CBC

Ini bukan untuk semua orang - saya memilih kaedah menyulitkan sambungan ini.

Ketahui lebih lanjut tentang menyediakan OpenVPN IPv4.

Ketahui lebih lanjut tentang menyediakan OpenVPN IPv6.

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

Memasang pakej utama:

apt-get install postfix

Apabila memasang, pilih "tapak internet".

"/etc/postfix/main.cf" saya kelihatan seperti ini:

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

Mari lihat butiran konfigurasi ini.

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

Menurut penduduk Khabrovsk, blok ini mengandungi "maklumat salah dan tesis yang tidak betul."Hanya 8 tahun selepas permulaan kerjaya saya, saya mula memahami cara SSL berfungsi.

Oleh itu, saya akan mengambil kebebasan untuk menerangkan cara menggunakan SSL (tanpa menjawab soalan "Bagaimana ia berfungsi?" dan "Mengapa ia berfungsi?").

Asas penyulitan moden ialah penciptaan pasangan kunci (dua rentetan aksara yang sangat panjang).

Satu "kunci" adalah peribadi, satu lagi kunci "awam". Kami merahsiakan kunci persendirian dengan berhati-hati. Kami mengedarkan kunci awam kepada semua orang.

Menggunakan kunci awam, anda boleh menyulitkan rentetan teks supaya hanya pemilik kunci peribadi boleh menyahsulitnya.
Nah, itulah asas keseluruhan teknologi.

Langkah #1 - tapak https.
Apabila mengakses tapak, penyemak imbas mengetahui daripada pelayan web bahawa tapak tersebut adalah https dan oleh itu meminta kunci awam.
Pelayan web memberikan kunci awam. Penyemak imbas menggunakan kunci awam untuk menyulitkan permintaan http dan menghantarnya.
Kandungan http-request hanya boleh dibaca oleh mereka yang mempunyai kunci persendirian, iaitu hanya pelayan yang memintanya dibuat.
Permintaan Http mengandungi sekurang-kurangnya URI. Oleh itu, jika sesebuah negara cuba menyekat akses bukan ke seluruh tapak, tetapi ke halaman tertentu, maka ini adalah mustahil untuk dilakukan untuk tapak https.

Langkah #2 - respons yang disulitkan.
Pelayan web menyediakan jawapan yang boleh dibaca dengan mudah di jalan raya.
Penyelesaiannya sangat mudah - penyemak imbas secara tempatan menjana pasangan kunci persendirian-awam yang sama untuk setiap tapak https.
Dan bersama-sama dengan permintaan untuk kunci awam tapak, ia menghantar kunci awam tempatannya.
Pelayan web mengingatinya dan, apabila menghantar http-response, menyulitkannya dengan kunci awam klien tertentu.
Sekarang http-response hanya boleh dinyahsulit oleh pemilik kunci peribadi pelayar klien (iaitu, klien itu sendiri).

Langkah No. 3 - mewujudkan sambungan selamat melalui saluran awam.
Terdapat kelemahan dalam contoh No. 2 - tiada apa-apa yang menghalang orang baik daripada memintas permintaan http dan menyunting maklumat tentang kunci awam.
Oleh itu, pengantara akan melihat dengan jelas semua kandungan mesej yang dihantar dan diterima sehingga saluran komunikasi berubah.
Berurusan dengan ini adalah sangat mudah - hanya hantar kunci awam penyemak imbas sebagai mesej yang disulitkan dengan kunci awam pelayan web.
Pelayan web kemudian mula-mula menghantar respons seperti "kunci awam anda seperti ini" dan menyulitkan mesej ini dengan kunci awam yang sama.
Penyemak imbas melihat respons - jika mesej "kunci awam anda seperti ini" diterima - maka ini adalah jaminan 100% bahawa saluran komunikasi ini selamat.
Sejauh manakah ia selamat?
Penciptaan saluran komunikasi selamat sedemikian berlaku pada kelajuan ping*2. Contohnya 20ms.
Penyerang mesti mempunyai kunci peribadi salah satu pihak terlebih dahulu. Atau cari kunci peribadi dalam beberapa milisaat.
Menggodam satu kunci persendirian moden akan mengambil masa beberapa dekad pada superkomputer.

Langkah #4 - pangkalan data awam kunci awam.
Jelas sekali, dalam keseluruhan cerita ini terdapat peluang untuk penyerang untuk duduk di saluran komunikasi antara klien dan pelayan.
Pelanggan boleh berpura-pura menjadi pelayan, dan pelayan boleh berpura-pura menjadi pelanggan. Dan tiru sepasang kunci dalam kedua-dua arah.
Kemudian penyerang akan melihat semua trafik dan akan dapat "mengedit" trafik.
Contohnya, tukar alamat tempat untuk menghantar wang atau salin kata laluan daripada perbankan dalam talian atau sekat kandungan "boleh ditolak".
Untuk memerangi penyerang sedemikian, mereka menghasilkan pangkalan data awam dengan kunci awam untuk setiap tapak https.
Setiap pelayar "tahu" tentang kewujudan kira-kira 200 pangkalan data sedemikian. Ini diprapasang dalam setiap penyemak imbas.
"Pengetahuan" disokong oleh kunci awam daripada setiap sijil. Iaitu, sambungan kepada setiap pihak berkuasa pensijilan tertentu tidak boleh dipalsukan.

Kini terdapat pemahaman mudah tentang cara menggunakan SSL untuk https.
Jika anda menggunakan otak anda, ia akan menjadi jelas bagaimana perkhidmatan khas boleh menggodam sesuatu dalam struktur ini. Tetapi ia akan membebankan usaha yang besar.
Dan organisasi yang lebih kecil daripada NSA atau CIA - hampir mustahil untuk menggodam tahap perlindungan sedia ada, walaupun untuk VIP.

Saya juga akan menambah tentang sambungan ssh. Tiada kunci awam di sana, jadi apa yang boleh anda lakukan? Isu ini diselesaikan dengan dua cara.
Pilihan ssh-oleh-kata laluan:
Semasa sambungan pertama, pelanggan ssh harus memberi amaran bahawa kami mempunyai kunci awam baharu daripada pelayan ssh.
Dan semasa sambungan lanjut, jika amaran "kunci awam baharu daripada pelayan ssh" muncul, ini bermakna mereka cuba mencuri dengar tentang anda.
Atau anda telah mencuri dengar sambungan pertama anda, tetapi kini anda berkomunikasi dengan pelayan tanpa perantara.
Sebenarnya, disebabkan fakta bahawa penyadapan mudah, cepat dan mudah didedahkan, serangan ini hanya digunakan dalam kes khas untuk pelanggan tertentu.

Pilihan ssh-by-key:
Kami mengambil pemacu kilat, tuliskan kunci peribadi untuk pelayan ssh di atasnya (terdapat istilah dan banyak nuansa penting untuk ini, tetapi saya menulis program pendidikan, bukan arahan untuk digunakan).
Kami meninggalkan kunci awam pada mesin di mana pelanggan ssh akan berada dan kami juga merahsiakannya.
Kami membawa pemacu denyar ke pelayan, memasukkannya, menyalin kunci peribadi, dan membakar pemacu denyar dan menaburkan abu ke angin (atau sekurang-kurangnya memformatnya dengan sifar).
Itu sahaja - selepas operasi sedemikian mustahil untuk menggodam sambungan ssh sedemikian. Sudah tentu, dalam 10 tahun adalah mungkin untuk melihat trafik pada superkomputer - tetapi itu cerita yang berbeza.

Saya minta maaf kerana offtopic.

Jadi sekarang teori itu diketahui. Saya akan memberitahu anda tentang aliran mencipta sijil SSL.

Menggunakan "openssl genrsa" kami mencipta kunci peribadi dan "kosong" untuk kunci awam.
Kami menghantar "kosong" kepada syarikat pihak ketiga, yang mana kami membayar kira-kira $9 untuk sijil yang paling mudah.

Selepas beberapa jam, kami menerima kunci "awam" kami dan satu set beberapa kunci awam daripada syarikat pihak ketiga ini.

Mengapakah syarikat pihak ketiga perlu membayar untuk pendaftaran kunci awam saya adalah soalan berasingan, kami tidak akan mempertimbangkannya di sini.

Sekarang jelas apa maksud prasasti itu:

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

Folder β€œ/etc/ssl” mengandungi semua fail untuk isu ssl.
domain1.com β€” nama domain.
2018 adalah tahun penciptaan utama.
"kunci" - penetapan bahawa fail adalah kunci peribadi.

Dan maksud fail ini:

smtpd_tls_cert_file=/etc/ssl/domain1.com.2018.chained.crt
domain1.com β€” nama domain.
2018 adalah tahun penciptaan utama.
dirantai - penetapan bahawa terdapat rantaian kunci awam (yang pertama ialah kunci awam kami dan selebihnya adalah apa yang datang daripada syarikat yang mengeluarkan kunci awam).
crt - penunjukan bahawa terdapat sijil siap pakai (kunci awam dengan penjelasan teknikal).

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

Tetapan ini tidak digunakan dalam kes ini, tetapi ditulis sebagai contoh.

Kerana ralat dalam parameter ini akan menyebabkan spam dihantar dari pelayan anda (tanpa kehendak anda).

Kemudian buktikan kepada semua orang bahawa anda tidak bersalah.

recipient_delimiter = +

Ramai orang mungkin tidak tahu, tetapi ini adalah watak standard untuk e-mel kedudukan, dan ia disokong oleh kebanyakan pelayan mel moden.

Contohnya, jika anda mempunyai peti mel "[e-mel dilindungi]"cuba hantar ke"[e-mel dilindungi]"- lihat apa yang berlaku.

inet_protocols = ipv4

Ini mungkin mengelirukan.

Tetapi ia bukan begitu sahaja. Setiap domain baharu secara lalai hanya IPv4, kemudian saya menghidupkan IPv6 untuk setiap satu secara berasingan.

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

Di sini kami menyatakan bahawa semua mel masuk pergi ke dovecot.
Dan peraturan untuk domain, peti mel, alias - lihat dalam pangkalan data.

/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

Sekarang postfix tahu bahawa mel boleh diterima untuk penghantaran selanjutnya hanya selepas kebenaran dengan dovecot.

Saya benar-benar tidak faham mengapa ini diduplikasi di sini. Kami telah menetapkan semua yang diperlukan dalam "pengangkutan_maya".

Tetapi sistem postfix adalah sangat lama - mungkin ia adalah kemunduran dari zaman dahulu.

smtpd_recipient_restrictions =
        ...

smtpd_helo_restrictions =
        ...

smtpd_client_restrictions =
        ...

Ini boleh dikonfigurasikan secara berbeza untuk setiap pelayan mel.

Saya mempunyai 3 pelayan mel yang boleh saya gunakan dan tetapan ini sangat berbeza kerana keperluan penggunaan yang berbeza.

Anda perlu mengkonfigurasinya dengan berhati-hati - jika tidak, spam akan mengalir kepada anda, atau lebih teruk lagi - spam akan keluar daripada anda.

# SPF
policyd-spf_time_limit = 3600

Menyediakan beberapa pemalam yang berkaitan dengan menyemak SPF surat masuk.

# 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

Tetapan ialah kami mesti menyediakan tandatangan DKIM dengan semua e-mel keluar.

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

Ini adalah butiran penting dalam penghalaan surat semasa menghantar surat daripada skrip PHP.

Fail "/etc/postfix/sdd_transport.pcre":

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

Di sebelah kiri ialah ungkapan biasa. Di sebelah kanan ialah label yang menandakan huruf itu.
Postfix mengikut label - akan mengambil kira beberapa baris konfigurasi lagi untuk surat tertentu.

Bagaimana tepatnya postfix akan dikonfigurasikan semula untuk surat tertentu akan ditunjukkan dalam "master.cf".

Baris 4, 5, 6 adalah yang utama. Bagi pihak domain mana kami menghantar surat, kami meletakkan label ini.
Tetapi medan "dari" tidak selalu ditunjukkan dalam skrip PHP dalam kod lama. Kemudian nama pengguna datang untuk menyelamatkan.

Artikel itu sudah meluas - Saya tidak mahu terganggu dengan menyediakan nginx+fpm.

Secara ringkas, untuk setiap tapak kami menetapkan pemilik pengguna linuxnya sendiri. Dan sewajarnya fpm-pool anda.

Fpm-pool menggunakan mana-mana versi php (ia sangat bagus apabila pada pelayan yang sama anda boleh menggunakan versi php yang berbeza dan juga php.ini yang berbeza untuk tapak jiran tanpa masalah).

Jadi, pengguna linux tertentu "www-domain2" mempunyai tapak web domain2.com. Tapak ini mempunyai kod untuk menghantar e-mel tanpa menyatakan medan dari.

Jadi, walaupun dalam kes ini, surat akan dihantar dengan betul dan tidak akan berakhir dengan spam.

"/etc/postfix/master.cf" saya kelihatan seperti ini:

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

Fail tidak disediakan sepenuhnya - ia sudah sangat besar.
Saya hanya perhatikan apa yang diubah.

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}

Ini adalah tetapan yang berkaitan dengan spamassasin, lebih lanjut mengenainya kemudian.

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

Kami membenarkan anda menyambung ke pelayan mel melalui port 587.
Untuk melakukan ini, anda mesti log masuk.

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

Dayakan semakan SPF.

apt-get install postfix-policyd-spf-python

Jom pasang pakej untuk pemeriksaan SPF di atas.

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

Dan ini adalah perkara yang paling menarik. Ini ialah keupayaan untuk menghantar surat untuk domain tertentu daripada alamat IPv4/IPv6 tertentu.

Ini dilakukan demi rDNS. rDNS ialah proses menerima rentetan melalui alamat IP.
Dan untuk mel, ciri ini digunakan untuk mengesahkan bahawa helo betul-betul sepadan dengan rDNS alamat dari mana e-mel itu dihantar.

Jika helo tidak sepadan dengan domain e-mel bagi pihak yang menerima surat itu, mata spam akan diberikan.

Helo tidak sepadan dengan rDNS - banyak mata spam diberikan.
Sehubungan itu, setiap domain mesti mempunyai alamat IP sendiri.
Untuk OVH - dalam konsol adalah mungkin untuk menentukan rDNS.
Untuk tech.ru - isu itu diselesaikan melalui sokongan.
Untuk AWS, isu ini diselesaikan melalui sokongan.
β€œinet_protocols” dan β€œsmtp_bind_address6” - kami mendayakan sokongan IPv6.
Untuk IPv6 anda juga perlu mendaftar rDNS.
"syslog_name" - dan ini adalah untuk kemudahan membaca log.

Beli sijil Saya cadangkan di sini.

Sediakan pautan postfix+dovecot di sini.

Menetapkan SPF.

============= Kandang Merpati =============

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

Menyediakan mysql, memasang pakej itu sendiri.

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

disable_plaintext_auth = yes
auth_mechanisms = plain login

Keizinan hanya disulitkan.

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

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

Di sini kami menunjukkan lokasi penyimpanan untuk huruf.

Saya mahu mereka disimpan dalam fail dan dikumpulkan mengikut domain.

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

Ini ialah fail konfigurasi dovecot utama.
Di sini kami melumpuhkan sambungan tidak terjamin.
Dan dayakan sambungan selamat.

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

Menyediakan ssl. Kami menunjukkan bahawa ssl diperlukan.
Dan sijil itu sendiri. Dan butiran penting ialah arahan "tempatan". Menunjukkan sijil ssl yang hendak digunakan semasa menyambung ke IPv4 setempat mana.

Dengan cara ini, IPv6 tidak dikonfigurasikan di sini, saya akan membetulkan peninggalan ini kemudian.
XX.XX.XX.X5 (domain2) - tiada sijil. Untuk menyambungkan pelanggan anda perlu menentukan domain1.com.
XX.XX.XX.X2 (domain3) - terdapat sijil, anda boleh menentukan domain1.com atau domain3.com untuk menyambungkan pelanggan.

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

protocol lda {
  mail_plugins = $mail_plugins sieve
}

Ini akan diperlukan untuk pembunuh spam pada masa hadapan.

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

protocol imap {
  mail_plugins = $mail_plugins antispam
}

Ini adalah pemalam antispam. Diperlukan untuk melatih spamassasin pada masa pemindahan ke/dari folder "Spam".

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

protocol pop3 {
}

Terdapat hanya fail sedemikian.

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

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

Menyediakan lmtp.

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

Tetapan latihan Spamassasin pada masa pemindahan ke/dari folder Spam.

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

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

Fail yang menyatakan perkara yang perlu dilakukan dengan surat masuk.

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

require ["fileinto", "mailbox"];

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

Anda perlu menyusun fail: "sievec default.sieve".

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

Menentukan fail sql untuk kebenaran.
Dan fail itu sendiri digunakan sebagai kaedah kebenaran.

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

Ini sepadan dengan tetapan serupa untuk postfix.

Fail "/etc/dovecot/dovecot.conf"

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

Fail konfigurasi utama.
Perkara penting ialah kami menunjukkan di sini - tambah protokol.

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

apt-get install spamassassin spamc

Mari pasang pakej.

adduser spamd --disabled-login

Mari tambah pengguna bagi pihaknya.

systemctl enable spamassassin.service

Kami mendayakan perkhidmatan spammassasin pemuatan automatik apabila dimuatkan.

Fail "/etc/default/spamassassin":

CRON=1

Dengan mendayakan pengemaskinian automatik peraturan "secara lalai".

Fail "/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

Anda perlu mencipta pangkalan data "sa" dalam mysql dengan pengguna "sa" dengan kata laluan "kata laluan" (ganti dengan sesuatu yang mencukupi).

report_safe - ini akan menghantar laporan e-mel spam dan bukannya surat.
use_bayes ialah tetapan pembelajaran mesin spamassassin.

Tetapan pembunuh spam yang selebihnya telah digunakan lebih awal dalam artikel.

Tetapan umum "spamassassin".
Perihal mengalihkan e-mel Spam baharu ke folder β€œSpam” IMAP.
Mengenai gabungan ringkas Dovecot + SpamAssassin.
Saya mengesyorkan membaca teori pembelajaran spamassasin apabila memindahkan huruf dalam folder imap (dan saya tidak mengesyorkan menggunakannya).

============= Rayuan kepada masyarakat =============

Saya juga ingin melontarkan idea kepada masyarakat tentang cara meningkatkan tahap keselamatan surat yang dimajukan. Memandangkan saya begitu mendalami topik mel.

Supaya pengguna boleh mencipta sepasang kunci pada kliennya (pandangan, thunderbird, pemalam-pelayar, ...). Awam dan swasta. Awam - hantar ke DNS. Peribadi - menjimatkan pelanggan. Pelayan mel akan dapat menggunakan kunci awam untuk dihantar kepada penerima tertentu.

Dan untuk melindungi daripada spam dengan surat sedemikian (ya, pelayan mel tidak akan dapat melihat kandungan) - anda perlu memperkenalkan 3 peraturan:

  1. Tandatangan DKIM sebenar wajib, SPF wajib, rDNS wajib.
  2. Rangkaian saraf mengenai subjek latihan antispam + pangkalan data untuknya di sisi pelanggan.
  3. Algoritma penyulitan mestilah sedemikian sehingga pihak penghantar mesti membelanjakan 100 kali lebih kuasa CPU pada penyulitan daripada pihak penerima.

Sebagai tambahan kepada surat awam, bangunkan surat cadangan standard "untuk memulakan surat-menyurat selamat". Salah seorang pengguna (peti mel) menghantar surat dengan lampiran ke peti mel lain. Surat itu mengandungi cadangan teks untuk memulakan saluran komunikasi selamat untuk surat-menyurat dan kunci awam pemilik peti mel (dengan kunci peribadi di sebelah pelanggan).

Anda juga boleh membuat beberapa kunci khusus untuk setiap surat-menyurat. Pengguna penerima boleh menerima tawaran ini dan menghantar kunci awamnya (juga dibuat khusus untuk surat-menyurat ini). Seterusnya, pengguna pertama menghantar surat kawalan perkhidmatan (disulitkan dengan kunci awam pengguna kedua) - setelah menerimanya, pengguna kedua boleh menganggap saluran komunikasi yang terbentuk boleh dipercayai. Seterusnya, pengguna kedua menghantar surat kawalan - dan kemudian pengguna pertama juga boleh menganggap saluran yang dibentuk selamat.

Untuk memerangi pemintasan kunci di jalan raya, protokol mesti menyediakan kemungkinan untuk menghantar sekurang-kurangnya satu kunci awam menggunakan pemacu kilat.

Dan perkara yang paling penting ialah semuanya berfungsi (persoalannya ialah "siapa yang akan membayarnya?"):
Masukkan sijil pos bermula dari $10 selama 3 tahun. Yang akan membolehkan pengirim menunjukkan dalam dns bahawa "kunci awam saya ada di sana." Dan mereka akan memberi anda peluang untuk memulakan sambungan selamat. Pada masa yang sama, menerima sambungan sedemikian adalah percuma.
gmail akhirnya mengewangkan penggunanya. Untuk $10 setiap 3 tahun - hak untuk mencipta saluran surat-menyurat selamat.

============= Kesimpulan ==============

Untuk menguji keseluruhan artikel, saya akan menyewa pelayan khusus selama sebulan dan membeli domain dengan sijil SSL.

Tetapi keadaan hidup berkembang jadi isu ini berlarutan selama 2 bulan.
Oleh itu, apabila saya mempunyai masa lapang lagi, saya memutuskan untuk menerbitkan artikel itu seperti sedia ada, dan bukannya mengambil risiko bahawa penerbitan itu akan berlarutan selama setahun lagi.

Jika terdapat banyak soalan seperti "tetapi ini tidak diterangkan dengan terperinci yang mencukupi", maka mungkin akan ada kekuatan untuk mengambil pelayan khusus dengan domain baharu dan sijil SSL baharu dan menerangkannya dengan lebih terperinci dan, kebanyakannya. yang penting, kenal pasti semua butiran penting yang hilang.

Saya juga ingin mendapatkan maklum balas tentang idea tentang sijil pos. Jika anda menyukai idea itu, saya akan cuba mencari kekuatan untuk menulis draf untuk rfc.

Apabila menyalin sebahagian besar artikel, berikan pautan ke artikel ini.
Apabila menterjemah ke bahasa lain, berikan pautan ke artikel ini.
Saya akan cuba menterjemahkannya ke dalam bahasa Inggeris sendiri dan meninggalkan rujukan silang.


Sumber: www.habr.com

Tambah komen