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

Artikel ini membahas tentang cara menyiapkan server email modern.
Postfix + Tempat Tidur Merpati. SPF + DKIM + rDNS. Dengan IPv6.
Dengan enkripsi TSL. Dengan dukungan untuk banyak domain - bagian dengan sertifikat SSL asli.
Dengan perlindungan antispam dan rating antispam yang tinggi dari server email lain.
Mendukung banyak antarmuka fisik.
Dengan OpenVPN, koneksinya melalui IPv4, dan yang menyediakan IPv6.

Jika Anda tidak ingin mempelajari semua teknologi ini, tetapi ingin menyiapkan server seperti itu, maka artikel ini cocok untuk Anda.

Artikel ini tidak berusaha menjelaskan setiap detailnya. Penjelasannya mengarah pada apa yang tidak dikonfigurasikan sebagai standar atau penting dari sudut pandang konsumen.

Motivasi untuk membuat server email telah menjadi impian saya sejak lama. Ini mungkin terdengar bodoh, tapi IMHO, ini jauh lebih baik daripada memimpikan mobil baru dari merek favorit Anda.

Ada dua motivasi untuk menyiapkan IPv6. Seorang spesialis TI perlu mempelajari teknologi baru secara terus-menerus agar dapat bertahan hidup. Saya ingin memberikan kontribusi sederhana saya dalam perjuangan melawan sensor.

Motivasi menyiapkan OpenVPN hanyalah agar IPv6 berfungsi di mesin lokal.
Motivasi untuk menyiapkan beberapa antarmuka fisik adalah bahwa di server saya, saya memiliki satu antarmuka “lambat tapi tidak terbatas” dan antarmuka lainnya “cepat tetapi dengan tarif”.

Motivasi pengaturan Bind adalah ISP saya menyediakan server DNS yang tidak stabil, dan google juga terkadang gagal. Saya ingin server DNS yang stabil untuk penggunaan pribadi.

Motivasi menulis artikel - Saya menulis drafnya 10 bulan yang lalu, dan saya sudah melihatnya dua kali. Sekalipun penulis selalu membutuhkannya, kemungkinan besar orang lain juga akan membutuhkannya.

Tidak ada solusi universal untuk server email. Tapi saya akan mencoba menulis sesuatu seperti “lakukan ini dan kemudian, ketika semuanya berjalan sebagaimana mestinya, buang hal-hal tambahan.”

Perusahaan tech.ru memiliki server Colocation. Dimungkinkan untuk membandingkan dengan OVH, Hetzner, AWS. Untuk mengatasi masalah ini, kerjasama dengan tech.ru akan jauh lebih efektif.

Debian 9 diinstal di server.

Server memiliki 2 antarmuka `eno1` dan `eno2`. Yang pertama tidak terbatas, dan yang kedua cepat.

Terdapat 3 alamat IP statis, XX.XX.XX.X0 dan XX.XX.XX.X1 dan XX.XX.XX.X2 pada antarmuka `eno1` dan XX.XX.XX.X5 pada antarmuka `eno2` .

Tersedia XXXX:XXXX:XXXX:XXXX::/64 kumpulan alamat IPv6 yang ditetapkan ke antarmuka `eno1` dan darinya XXXX:XXXX:XXXX:XXXX:1:2::/96 ditetapkan ke `eno2` atas permintaan saya.

Ada 3 domain `domain1.com`, `domain2.com`, `domain3.com`. Ada sertifikat SSL untuk `domain1.com` dan `domain3.com`.

Saya memiliki akun Google yang ingin saya tautkan ke kotak surat saya[email dilindungi]` (menerima email dan mengirim email langsung dari antarmuka Gmail).
Harus ada kotak surat`[email dilindungi]`, salinan email yang ingin saya lihat di gmail saya. Dan jarang sekali bisa mengirimkan sesuatu atas nama `[email dilindungi]` melalui antarmuka web.

Harus ada kotak surat`[email dilindungi]`, yang akan digunakan Ivanov dari iPhone-nya.

Email yang dikirim harus mematuhi semua persyaratan antispam modern.
Harus ada tingkat enkripsi tertinggi yang disediakan di jaringan publik.
Harus ada dukungan IPv6 untuk mengirim dan menerima surat.
Harus ada SpamAssassin yang tidak akan pernah menghapus email. Dan itu akan terpental atau dilewati atau dikirim ke folder “Spam” IMAP.
Pembelajaran otomatis SpamAssassin harus dikonfigurasi: jika saya memindahkan surat ke folder Spam, surat itu akan belajar dari ini; jika saya memindahkan surat dari folder Spam, ia akan belajar dari ini. Hasil pelatihan SpamAssassin akan mempengaruhi apakah surat tersebut masuk ke folder Spam.
Skrip PHP harus dapat mengirim email atas nama domain apa pun di server tertentu.
Harus ada layanan openvpn, dengan kemampuan untuk menggunakan IPv6 pada klien yang tidak memiliki IPv6.

Pertama, Anda perlu mengkonfigurasi antarmuka dan perutean, termasuk IPv6.
Kemudian Anda perlu mengkonfigurasi OpenVPN, yang akan terhubung melalui IPv4 dan memberikan alamat IPv6 statis-nyata kepada klien. Klien ini akan memiliki akses ke semua layanan IPv6 di server dan akses ke sumber daya IPv6 di Internet.
Maka Anda perlu mengkonfigurasi Postfix untuk mengirim surat + SPF + DKIM + rDNS dan hal-hal kecil serupa lainnya.
Kemudian Anda perlu mengkonfigurasi Dovecot dan mengkonfigurasi Multidomain.
Kemudian Anda perlu mengkonfigurasi SpamAssassin dan mengkonfigurasi pelatihan.
Terakhir, instal Bind.

============= Multi-antarmuka =============

Untuk mengkonfigurasi antarmuka, Anda perlu menulis ini di “/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

Pengaturan ini dapat diterapkan pada server mana pun di tech.ru (dengan sedikit koordinasi dengan dukungan) dan akan segera berfungsi sebagaimana mestinya.

Jika Anda memiliki pengalaman menyiapkan hal serupa untuk Hetzner, OVH, berbeda di sana. Lebih sulit.

eno1 adalah nama kartu jaringan #1 (lambat tapi tidak terbatas).
eno2 adalah nama kartu jaringan #2 (cepat, tetapi dengan tarif).
tun0 adalah nama kartu jaringan virtual dari OpenVPN.
XX.XX.XX.X0 - IPv4 #1 di eno1.
XX.XX.XX.X1 - IPv4 #2 di eno1.
XX.XX.XX.X2 - IPv4 #3 di eno1.
XX.XX.XX.X5 - IPv4 #1 di eno2.
XX.XX.XX.1 - gerbang IPv4.
XXXX:XXXX:XXXX:XXXX::/64 - IPv6 untuk seluruh server.
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 dicatat bahwa ini dapat/harus dilakukan secara berbeda. Tentukan saklar IPv6).
dns-nameservers - 127.0.0.1 ditunjukkan (karena bind diinstal secara lokal) dan 213.248.1.6 (ini dari tech.ru).

“table eno1t” dan “table eno2t” - arti dari aturan rute ini adalah lalu lintas yang masuk melalui eno1 -> akan keluar melaluinya, dan lalu lintas yang masuk melalui eno2 -> akan keluar melaluinya. Dan juga koneksi yang dimulai oleh server akan melalui eno1.

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

Dengan perintah ini kami menentukan bahwa setiap lalu lintas yang tidak dapat dipahami yang termasuk dalam aturan apa pun yang bertanda “tabel eno1t” -> dikirim ke antarmuka eno1.

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

Dengan perintah ini kami menentukan bahwa setiap lalu lintas yang dimulai oleh server harus diarahkan ke antarmuka eno1.

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

Dengan perintah ini kita menetapkan aturan untuk menandai lalu lintas.

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

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

Dengan perintah ini kami mengatur rute dari klien OpenVPN ke IPv4 lokal kecuali XX.XX.XX.X0.
Saya masih tidak mengerti mengapa perintah 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 antarmuka itu sendiri. Server akan menggunakannya sebagai alamat “keluar”. Tidak akan digunakan lagi dengan cara apa pun.

Mengapa ":1:1::" begitu rumit? Agar OpenVPN berfungsi dengan benar dan hanya untuk ini. Lebih lanjut tentang ini nanti.

Mengenai topik gateway - begitulah cara kerjanya dan tidak masalah. Namun cara yang benar adalah dengan menunjukkan di sini IPv6 dari switch yang terhubung dengan server.

Namun, karena alasan tertentu IPv6 berhenti berfungsi jika saya melakukan ini. Ini mungkin semacam masalah tech.ru.

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

Ini menambahkan alamat IPv6 ke antarmuka. Jika Anda memerlukan seratus alamat, itu berarti seratus baris dalam file 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 mencatat alamat dan subnet dari semua antarmuka untuk memperjelas.
eno1 - harus "/64" - karena ini adalah keseluruhan kumpulan alamat kami.
tun0 - subnet harus lebih besar dari eno1. Jika tidak, konfigurasi gateway IPv6 untuk klien OpenVPN tidak dapat dilakukan.
eno2 - subnet harus lebih besar dari tun0. Jika tidak, klien OpenVPN tidak akan dapat mengakses alamat IPv6 lokal.
Untuk kejelasan, saya memilih langkah subnet 16, tetapi jika diinginkan, Anda bahkan dapat melakukan langkah “1”.
Jadi, 64+16 = 80, dan 80+16 = 96.

Untuk lebih jelasnya:
XXXX:XXXX:XXXX:XXXX:1:1:YYYY:YYYY adalah alamat yang harus ditetapkan ke situs atau layanan tertentu pada antarmuka eno1.
XXXX:XXXX:XXXX:XXXX:1:2:YYYY:YYYY adalah alamat yang harus ditetapkan ke situs atau layanan tertentu pada antarmuka eno2.
XXXX:XXXX:XXXX:XXXX:1:3:YYYY:YYYY adalah alamat yang harus ditetapkan ke klien OpenVPN atau digunakan sebagai alamat layanan OpenVPN.

Untuk mengkonfigurasi jaringan, server harus dapat di-restart.
Perubahan IPv4 diambil saat dijalankan (pastikan untuk membungkusnya di layar - jika tidak, perintah ini hanya akan membuat jaringan di server mogok):

/etc/init.d/networking restart

Tambahkan ke akhir file “/etc/iproute2/rt_tables”:

100 eno1t
101 eno2t

Tanpa ini, Anda tidak dapat menggunakan tabel khusus di file “/etc/network/interfaces”.
Nomornya harus unik dan kurang dari 65535.

Perubahan IPv6 dapat diubah dengan mudah tanpa me-reboot, tetapi untuk melakukan ini Anda perlu mempelajari setidaknya tiga perintah:

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

Mengatur "/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 adalah pengaturan "sysctl" server saya. Izinkan saya menunjukkan sesuatu yang penting.

net.ipv4.ip_forward = 1

Tanpa ini, OpenVPN tidak akan berfungsi sama sekali.

net.ipv6.ip_nonlocal_bind = 1

Siapa pun yang mencoba mengikat IPv6 (misalnya nginx) segera setelah antarmuka aktif akan menerima kesalahan. Bahwa alamat ini tidak tersedia.

Untuk menghindari situasi seperti itu, pengaturan seperti itu dibuat.

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

Tanpa pengaturan IPv6 ini, lalu lintas dari klien OpenVPN tidak akan tersebar ke seluruh dunia.

Pengaturan lainnya mungkin tidak relevan atau saya tidak ingat untuk apa pengaturan tersebut.
Namun untuk berjaga-jaga, saya membiarkannya “sebagaimana adanya”.

Agar perubahan pada file ini dapat diambil tanpa me-reboot server, Anda perlu menjalankan perintah:

sysctl -p

Detail lebih lanjut tentang aturan “tabel”: habr.com/post/108690

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

OpenVPN IPv4 tidak berfungsi tanpa iptables.

Iptables saya 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 adalah alamat IPv4 statis saya dari mesin lokal.
10.8.0.0/24 - Jaringan terbuka IPv4. Alamat IPv4 untuk klien openvpn.
Konsistensi aturan itu 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 batasan sehingga hanya saya yang bisa menggunakan OpenVPN dari IP statis 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 meneruskan paket IPv4 antara klien OpenVPN dan Internet, Anda perlu mendaftarkan salah satu perintah berikut.

Untuk berbagai kasus, salah satu opsi tidak cocok.
Kedua perintah tersebut cocok untuk kasus saya.
Setelah membaca dokumentasi, saya memilih opsi pertama karena menggunakan lebih sedikit CPU.

Agar semua pengaturan iptables dapat diambil setelah reboot, Anda perlu menyimpannya di suatu tempat.

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

Nama-nama tersebut tidak dipilih secara kebetulan. Mereka digunakan oleh paket "iptables-persistent".

apt-get install iptables-persistent

Menginstal paket utama OpenVPN:

apt-get install openvpn easy-rsa

Mari siapkan templat untuk sertifikat (gantikan nilai Anda):

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

Mari edit pengaturan template sertifikat:

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 sertifikat server:

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

Mari persiapkan kemampuan untuk membuat file final “client-name.opvn”:

mkdir -p ~/client-configs/files
chmod 700 ~/client-configs/files
cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf ~/client-configs/base.conf
mcedit ~/client-configs/base.conf

# Client mode
client

# Interface tunnel type
dev tun

# TCP protocol
proto tcp-client

# Address/Port of VPN server
remote XX.XX.XX.X0 1194

# Don't bind to local port/address
nobind

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

# Remote peer must have a signed certificate
remote-cert-tls server
ns-cert-type server

# Enable compression
comp-lzo

# Custom
ns-cert-type server
tls-auth ta.key 1
cipher DES-EDE3-CBC

Mari kita siapkan skrip yang akan menggabungkan semua file menjadi satu file 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

Membuat klien OpenVPN pertama:

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

File “~/client-configs/files/client-name.ovpn” dikirim ke perangkat klien.

Untuk klien iOS Anda perlu melakukan trik berikut:
Isi tag “tls-auth” harus tanpa komentar.
Dan juga letakkan “key-direction 1” tepat sebelum tag “tls-auth”.

Mari konfigurasikan konfigurasi server 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 statis untuk setiap klien (tidak perlu, tapi saya menggunakannya):

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

Detail yang paling sulit dan penting.

Sayangnya, OpenVPN belum mengetahui cara mengkonfigurasi gateway IPv6 secara mandiri untuk klien.
Anda harus meneruskan ini "secara manual" untuk setiap klien.

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

File “/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

File “/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 skrip menggunakan file “/etc/openvpn/variables”:

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

Saya sulit mengingat mengapa ditulis seperti ini.

Sekarang netmask = 112 terlihat aneh (seharusnya ada 96 di sana).
Dan awalannya aneh, tidak cocok dengan jaringan tun0.
Tapi baiklah, aku akan membiarkannya apa adanya.

cipher DES-EDE3-CBC

Ini bukan untuk semua orang - saya memilih metode mengenkripsi koneksi ini.

Pelajari lebih lanjut tentang menyiapkan OpenVPN IPv4.

Pelajari lebih lanjut tentang menyiapkan OpenVPN IPv6.

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

Menginstal paket utama:

apt-get install postfix

Saat menginstal, pilih "situs internet".

"/etc/postfix/main.cf" saya terlihat 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 kita lihat detail konfigurasi ini.

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

Menurut warga Khabrovsk, blok ini berisi “informasi yang salah dan tesis yang salah.”Hanya 8 tahun setelah memulai karir saya, saya mulai memahami cara kerja SSL.

Oleh karena itu, saya akan menjelaskan cara menggunakan SSL (tanpa menjawab pertanyaan “Bagaimana cara kerjanya?” dan “Mengapa cara kerjanya?”).

Dasar enkripsi modern adalah penciptaan pasangan kunci (dua rangkaian karakter yang sangat panjang).

Satu “kunci” bersifat pribadi, kunci lainnya adalah “publik”. Kami menjaga rahasia kunci pribadi dengan sangat hati-hati. Kami mendistribusikan kunci publik kepada semua orang.

Dengan menggunakan kunci publik, Anda dapat mengenkripsi serangkaian teks sehingga hanya pemilik kunci pribadi yang dapat mendekripsinya.
Ya, itulah dasar keseluruhan dari teknologi ini.

Langkah #1 - situs https.
Saat mengakses suatu situs, browser mengetahui dari server web bahwa situs tersebut adalah https dan oleh karena itu meminta kunci publik.
Server web memberikan kunci publik. Browser menggunakan kunci publik untuk mengenkripsi permintaan http dan mengirimkannya.
Isi permintaan http hanya dapat dibaca oleh mereka yang memiliki kunci pribadi, yaitu hanya server tempat permintaan dibuat.
Permintaan Http berisi setidaknya URI. Oleh karena itu, jika suatu negara mencoba membatasi akses tidak ke seluruh situs, tetapi ke halaman tertentu, maka hal ini tidak mungkin dilakukan untuk situs https.

Langkah #2 - respons terenkripsi.
Server web memberikan jawaban yang dapat dibaca dengan mudah di jalan.
Solusinya sangat sederhana - browser secara lokal menghasilkan pasangan kunci privat-publik yang sama untuk setiap situs https.
Dan bersamaan dengan permintaan kunci publik situs, ia mengirimkan kunci publik lokalnya.
Server web mengingatnya dan, ketika mengirim respons http, mengenkripsinya dengan kunci publik klien tertentu.
Sekarang http-response hanya dapat didekripsi oleh pemilik kunci pribadi browser klien (yaitu klien itu sendiri).

Langkah No. 3 - membuat koneksi aman melalui saluran publik.
Ada kerentanan dalam contoh No. 2 - tidak ada yang menghalangi simpatisan untuk mencegat permintaan http dan mengedit informasi tentang kunci publik.
Dengan demikian, perantara akan melihat dengan jelas seluruh isi pesan yang dikirim dan diterima hingga saluran komunikasi berubah.
Mengatasi hal ini sangatlah sederhana - cukup kirimkan kunci publik browser sebagai pesan yang dienkripsi dengan kunci publik server web.
Server web kemudian mengirimkan respons seperti “kunci publik Anda seperti ini” terlebih dahulu dan mengenkripsi pesan ini dengan kunci publik yang sama.
Browser melihat responsnya - jika pesan "kunci publik Anda seperti ini" diterima - maka ini adalah jaminan 100% bahwa saluran komunikasi ini aman.
Seberapa amankah itu?
Penciptaan saluran komunikasi yang aman terjadi pada kecepatan ping*2. Misalnya 20ms.
Penyerang harus memiliki kunci pribadi salah satu pihak terlebih dahulu. Atau temukan kunci pribadi dalam beberapa milidetik.
Meretas satu kunci pribadi modern akan memakan waktu puluhan tahun di superkomputer.

Langkah #4 - database publik dari kunci publik.
Jelasnya, dalam keseluruhan cerita ini ada peluang bagi penyerang untuk duduk di saluran komunikasi antara klien dan server.
Klien dapat berpura-pura menjadi server, dan server dapat berpura-pura menjadi klien. Dan tiru sepasang kunci di kedua arah.
Kemudian penyerang akan melihat semua lalu lintas dan dapat “mengedit” lalu lintas tersebut.
Misalnya, mengubah alamat tujuan pengiriman uang atau menyalin kata sandi dari perbankan online atau memblokir konten yang “tidak pantas”.
Untuk memerangi penyerang tersebut, mereka membuat database publik dengan kunci publik untuk setiap situs https.
Setiap browser “tahu” tentang keberadaan sekitar 200 database tersebut. Ini sudah diinstal sebelumnya di setiap browser.
“Pengetahuan” didukung oleh kunci publik dari setiap sertifikat. Artinya, koneksi ke masing-masing otoritas sertifikasi tertentu tidak dapat dipalsukan.

Sekarang ada pemahaman sederhana tentang cara menggunakan SSL untuk https.
Jika Anda menggunakan otak Anda, akan menjadi jelas bagaimana layanan khusus dapat meretas sesuatu dalam struktur ini. Namun hal ini akan merugikan mereka dengan upaya yang sangat besar.
Dan organisasi yang lebih kecil dari NSA atau CIA - hampir tidak mungkin untuk meretas tingkat perlindungan yang ada, bahkan untuk VIP.

Saya juga akan menambahkan tentang koneksi ssh. Tidak ada kunci publik di sana, jadi apa yang dapat Anda lakukan? Masalah ini diselesaikan dengan dua cara.
Opsi ssh-demi-kata sandi:
Selama koneksi pertama, klien ssh harus memperingatkan bahwa kita memiliki kunci publik baru dari server ssh.
Dan selama koneksi lebih lanjut, jika peringatan “kunci publik baru dari server ssh” muncul, itu berarti mereka mencoba menguping Anda.
Atau Anda disadap pada koneksi pertama Anda, tetapi sekarang Anda berkomunikasi dengan server tanpa perantara.
Sebenarnya, karena fakta penyadapan mudah, cepat dan mudah terungkap, serangan ini hanya digunakan dalam kasus khusus untuk klien tertentu.

Opsi ssh-demi-kunci:
Kami mengambil flash drive, menulis kunci pribadi untuk server ssh di dalamnya (ada istilah dan banyak nuansa penting untuk ini, tapi saya sedang menulis program pendidikan, bukan instruksi penggunaan).
Kami meninggalkan kunci publik di mesin tempat klien ssh berada dan kami juga merahasiakannya.
Kami membawa flash drive ke server, memasukkannya, menyalin kunci pribadi, dan membakar flash drive dan menyebarkan abunya ke angin (atau setidaknya memformatnya dengan nol).
Itu saja - setelah operasi seperti itu, tidak mungkin meretas koneksi ssh seperti itu. Tentu saja, dalam 10 tahun, lalu lintas dapat dilihat di superkomputer - tapi itu lain ceritanya.

Saya minta maaf untuk offtopic.

Jadi sekarang teorinya sudah diketahui. Saya akan bercerita tentang alur pembuatan sertifikat SSL.

Dengan menggunakan “openssl genrsa” kita membuat kunci privat dan “kosong” untuk kunci publik.
Kami mengirimkan “kosong” ke perusahaan pihak ketiga, dan kami membayar sekitar $9 untuk sertifikat paling sederhana.

Setelah beberapa jam, kami menerima kunci "publik" dan serangkaian beberapa kunci publik dari perusahaan pihak ketiga ini.

Mengapa perusahaan pihak ketiga harus membayar pendaftaran kunci publik saya adalah pertanyaan terpisah, kami tidak akan mempertimbangkannya di sini.

Sekarang sudah jelas apa maksud dari prasasti tersebut:

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

Folder “/etc/ssl” berisi semua file untuk masalah ssl.
domain1.com — nama domain.
2018 adalah tahun penciptaan kunci.
"kunci" - sebutan bahwa file tersebut adalah kunci pribadi.

Dan arti dari file ini:

smtpd_tls_cert_file=/etc/ssl/domain1.com.2018.chained.crt
domain1.com — nama domain.
2018 adalah tahun penciptaan kunci.
chained - sebutan bahwa ada rantai kunci publik (yang pertama adalah kunci publik kita dan sisanya berasal dari perusahaan yang menerbitkan kunci publik tersebut).
crt - sebutan bahwa ada sertifikat yang sudah jadi (kunci publik dengan penjelasan teknis).

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

Pengaturan ini tidak digunakan dalam kasus ini, namun ditulis sebagai contoh.

Karena kesalahan pada parameter ini akan menyebabkan spam dikirim dari server Anda (tanpa kemauan Anda).

Kemudian buktikan kepada semua orang bahwa Anda tidak bersalah.

recipient_delimiter = +

Banyak orang mungkin tidak mengetahuinya, tetapi ini adalah karakter standar untuk menentukan peringkat email, dan didukung oleh sebagian besar server email modern.

Misalnya, jika Anda memiliki kotak surat "[email dilindungi]"coba kirim ke"[email dilindungi]"- lihat apa hasilnya.

inet_protocols = ipv4

Ini mungkin membingungkan.

Tapi bukan hanya itu saja. Setiap domain baru secara default hanya IPv4, lalu saya aktifkan IPv6 untuk masing-masing domain secara terpisah.

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 menentukan bahwa semua email masuk masuk ke dovecot.
Dan aturan untuk domain, kotak surat, alias - lihat di database.

/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 mengetahui bahwa email dapat diterima untuk pengiriman lebih lanjut hanya setelah otorisasi dengan dovecot.

Saya benar-benar tidak begitu mengerti mengapa ini diduplikasi di sini. Kami telah menentukan semua yang diperlukan di “virtual_transport”.

Namun sistem postfix sudah sangat tua - mungkin merupakan kemunduran dari masa lalu.

smtpd_recipient_restrictions =
        ...

smtpd_helo_restrictions =
        ...

smtpd_client_restrictions =
        ...

Ini dapat dikonfigurasi secara berbeda untuk setiap server email.

Saya memiliki 3 server email dan pengaturan ini sangat berbeda karena persyaratan penggunaan yang berbeda.

Anda perlu mengkonfigurasinya dengan hati-hati - jika tidak, spam akan masuk ke Anda, atau lebih buruk lagi - spam akan keluar dari Anda.

# SPF
policyd-spf_time_limit = 3600

Menyiapkan beberapa plugin terkait pengecekan 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

Settingannya kita harus memberikan tanda tangan DKIM pada semua email keluar.

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

Ini adalah detail penting dalam perutean surat saat mengirim surat dari skrip PHP.

Berkas “/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 adalah ekspresi reguler. Di sebelah kanan ada label yang menandai surat itu.
Postfix sesuai dengan labelnya - akan memperhitungkan beberapa baris konfigurasi lagi untuk huruf tertentu.

Bagaimana tepatnya postfix akan dikonfigurasi ulang untuk huruf tertentu akan ditunjukkan di “master.cf”.

Baris 4, 5, 6 adalah yang utama. Atas nama domain mana kami mengirim surat, kami memberi label ini.
Namun kolom “from” tidak selalu ditunjukkan dalam skrip PHP pada kode lama. Kemudian nama pengguna datang untuk menyelamatkan.

Artikelnya sudah ekstensif - saya tidak ingin terganggu dengan menyiapkan nginx+fpm.

Singkatnya, untuk setiap situs kami menetapkan pemilik pengguna linuxnya sendiri. Dan sesuai dengan fpm-pool Anda.

Fpm-pool menggunakan versi php apa pun (sangat bagus bila di server yang sama Anda dapat menggunakan versi php yang berbeda dan bahkan php.ini yang berbeda untuk situs tetangga tanpa masalah).

Jadi, pengguna linux tertentu “www-domain2” memiliki situs web domain2.com. Situs ini memiliki kode untuk mengirim email tanpa menentukan kolom dari.

Jadi, meskipun demikian, surat-surat tersebut akan terkirim dengan benar dan tidak akan pernah berakhir di spam.

"/etc/postfix/master.cf" saya terlihat 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

File tidak disediakan secara lengkap - ukurannya sudah sangat besar.
Saya hanya mencatat 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 pengaturan yang terkait dengan spamassasin, akan dijelaskan lebih lanjut nanti.

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 mengizinkan Anda terhubung ke server email melalui port 587.
Untuk melakukan ini, Anda harus login.

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

Aktifkan pemeriksaan SPF.

apt-get install postfix-policyd-spf-python

Mari kita install paket 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 inilah hal yang paling menarik. Ini adalah kemampuan untuk mengirim surat untuk domain tertentu dari alamat IPv4/IPv6 tertentu.

Ini dilakukan demi rDNS. rDNS adalah proses menerima string berdasarkan alamat IP.
Dan untuk email, fitur ini digunakan untuk mengonfirmasi bahwa helo sama persis dengan rDNS alamat asal pengiriman email.

Jika helo tidak cocok dengan domain email yang mengirim surat, poin spam diberikan.

Helo tidak cocok dengan rDNS - banyak poin spam yang diberikan.
Oleh karena itu, setiap domain harus memiliki alamat IP sendiri.
Untuk OVH - di konsol dimungkinkan untuk menentukan rDNS.
Untuk tech.ru - masalah diselesaikan melalui dukungan.
Untuk AWS, masalah ini diselesaikan melalui dukungan.
“inet_protocols” dan “smtp_bind_address6” - kami mengaktifkan dukungan IPv6.
Untuk IPv6 Anda juga perlu mendaftarkan rDNS.
“syslog_name” - dan ini untuk kemudahan membaca log.

Beli sertifikat Saya merekomendasikan di sini.

Menyiapkan tautan postfix+dovecot di sini.

Mengatur SPF.

============= Tempat perlindungan merpati =============

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

Menyiapkan mysql, menginstal paket-paket itu sendiri.

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

disable_plaintext_auth = yes
auth_mechanisms = plain login

Otorisasi hanya dienkripsi.

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

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

Di sini kami menunjukkan lokasi penyimpanan surat-surat tersebut.

Saya ingin mereka disimpan dalam file dan dikelompokkan berdasarkan domain.

File "/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 adalah file konfigurasi dovecot utama.
Di sini kami menonaktifkan koneksi tidak aman.
Dan aktifkan koneksi aman.

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

Menyiapkan SSL. Kami menunjukkan bahwa SSL diperlukan.
Dan sertifikat itu sendiri. Dan detail penting adalah arahan “lokal”. Menunjukkan sertifikat SSL mana yang akan digunakan saat menyambung ke IPv4 lokal mana.

Omong-omong, IPv6 tidak dikonfigurasi di sini, saya akan memperbaiki kelalaian ini nanti.
XX.XX.XX.X5 (domain2) - tanpa sertifikat. Untuk menghubungkan klien, Anda perlu menentukan domain1.com.
XX.XX.XX.X2 (domain3) - ada sertifikat, Anda dapat menentukan domain1.com atau domain3.com untuk menghubungkan klien.

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

protocol lda {
  mail_plugins = $mail_plugins sieve
}

Ini akan diperlukan untuk pembunuh spam di masa depan.

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

protocol imap {
  mail_plugins = $mail_plugins antispam
}

Ini adalah plugin antispam. Diperlukan untuk melatih pembunuh spam pada saat transfer ke/dari folder “Spam”.

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

protocol pop3 {
}

Hanya ada file seperti itu.

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

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

Menyiapkan lmtp.

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

Pengaturan pelatihan Spamassasin pada saat transfer ke/dari folder Spam.

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

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

File yang menentukan apa yang harus dilakukan dengan surat masuk.

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

require ["fileinto", "mailbox"];

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

Anda perlu mengkompilasi file: “sievec default.sieve”.

File "/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 file sql untuk otorisasi.
Dan file itu sendiri digunakan sebagai metode otorisasi.

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

Hal ini sesuai dengan pengaturan serupa untuk postfix.

File "/etc/dovecot/dovecot.conf"

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

File konfigurasi utama.
Hal penting yang kami tunjukkan di sini adalah menambahkan protokol.

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

apt-get install spamassassin spamc

Mari kita instal paketnya.

adduser spamd --disabled-login

Mari tambahkan pengguna atas nama siapa.

systemctl enable spamassassin.service

Kami mengaktifkan layanan pembunuh spam yang memuat otomatis saat memuat.

File "/etc/default/spamssassin":

CRON=1

Dengan mengaktifkan pembaruan otomatis aturan “secara default”.

Berkas “/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 membuat database "sa" di mysql dengan pengguna "sa" dengan kata sandi "kata sandi" (ganti dengan yang sesuai).

report_safe - ini akan mengirimkan laporan email spam, bukan surat.
use_bayes adalah pengaturan pembelajaran mesin pembunuh spam.

Pengaturan spamassassin lainnya telah digunakan di awal artikel.

Pengaturan umum "spamassassin".
Tentang memindahkan email Spam baru ke folder “Spam” IMAP.
Tentang kombinasi sederhana Dovecot + SpamAssassin.
Saya sarankan membaca teori pembelajaran spamassasin saat memindahkan huruf di folder imap (dan saya tidak menyarankan menggunakannya).

============= Himbauan kepada masyarakat =============

Saya juga ingin menyampaikan gagasan kepada masyarakat tentang bagaimana meningkatkan tingkat keamanan surat penerusan. Karena saya begitu mendalami topik surat.

Sehingga pengguna dapat membuat sepasang kunci pada kliennya (outlook, thunderbird, plugin browser, ...). Publik dan swasta. Publik - kirim ke DNS. Pribadi - simpan di klien. Server email akan dapat menggunakan kunci publik untuk mengirim ke penerima tertentu.

Dan untuk melindungi dari spam dengan surat seperti itu (ya, server email tidak akan dapat melihat kontennya) - Anda perlu memperkenalkan 3 aturan:

  1. Wajib tanda tangan asli DKIM, wajib SPF, wajib rDNS.
  2. Jaringan saraf tentang pelatihan antispam + database untuk itu di sisi klien.
  3. Algoritme enkripsi harus sedemikian rupa sehingga pihak pengirim harus menghabiskan daya CPU 100 kali lebih banyak untuk enkripsi dibandingkan pihak penerima.

Selain surat publik, kembangkan surat proposal standar “untuk memulai korespondensi yang aman.” Salah satu pengguna (kotak surat) mengirimkan surat dengan lampiran ke kotak surat lain. Surat itu berisi proposal teks untuk memulai saluran komunikasi aman untuk korespondensi dan kunci publik pemilik kotak surat (dengan kunci pribadi di sisi klien).

Anda bahkan dapat membuat beberapa kunci khusus untuk setiap korespondensi. Pengguna penerima dapat menerima tawaran ini dan mengirimkan kunci publiknya (juga dibuat khusus untuk korespondensi ini). Selanjutnya, pengguna pertama mengirimkan surat kontrol layanan (dienkripsi dengan kunci publik pengguna kedua) - setelah menerimanya, pengguna kedua dapat menganggap saluran komunikasi yang dihasilkan dapat diandalkan. Selanjutnya, pengguna kedua mengirimkan surat kontrol - dan kemudian pengguna pertama juga dapat menganggap saluran yang dihasilkan aman.

Untuk memerangi intersepsi kunci di jalan, protokol harus menyediakan kemungkinan untuk mengirimkan setidaknya satu kunci publik menggunakan flash drive.

Dan yang paling penting adalah semuanya berfungsi (pertanyaannya adalah “siapa yang akan membayarnya?”):
Masukkan sertifikat pos mulai dari $10 selama 3 tahun. Yang akan memungkinkan pengirim untuk menunjukkan di dns bahwa “kunci publik saya ada di sana.” Dan mereka akan memberi Anda kesempatan untuk memulai koneksi yang aman. Pada saat yang sama, menerima koneksi semacam itu tidak dipungut biaya.
gmail akhirnya memonetisasi penggunanya. Untuk $10 per 3 tahun - hak untuk membuat saluran korespondensi yang aman.

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

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

Namun keadaan kehidupan berkembang sehingga masalah ini berlarut-larut selama 2 bulan.
Jadi, ketika saya punya waktu luang lagi, saya memutuskan untuk menerbitkan artikel apa adanya, daripada mengambil risiko penerbitannya akan berlarut-larut selama satu tahun lagi.

Jika ada banyak pertanyaan seperti "tetapi ini tidak dijelaskan secara cukup rinci", maka mungkin ada kekuatan untuk mengambil server khusus dengan domain baru dan sertifikat SSL baru dan menjelaskannya lebih detail dan, sebagian besar yang penting, identifikasi semua detail penting yang hilang.

Saya juga ingin mendapat masukan tentang ide tentang sertifikat pos. Jika Anda menyukai idenya, saya akan mencoba mencari kekuatan untuk menulis draf rfc.

Saat menyalin sebagian besar artikel, berikan tautan ke artikel ini.
Saat menerjemahkan ke bahasa lain, berikan tautan ke artikel ini.
Saya sendiri akan mencoba menerjemahkannya ke dalam bahasa Inggris dan meninggalkan referensi silang.


Sumber: www.habr.com

Tambah komentar