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

Tulisan ieu ngeunaan kumaha nyetél pangladén surat modern.
Postfix + Dovecot. SPF + DKIM + rDNS. Kalayan IPv6.
Kalayan énkripsi TSL. Kalayan dukungan pikeun sababaraha domain - bagian sareng sertipikat SSL nyata.
Kalayan panyalindungan antispam sareng rating antispam anu luhur ti pangladén surat anu sanés.
Ngarojong sababaraha interfaces fisik.
Kalayan OpenVPN, sambungan anu ngalangkungan IPv4, sareng anu nyayogikeun IPv6.

Upami anjeun henteu hoyong diajar sadaya téknologi ieu, tapi hoyong nyetél server sapertos kitu, maka tulisan ieu kanggo anjeun.

Tulisan henteu nyobian ngajelaskeun unggal detil. Katerangan mana anu henteu dikonpigurasikeun salaku standar atanapi penting tina sudut pandang konsumen.

Motivasi pikeun nyetél server mail geus lila ngimpi kuring. Ieu bisa disada bodo, tapi IMHO, éta leuwih hadé ti ngalamun mobil anyar ti brand favorit anjeun.

Aya dua motivasi pikeun nyetél IPv6. Spesialis IT kedah diajar téknologi anyar terus-terusan supados salamet. Abdi hoyong masihan kontribusi anu sederhana pikeun merangan sénsor.

Motivasi pikeun nyetél OpenVPN ngan ukur pikeun ngajantenkeun IPv6 dina mesin lokal.
Motivasi pikeun nyetel sababaraha interfaces fisik nyaéta yén dina server kuring boga hiji panganteur "slow tapi taya" jeung "gancang tapi kalawan tarif".

Motivasi pikeun nyetél setélan Bind nyaéta yén ISP kuring nyayogikeun server DNS anu teu stabil, sareng google ogé kadang gagal. Abdi hoyong server DNS stabil pikeun pamakéan pribadi.

Motivasi nulis artikel - Kuring nulis draf 10 sababaraha bulan kapengker, sarta kuring geus nempo eta dua kali. Malah lamun pangarang rutin merlukeun eta, aya kamungkinan luhur yén batur bakal butuh teuing.

Henteu aya solusi universal pikeun server mail. Tapi kuring bakal nyobian nyerat sapertos "ngalakukeun ieu teras, nalika sadayana jalan sakumaha sakuduna, buang barang tambahan."

Perusahaan tech.ru gaduh server Colocation. Kasebut nyaéta dimungkinkeun pikeun ngabandingkeun jeung OVH, Hetzner, AWS. Pikeun ngajawab masalah ieu, gawé babarengan jeung tech.ru bakal leuwih éféktif.

Debian 9 dipasang dina server.

server ngabogaan 2 interfaces `eno1` jeung `eno2`. Anu kahiji henteu terbatas, sareng anu kadua gancang, masing-masing.

Aya 3 alamat IP statik, XX.XX.XX.X0 jeung XX.XX.XX.X1 jeung XX.XX.XX.X2 dina panganteur `eno1` jeung XX.XX.XX.X5 dina panganteur `eno2`. .

Sadia XXXX:XXXX:XXXX:XXXX::/64 kolam renang alamat IPv6 nu ditugaskeun ka `eno1` panganteur na ti dinya XXXX: XXXX: XXXX: XXXX: 1: 2 :: / 96 ieu ditugaskeun ka `eno2` dina pamundut abdi.

Aya 3 domain `domain1.com`, `domain2.com`, `domain3.com`. Aya sertipikat SSL pikeun `domain1.com` jeung `domain3.com`.

Abdi gaduh akun Google anu abdi hoyong ngaitkeun kotak surat abdi[email dijaga]` (nampi surat sareng ngirim surat langsung tina antarmuka Gmail).
Kudu aya kotak surat`[email dijaga]`, salinan email ti mana kuring hoyong ningali dina Gmail kuring. Sareng jarang anu tiasa ngirim barang atas nama `[email dijaga]` via panganteur wéb.

Kudu aya kotak surat`[email dijaga]`, anu bakal dianggo ku Ivanov tina iPhone na.

Surélék anu dikirim kedah sasuai sareng sadaya sarat antispam modern.
Kudu aya tingkat enkripsi pangluhurna anu disayogikeun dina jaringan umum.
Kudu aya rojongan IPv6 pikeun ngirim jeung narima surat.
Kudu aya SpamAssassin anu moal pernah ngahapus email. Sareng éta bakal mumbul atanapi ngaluncat atanapi ngirim kana folder "Spam" IMAP.
Pembelajaran otomatis SpamAssassin kedah dikonpigurasikeun: upami kuring mindahkeun surat ka folder Spam, éta bakal diajar tina ieu; lamun kuring mindahkeun surat ti folder Spam, éta bakal diajar ti ieu. Hasil latihan SpamAssassin kedah mangaruhan naha hurup éta dina polder Spam.
Aksara PHP kudu bisa ngirim surat atas nama domain mana wae dina server dibikeun.
Kudu aya layanan openvpn, kalawan kamampuhan pikeun ngagunakeun IPv6 dina klien nu teu boga IPv6.

Kahiji maneh kudu ngonpigurasikeun interfaces jeung routing, kaasup IPv6.
Teras anjeun kedah ngonpigurasikeun OpenVPN, anu bakal nyambung via IPv4 sareng masihan klien alamat IPv6 statik-nyata. Klién ieu bakal gaduh aksés ka sadaya jasa IPv6 dina server sareng aksés ka sumber daya IPv6 dina Internét.
Teras anjeun kedah ngonpigurasikeun Postfix pikeun ngirim hurup + SPF + DKIM + rDNS sareng hal-hal leutik anu sami.
Teras anjeun kedah ngonpigurasikeun Dovecot sareng ngonpigurasikeun Multidomain.
Teras anjeun kedah ngonpigurasikeun SpamAssassin sareng ngonpigurasikeun latihan.
Tungtungna, pasang Bind.

============= Multi-interfaces =============

Pikeun ngonpigurasikeun antarmuka, anjeun kedah nyerat ieu dina "/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

Setélan ieu tiasa diterapkeun dina server naon waé di tech.ru (kalayan koordinasi sakedik sareng dukungan) sareng éta bakal langsung dianggo sakumaha anu sakuduna.

Upami anjeun gaduh pangalaman nyetél hal anu sami pikeun Hetzner, OVH, éta béda di dinya. Leuwih hese.

eno1 nyaeta nami kartu jaringan #1 (slow tapi taya).
eno2 nyaéta ngaran kartu jaringan # 2 (gancang, tapi kalawan tarif).
tun0 mangrupikeun nami kartu jaringan virtual tina OpenVPN.
XX.XX.XX.X0 - IPv4 #1 dina eno1.
XX.XX.XX.X1 - IPv4 #2 dina eno1.
XX.XX.XX.X2 - IPv4 #3 dina eno1.
XX.XX.XX.X5 - IPv4 #1 dina eno2.
XX.XX.XX.1 - IPv4 gateway.
XXXX: XXXX: XXXX: XXXX::/64 - IPv6 pikeun sakabéh server.
XXXX: XXXX: XXXX: XXXX: 1: 2 :: / 96 - IPv6 pikeun eno2, sagalana sejenna ti luar mana kana eno1.
XXXX: XXXX: XXXX: XXXX:: 1 — IPv6 gateway (eta kudu dicatet yén ieu bisa / kudu dipigawé béda. Sebutkeun saklar IPv6).
DNS-nameservers - 127.0.0.1 dituduhkeun (sabab meungkeut dipasang sacara lokal) jeung 213.248.1.6 (ieu ti tech.ru).

"tabel eno1t" jeung "tabel eno2t" - hartina jalur-aturan ieu yén lalulintas asup ngaliwatan eno1 -> bakal ninggalkeun ngaliwatan eta, sarta lalulintas ngasupkeun ngaliwatan eno2 -> bakal ninggalkeun ngaliwatan eta. Sareng ogé sambungan anu diprakarsai ku server bakal ngalangkungan eno1.

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

Kalayan paréntah ieu kami nangtukeun yén sagala lalulintas teu kaharti anu tumiba dina aturan mana wae ditandaan "table eno1t" -> dikirim ka panganteur eno1.

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

Kalayan paréntah ieu kami nangtukeun yén sagala lalulintas diprakarsai ku server kudu diarahkeun ka panganteur eno1.

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

Kalayan paréntah ieu kami nyetél aturan pikeun nyirian 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 ieu nangtukeun hiji IPv4 kadua pikeun panganteur eno1.

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

Kalayan paréntah ieu kami nyetél rute ti klien OpenVPN ka IPv4 lokal iwal XX.XX.XX.X0.
Kuring masih teu ngarti naha paréntah ieu cukup pikeun sakabéh IPv4.

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

Ieu dimana urang nyetel alamat pikeun panganteur sorangan. Server bakal ngagunakeun éta salaku alamat "kaluar". Moal dianggo deui ku cara naon waé.

Naha ": 1: 1::" jadi pajeulit? Janten OpenVPN tiasa dianggo leres sareng ngan ukur pikeun ieu. Langkung lengkep ihwal ieu engké.

Dina topik gateway - éta kumaha jalanna sareng éta henteu kunanaon. Tapi cara anu leres nyaéta nunjukkeun dieu IPv6 saklar dimana server disambungkeun.

Nanging, pikeun sababaraha alesan IPv6 lirén damel upami kuring ngalakukeun ieu. Ieu meureun sababaraha jenis masalah tech.ru.

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

Ieu nambihan alamat IPv6 kana antarmuka. Upami anjeun peryogi saratus alamat, éta hartosna saratus baris dina file ieu.

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

Kuring nyatet alamat sareng subnet sadaya antarmuka supados jelas.
eno1 - kedah janten"/64"- sabab ieu sakabeh pool alamat urang.
tun0 - subnet kudu leuwih badag batan eno1. Upami teu kitu, éta moal mungkin pikeun ngonpigurasikeun hiji gateway IPv6 pikeun klien OpenVPN.
eno2 - subnet kudu leuwih badag batan tun0. Upami teu kitu, klien OpenVPN moal tiasa ngaksés alamat IPv6 lokal.
Pikeun kajelasan, kuring milih undak subnet 16, tapi upami anjeun hoyong, anjeun tiasa ngalakukeun léngkah "1".
Sasuai, 64+16 = 80, jeung 80+16 = 96.

Pikeun kajelasan anu langkung ageung:
XXXX: XXXX: XXXX: XXXX: 1: 1: YYYY: YYYY mangrupikeun alamat anu kedah ditugaskeun ka situs atanapi jasa khusus dina antarmuka eno1.
XXXX: XXXX: XXXX: XXXX: 1: 2: YYYY: YYYY mangrupikeun alamat anu kedah ditugaskeun ka situs atanapi jasa khusus dina antarmuka eno2.
XXXX: XXXX: XXXX: XXXX: 1: 3: YYYY: YYYY mangrupikeun alamat anu kedah ditugaskeun ka klien OpenVPN atanapi dianggo salaku alamat jasa OpenVPN.

Pikeun ngonpigurasikeun jaringan, kedah tiasa ngabalikan deui server.
Parobihan IPv4 dijemput nalika dieksekusi (pastikeun bungkusna dina layar - upami henteu paréntah ieu ngan saukur ngadat jaringan dina server):

/etc/init.d/networking restart

Tambahkeun ka tungtung file "/etc/iproute2/rt_tables":

100 eno1t
101 eno2t

Tanpa ieu, anjeun moal tiasa nganggo tabel khusus dina file "/etc/network/interfaces".
Jumlahna kedah unik sareng kirang ti 65535.

Parobihan IPv6 tiasa gampang dirobih tanpa reboot, tapi pikeun ngalakukeun ieu anjeun kedah diajar sahenteuna tilu paréntah:

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

Setélan "/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

Ieu mangrupikeun setélan "sysctl" server kuring. Hayu atuh nunjuk kaluar hal penting.

net.ipv4.ip_forward = 1

Tanpa ieu, OpenVPN moal jalan pisan.

net.ipv6.ip_nonlocal_bind = 1

Saha waé anu nyobian ngabeungkeut IPv6 (contona nginx) langsung saatos antarmuka naék bakal nampi kasalahan. Éta alamat ieu teu sadia.

Pikeun ngahindarkeun kaayaan sapertos kitu, setting sapertos kitu dilakukeun.

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

Tanpa setélan IPv6 ieu, patalimarga ti klien OpenVPN henteu kaluar ka dunya.

Setélan sanésna henteu relevan atanapi kuring henteu émut pikeun naon éta.
Tapi bisi waé, kuring tinggalkeun "sapertos aya".

Supados parobihan kana file ieu tiasa dicandak tanpa rebooting server, anjeun kedah ngajalankeun paréntah:

sysctl -p

Langkung rinci ngeunaan aturan "tabel": habr.com/post/108690

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

OpenVPN IPv4 henteu tiasa dianggo tanpa iptables.

Iptables abdi sapertos kieu pikeun 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 nyaéta alamat IPv4 statik kuring tina mesin lokal.
10.8.0.0/24 - jaringan openvpn IPv4. Alamat IPv4 pikeun klien openvpn.
Konsistensi aturan 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

Ieu mangrupikeun watesan supados kuring ngan ukur tiasa nganggo OpenVPN tina IP statik kuring.

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

Pikeun neraskeun pakét IPv4 antara klien OpenVPN sareng Internét, anjeun kedah ngadaptarkeun salah sahiji paréntah ieu.

Pikeun sababaraha kasus, salah sahiji pilihan henteu cocog.
Duanana paréntah cocog pikeun hal kuring.
Sanggeus maca dokuméntasi, Kuring milih pilihan kahiji sabab migunakeun kirang CPU.

Supados sadaya setélan iptables tiasa dipulut saatos reboot, anjeun kedah simpen di mana waé.

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

Ngaran sapertos kitu henteu dipilih ku kasempetan. Éta dianggo ku pakét "iptables-persistent".

apt-get install iptables-persistent

Masang pakét OpenVPN utama:

apt-get install openvpn easy-rsa

Hayu urang nyetél template pikeun sertipikat (ganti nilai anjeun):

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

Hayu urang edit setélan template sertipikat:

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

Jieun sertipikat server:

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

Hayu urang nyiapkeun kamampuhan pikeun nyieun final "client-name.opvn" file:

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

Hayu urang nyiapkeun naskah anu bakal ngahijikeun sadaya file kana file opvn tunggal.

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

Nyiptakeun klien OpenVPN munggaran:

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

Berkas "~/client-configs/files/client-name.ovpn" dikirim ka alat klien.

Pikeun klien ios anjeun kedah ngalakukeun trik ieu:
Eusi tag "tls-auth" kedah tanpa koméntar.
Sareng nempatkeun "key-direction 1" langsung sateuacan tag "tls-auth".

Hayu urang ngonpigurasikeun config 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

Ieu diperlukeun pikeun nyetél alamat statik pikeun tiap klien (teu perlu, tapi kuring make eta):

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

Rincian anu paling hese sareng konci.

Hanjakalna, OpenVPN henteu acan terang kumaha sacara mandiri ngonpigurasikeun gateway IPv6 pikeun klien.
Anjeun kudu "sacara manual" neraskeun ieu pikeun tiap 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"

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

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

Kadua naskah nganggo file "/etc/openvpn/variables":

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

Kuring hese nginget naha ditulis sapertos kieu.

Ayeuna netmask = 112 Sigana aneh (kudu 96 katuhu aya).
Sareng awalanna aneh, henteu cocog sareng jaringan tun0.
Tapi oke, kuring bakal ngantepkeunana.

cipher DES-EDE3-CBC

Ieu sanés kanggo sadayana - kuring milih metodeu pikeun énkripsi sambungan.

Diajar langkung seueur ngeunaan nyetel OpenVPN IPv4.

Diajar langkung seueur ngeunaan nyetel OpenVPN IPv6.

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

Masang paket utama:

apt-get install postfix

Nalika masang, pilih "situs internét".

Abdi "/etc/postfix/main.cf" siga kieu:

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

Hayu urang tingali rinci ngeunaan config ieu.

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

Numutkeun warga Khabrovsk, blok ieu ngandung "misinformation sareng tesis anu salah."Ngan 8 taun sanggeus mimiti karir mah kuring mimiti ngarti kumaha SSL jalan.

Ku alatan éta, kuring bakal nyandak kabébasan ngajelaskeun kumaha carana ngagunakeun SSL (tanpa ngawalon patarosan "Kumaha gawéna?" Jeung "Naha gawéna?").

Dasar enkripsi modern nyaéta nyiptakeun pasangan konci (dua senar karakter anu panjang pisan).

Hiji "konci" swasta, konci séjén "umum". Urang ngajaga konci swasta taliti pisan rahasia. Urang ngadistribusikaeun konci publik ka dulur.

Nganggo konci umum, anjeun tiasa énkripsi senar téks supados ngan anu gaduh konci pribadi tiasa ngadekrip éta.
Nya, éta sadayana dasar téknologi.

Lengkah #1 - situs HTTPS.
Nalika ngaksés situs, panyungsi diajar tina pangladén wéb yén situs éta https sareng ku kituna nyuhunkeun konci umum.
Pangladén wéb masihan konci umum. Browser ngagunakeun konci umum pikeun encrypt http-pamundut sarta ngirimkeunana.
Eusi hiji http-pamundut ngan bisa dibaca ku nu boga konci swasta, nyaeta, ngan server nu pamundut dijieun.
Http-pamundut ngandung sahanteuna hiji URI. Ku alatan éta, lamun hiji nagara nyoba ngawatesan aksés teu ka sakabéh situs, tapi ka kaca husus, teras ieu teu mungkin keur ngalakukeun pikeun situs HTTPS.

Lengkah #2 - réspon énkripsi.
Pangladén wéb nyayogikeun jawaban anu gampang dibaca di jalan.
Solusina saderhana pisan - browser sacara lokal ngahasilkeun pasangan konci swasta-umum anu sami pikeun unggal situs https.
Sareng sareng pamundut konci umum situs, éta ngirimkeun konci umum lokalna.
Pangladén wéb émut éta sareng, nalika ngirim réspon http, énkripsi ku konci umum tina klien khusus.
Ayeuna http-réspon ngan ukur tiasa didekripsi ku anu gaduh konci pribadi browser klien (nyaéta, klien sorangan).

Lengkah No 3 - ngadegkeun sambungan aman via saluran umum.
Aya kerentanan dina conto No.. 2 - euweuh nyegah well-wishers intercepting hiji http-pamundut jeung ngédit informasi ngeunaan konci publik.
Janten, perantara bakal jelas ningali sadaya eusi pesen anu dikirim sareng katampi dugi ka saluran komunikasi robih.
Ngungkulan ieu saderhana pisan - cukup kirimkeun konci umum browser salaku pesen énkripsi nganggo konci umum pangladén wéb.
Pangladén wéb teras ngirimkeun réspon sapertos "konci publik anjeun sapertos kieu" sareng énkripsi pesen ieu nganggo konci umum anu sami.
Browser ningali résponna - upami pesen "konci publik anjeun sapertos kieu" ditampi - maka ieu mangrupikeun jaminan 100% yén saluran komunikasi ieu aman.
Kumaha aman éta?
Nyiptakeun saluran komunikasi anu aman sapertos kitu lumangsung dina laju ping*2. Contona 20ms.
Panyerang kedah gaduh konci pribadi salah sahiji pihak sateuacanna. Atanapi milarian konci pribadi dina sababaraha milidetik.
Hacking hiji konci swasta modern bakal nyandak sababaraha dekade dina superkomputer.

Lengkah #4 - database publik konci publik.
Jelas, dina sadaya carita ieu aya kasempetan pikeun panyerang calik dina saluran komunikasi antara klien sareng server.
Klien tiasa nyamar janten server, sareng server tiasa nyamar janten klien. Jeung emulate sapasang konci dina duanana arah.
Teras panyerang bakal ningali sadaya lalu lintas sareng tiasa "ngédit" lalu lintas.
Contona, ngarobah alamat dimana ngirim duit atawa nyalin sandi ti perbankan online atawa blok eusi "objectionable".
Pikeun merangan panyerang sapertos kitu, aranjeunna ngadamel database umum kalayan konci umum pikeun unggal situs https.
Unggal browser "nyaho" ngeunaan ayana ngeunaan 200 database misalna. Ieu tos dipasang dina unggal browser.
"Kaweruh" dirojong ku konci umum tina unggal sertipikat. Nyaéta, sambungan ka unggal otoritas sertifikasi khusus henteu tiasa dipalsukan.

Ayeuna aya pamahaman basajan ngeunaan cara ngagunakeun SSL pikeun HTTPS.
Upami anjeun nganggo uteuk anjeun, éta bakal écés kumaha jasa khusus tiasa hacks dina struktur ieu. Tapi bakal ngarugikeun aranjeunna usaha monstrous.
Sareng organisasi anu langkung alit tibatan NSA atanapi CIA - ampir teu mungkin pikeun hack tingkat panyalindungan anu aya, bahkan pikeun VIP.

Kuring ogé bakal nambahan ngeunaan sambungan ssh. Henteu aya konci umum di dinya, janten naon anu anjeun tiasa laksanakeun? Masalahna direngsekeun ku dua cara.
Pilihan ssh-demi-sandi:
Salila sambungan munggaran, klien ssh kedah ngingetkeun yén urang gaduh konci publik anyar tina server ssh.
Sareng salami sambungan salajengna, upami peringatan "konci publik anyar tina server ssh" muncul, éta hartosna aranjeunna nyobian nguping anjeun.
Atawa anjeun eavesdropped on sambungan munggaran anjeun, tapi ayeuna anjeun komunikasi sareng server tanpa perantara.
Sabenerna, alatan kanyataan yén kanyataan wiretapping gampang, gancang jeung effortlessly wangsit, serangan ieu dipaké ngan dina kasus husus pikeun klien husus.

Pilihan ssh-demi-konci:
Kami nyandak flash drive, nyerat konci pribadi pikeun server ssh di dinya (aya istilah sareng seueur nuansa penting pikeun ieu, tapi kuring nyerat program pendidikan, sanés petunjuk pikeun dianggo).
Urang ninggalkeun konci publik dina mesin dimana klien ssh bakal sarta kami ogé tetep rusiah.
Urang mawa flash drive ka server, selapkeun eta, nyalin kenop swasta, jeung kaduruk flash drive jeung paburencay ashes ka angin (atawa sahenteuna format eta kalawan nol).
Éta sadayana - saatos operasi sapertos kitu mustahil pikeun hack sambungan ssh sapertos kitu. Tangtosna, dina 10 taun bakal tiasa ningali lalu lintas dina superkomputer - tapi éta carita anu béda.

Hapunten pikeun offtopic.

Tah ayeuna eta teori teh geus dipikawanoh. Kuring gé ngabejaan Anjeun tentang aliran nyieun hiji sertipikat SSL.

Ngagunakeun "openssl genrsa" urang nyieun konci swasta sarta "kosong" pikeun konci umum.
Kami ngirimkeun "kosong" ka perusahaan pihak katilu, anu kami mayar sakitar $9 kanggo sertipikat pangbasajanna.

Saatos sababaraha jam, kami nampi konci "umum" sareng sakumpulan sababaraha konci umum ti perusahaan pihak katilu ieu.

Naha pausahaan pihak-katilu kudu mayar pendaptaran ti konci publik mah pertanyaan misah, urang moal nganggap dieu.

Ayeuna geus jelas naon hartina prasasti:

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

Folder "/ jsb / ssl" ngandung sadaya file pikeun masalah ssl.
domain1.com - ngaran domain.
2018 mangrupikeun taun nyiptakeun konci.
"Konci" - sebutan yén file mangrupikeun konci pribadi.

Sareng hartos file ieu:

smtpd_tls_cert_file=/etc/ssl/domain1.com.2018.chained.crt
domain1.com - ngaran domain.
2018 mangrupikeun taun nyiptakeun konci.
ranté - designation yén aya ranté tina konci publik (kahiji nyaeta konci publik urang jeung sésana téh naon asalna ti parusahaan nu ngaluarkeun konci publik).
crt - designation yén aya sertipikat siap-dijieun (konci publik kalawan katerangan teknis).

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

Setelan ieu teu dipaké dina hal ieu, tapi ditulis salaku conto.

Kusabab kasalahan dina parameter ieu bakal ngakibatkeun spam dikirim ti server anjeun (tanpa wasiat anjeun).

Teras buktikeun ka sadayana yén anjeun henteu kaliru.

recipient_delimiter = +

Seueur jalma anu henteu terang, tapi ieu mangrupikeun karakter standar pikeun peringkat email, sareng dirojong ku kalolobaan server surat modern.

Contona, upami anjeun gaduh kotak surat "[email dijaga]"Coba kirimkeun ka"[email dijaga]"- tingali naon asalna.

inet_protocols = ipv4

Ieu meureun matak ngabingungkeun.

Tapi lain kitu waé. Unggal domain anyar sacara standar ngan ukur IPv4, teras kuring hurungkeun IPv6 pikeun masing-masing nyalira.

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 dieu urang tangtukeun yén sadaya surat asup ka dovecot.
Jeung aturan pikeun domain, kotak surat, landian - kasampak dina 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

Ayeuna postfix terang yén surat tiasa ditampi pikeun kiriman salajengna ngan saatos otorisasi sareng dovecot.

Nyaan teu ngarti naha ieu duplikat dieu. Kami parantos netepkeun sadayana anu diperyogikeun dina "virtual_transport".

Tapi sistem postfix geus kolot pisan - meureun éta throwback ti jaman baheula.

smtpd_recipient_restrictions =
        ...

smtpd_helo_restrictions =
        ...

smtpd_client_restrictions =
        ...

Ieu bisa ngonpigurasi béda pikeun tiap server mail.

Kuring boga 3 mail server di pembuangan kuring jeung setelan ieu pisan béda alatan sarat pamakéan béda.

Anjeun kedah ngonpigurasikeunana sacara saksama - upami henteu spam bakal tuang ka anjeun, atanapi langkung parah - spam bakal tuang kaluar ti anjeun.

# SPF
policyd-spf_time_limit = 3600

Nyetél pikeun sababaraha plugin patali mariksa SPF surat asup.

# 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

Setélanna nyaéta urang kedah nyayogikeun tanda tangan DKIM sareng sadaya email anu kaluar.

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

Ieu mangrupikeun jéntré konci dina routing surat nalika ngirim surat tina 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 kénca aya ungkapan biasa. Di katuhu aya labél anu nandaan hurup.
Postfix luyu jeung labél - bakal tumut kana akun sababaraha garis konfigurasi leuwih pikeun surat husus.

Kumaha kahayang postfix bakal reconfigured pikeun surat husus bakal dituduhkeun dina "master.cf".

Garis 4, 5, 6 mangrupikeun anu utami. Atas nama domain anu kami ngirim surat, kami nempatkeun labél ieu.
Tapi widang "ti" teu salawasna dituduhkeun dina Aksara PHP dina kode heubeul. Lajeng ngaran pamaké datang ka nyalametkeun teh.

Tulisan éta parantos éksténsif - Abdi henteu hoyong diganggu ku nyetél nginx + fpm.

Sakeudeung, pikeun tiap situs urang nyetel sorangan linux-pamaké boga. Sarta sasuai Anjeun fpm-kolam renang.

Fpm-pool ngagunakeun sagala versi php (éta hébat lamun dina server sarua anjeun bisa make versi béda tina php komo php.ini béda pikeun situs tatangga tanpa masalah).

Janten, pangguna linux khusus "www-domain2" gaduh situs wéb domain2.com. Situs ieu ngagaduhan kode pikeun ngirim email tanpa netepkeun kolom ti.

Ku kituna, sanajan dina hal ieu, hurup bakal dikirim leres tur moal mungkas nepi di spam.

Abdi "/etc/postfix/master.cf" siga kieu:

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

Berkasna henteu disayogikeun lengkep - éta parantos ageung pisan.
Kuring ukur nyatet naon anu robah.

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}

Ieu mangrupikeun setélan anu aya hubunganana sareng spamassasin, langkung seueur ngeunaan éta engké.

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

Urang ngidinan Anjeun pikeun nyambung ka server mail via port 587.
Jang ngalampahkeun ieu, anjeun kudu asup.

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

Aktipkeun cek SPF.

apt-get install postfix-policyd-spf-python

Hayu urang pasang pakét pikeun cek SPF di luhur.

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

Sareng ieu mangrupikeun hal anu paling pikaresepeun. Ieu mangrupikeun kamampuan pikeun ngirim surat pikeun domain khusus tina alamat IPv4/IPv6 khusus.

Hal ieu dilakukeun demi rDNS. rDNS nyaéta prosés narima string ku alamat IP.
Sareng pikeun surat, fitur ieu dianggo pikeun ngonfirmasi yén helo leres-leres cocog sareng rDNS alamat dimana emailna dikirim.

Upami helo henteu cocog sareng domain email atas nama saha suratna dikirim, titik spam bakal dileler.

Helo henteu cocog sareng rDNS - seueur titik spam anu dileler.
Sasuai, unggal domain kudu boga alamat IP sorangan.
Pikeun OVH - dina konsol kasebut nyaéta dimungkinkeun pikeun nangtukeun rDNS.
Pikeun tech.ru - masalah ieu direngsekeun ngaliwatan rojongan.
Pikeun AWS, masalahna direngsekeun ku dukungan.
"inet_protocols" sareng "smtp_bind_address6" - kami ngaktifkeun dukungan IPv6.
Pikeun IPv6 anjeun ogé kedah ngadaptar rDNS.
"syslog_name" - sareng ieu kanggo ngagampangkeun maca log.

Mésér sertipikat Abdi nyarankeun dieu.

Nyetél tautan postfix+dovecot di dieu.

Setélan SPF.

============= Dovecot =============

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

Nyetél mysql, masang bungkusan sorangan.

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

disable_plaintext_auth = yes
auth_mechanisms = plain login

Otorisasina ngan énkripsi.

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

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

Di dieu urang nunjukkeun lokasi neundeun hurup.

Abdi hoyong aranjeunna disimpen dina file sareng dikelompokkeun dumasar 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 {
  }
}

Ieu mangrupikeun file konfigurasi dovecot utama.
Di dieu urang nganonaktipkeun sambungan anu teu aman.
Sareng aktipkeun sambungan anu 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
}

Nyetél ssl. Kami nunjukkeun yén ssl diperyogikeun.
Jeung sertipikat sorangan. Sareng detil anu penting nyaéta diréktif "lokal". Nunjukkeun sertipikat SSL mana anu dianggo nalika nyambungkeun ka IPv4 lokal mana.

Ku jalan kitu, IPv6 henteu dikonpigurasi di dieu, kuring bakal ngabenerkeun omission ieu engké.
XX.XX.XX.X5 (domain2) - euweuh sertipikat. Pikeun nyambungkeun klien anjeun kudu nangtukeun domain1.com.
XX.XX.XX.X2 (domain3) - aya sertipikat, anjeun tiasa nangtukeun domain1.com atanapi domain3.com pikeun nyambungkeun klien.

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

protocol lda {
  mail_plugins = $mail_plugins sieve
}

Ieu bakal diperlukeun pikeun spamassassin di mangsa nu bakal datang.

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

protocol imap {
  mail_plugins = $mail_plugins antispam
}

Ieu mangrupikeun plugin antispam. Diperlukeun pikeun latihan spamassasin dina waktu mindahkeun ka / ti folder "Spam".

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

protocol pop3 {
}

Aya file sapertos kitu.

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

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

Nyetél 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
}

Setélan latihan Spamassasin dina waktu mindahkeun ka / ti 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
}

A file nu nangtukeun naon nu kudu jeung hurup asup.

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

require ["fileinto", "mailbox"];

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

Anjeun kudu compile file: "sievec default.sieve".

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

Nangtukeun file sql pikeun otorisasina.
Jeung file sorangan dipaké salaku padika otorisasina.

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';

Ieu pakait jeung setélan sarupa pikeun postfix.

File "/etc/dovecot/dovecot.conf"

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

file konfigurasi utama.
Anu penting nyaéta kami nunjukkeun di dieu - tambahkeun protokol.

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

apt-get install spamassassin spamc

Hayu urang pasang bungkusan.

adduser spamd --disabled-login

Hayu urang tambahkeun pangguna atas nama saha.

systemctl enable spamassassin.service

Urang ngaktifkeun otomatis-loading jasa spammassassin kana loading.

File "/etc/standar/spamassassin":

CRON=1

Ku ngaktipkeun apdet otomatis aturan "sacara standar".

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

Anjeun kudu nyieun database "sa" dina MySQL kalawan pamaké "sa" jeung sandi "sandi" (ganti ku hal nyukupan).

report_safe - ieu bakal ngirim laporan email spam tinimbang surat.
use_bayes mangrupikeun setélan learning machine spamassassin.

Setélan spamassassin sésana dipaké saméméhna dina artikel.

Setélan umum "spamassassin".
Ngeunaan mindahkeun surelek Spam anyar kana folder "Spam" IMAP.
Ngeunaan kombinasi basajan Dovecot + SpamAssassin.
Abdi nyarankeun maca téori diajar spamassasin nalika mindahkeun hurup dina polder imap (sareng kuring henteu nyarankeun ngagunakeunana).

============= Banding ka masarakat =============

Abdi ogé hoyong ngalungkeun ide ka masarakat ngeunaan kumaha carana ningkatkeun tingkat kaamanan surat anu diteruskeun. Kusabab kuring jadi deeply immersed dina topik mail.

Sangkan pamaké bisa nyieun sapasang konci on klien na (outlook, thunderbird, browser-plugin, ...). Umum jeung swasta. Umum - kirimkeun ka DNS. Pribadi - simpen dina klien. Pangladén surat bakal tiasa nganggo konci umum pikeun ngirim ka panarima anu khusus.

Sareng pikeun ngajagi tina spam sareng hurup sapertos kitu (enya, pangladén surat moal tiasa ningali eusina) - anjeun kedah ngenalkeun 3 aturan:

  1. Wajib tanda tangan DKIM nyata, wajib SPF, wajib rDNS.
  2. Jaringan saraf ngeunaan palatihan antispam + database pikeun éta di sisi klien.
  3. Algoritma enkripsi kedah sapertos yén sisi ngirim kedah nyéépkeun kakuatan CPU 100 kali langkung seueur dina énkripsi tibatan sisi anu nampi.

Salian surat umum, ngamekarkeun surat usulan standar "pikeun ngamimitian korespondensi aman." Salah sahiji pamaké (kotak surat) ngirim surat kalawan kantétan ka kotak surat séjén. Suratna ngandung proposal téks pikeun ngamimitian saluran komunikasi anu aman pikeun korespondensi sareng konci umum anu gaduh kotak surat (kalayan konci pribadi di sisi klien).

Anjeun malah tiasa ngadamel sababaraha konci khusus pikeun unggal korespondensi. Pamaké panarima tiasa nampi panawaran ieu sareng ngirimkeun konci umumna (ogé didamel khusus pikeun korespondensi ieu). Salajengna, pamaké kahiji ngirimkeun surat kontrol layanan (énkripsi ku konci umum tina pamaké kadua) - sanggeus resi nu pamaké kadua bisa mertimbangkeun saluran komunikasi kabentuk dipercaya. Salajengna, pangguna kadua ngirimkeun surat kontrol - teras pangguna anu munggaran ogé tiasa nganggap saluran anu kabentuk aman.

Pikeun merangan interception sahiji konci di jalan, protokol kudu nyadiakeun kamungkinan ngirimkeun sahanteuna hiji konci umum maké flash drive.

Sareng anu paling penting nyaéta éta sadayana tiasa dianggo (pertanyaan "saha anu bakal mayar éta?"):
Lebetkeun sertipikat pos mimitian ti $10 salami 3 taun. Anu bakal ngamungkinkeun pangirim nunjukkeun dina dns yén "konci publik kuring aya di dinya." Sareng aranjeunna bakal masihan anjeun kasempetan pikeun ngamimitian sambungan anu aman. Dina waktos anu sami, nampi sambungan sapertos kitu gratis.
gmail tungtungna monetizing pamaké na. Pikeun $10 per 3 taun - hak nyieun saluran susuratan aman.

============= Kacindekan =============

Pikeun nguji sakabéh artikel, abdi bade nyéwa dedicated server salila sabulan jeung meuli domain kalawan sertipikat SSL.

Tapi kaayaan hirup dimekarkeun jadi masalah ieu nyeret dina 2 bulan.
Janten, nalika kuring ngagaduhan waktos luang deui, kuring mutuskeun pikeun nyebarkeun tulisan sapertos kitu, tinimbang résiko yén publikasi bakal nyered pikeun sataun deui.

Upami aya seueur patarosan sapertos "tapi ieu henteu dijelaskeun dina detil anu cekap", maka sigana bakal aya kakuatan pikeun nyandak server khusus kalayan domain énggal sareng sertipikat SSL énggal sareng ngajelaskeun éta langkung rinci sareng, paling. importantly, ngaidentipikasi sagala detil penting leungit.

Abdi ogé hoyong kéngingkeun tanggapan ngeunaan ideu ngeunaan sertipikat pos. Upami anjeun resep ideu, kuring bakal nyobian milarian kakuatan pikeun nyerat draf pikeun rfc.

Lamun nyalin bagian badag tina hiji artikel, nyadiakeun tumbu ka artikel ieu.
Nalika narjamahkeun kana basa sanés, pasihan tautan kana tulisan ieu.
Kuring bakal nyobian narjamahkeun kana basa Inggris sorangan sarta ninggalkeun cross-rujukan.


sumber: www.habr.com

Tambahkeun komentar