Denne artikel handler om, hvordan man konfigurerer en moderne mailserver.
Postfix + Dovecot. SPF + DKIM + rDNS. Med IPv6.
Med TSL-kryptering. Med support til flere domĂŠner â en del med et gyldigt SSL-certifikat.
Med spam-beskyttelse og en hĂžj spam-rating i forhold til andre mailservere.
Med support til flere fysiske grĂŠnseflader.
Med OpenVPN, hvis forbindelse er via IPv4, og som giver IPv6.
Hvis du ikke Ăžnsker at lĂŠre alle disse teknologier, men Ăžnsker at konfigurere en sĂ„dan server â sĂ„ er denne artikel til dig.
Artiklen indeholder ikke forsÞg pÄ at forklare hver enkelt detalje. Forklaringen gÄr pÄ, hvad der er konfigureret pÄ en ikke-standard mÄde eller er vigtigt fra et brugerperspektiv.
Motivationen for at konfigurere en mailserver â min langvarige drĂžm. Det lyder mĂ„ske fjollet, men IMO, det er meget bedre end at drĂžmme om en ny bil af min yndlingsmĂŠrke.
Motivationen for at konfigurere IPv6 â der er to. En IT-specialist skal konstant lĂŠre nye teknologier for at overleve. Jeg Ăžnsker at bidrage minimalt til kampen mod censur.
Motivationen for at konfigurere OpenVPN â kun for at fĂ„ IPv6 til at fungere pĂ„ den lokale maskine.
Motivationen for at konfigurere flere fysiske grĂŠnseflader â jeg har Ă©n grĂŠnseflade pĂ„ serveren, 'langsom, men ubegribelig', og en anden 'hurtig, men med takst'.
Motivationen for at konfigurere Bind â min udbyder leverer en ustabil DNS-server, og Google har ogsĂ„ sine nedbrud. Jeg Ăžnsker en stabil DNS-server til personlig brug.
Motivationen for at skrive artiklen â udkastet blev skrevet for 10 mĂ„neder siden, og jeg har allerede kigget i det to gange. Hvis selv forfatteren har brug for det regelmĂŠssigt â er der stor sandsynlighed for, at andre ogsĂ„ vil have brug for det.
Der findes ikke en universel lĂžsning til en mailserver. Men jeg vil forsĂžge at skrive noget i stil med 'gĂžr sĂ„dan her, og derefter, nĂ„r alt fungerer som det skal â smid det overflĂždige vĂŠk'.
Serveren har Colocation hos firmaet tech.ru. Det er muligt at sammenligne med OVH, Hetzner, AWS. For at lĂžse denne opgave vil det vĂŠre langt mere effektivt at samarbejde med netop tech.ru.
Der er installeret Debian 9 pÄ serveren.
Serveren har 2 grĂŠnseflader `eno1` og `eno2`. Den fĂžrste er ubegribelig, mens den anden er hurtig.
Der er 3 statiske IP-adresser, XX.XX.XX.X0, XX.XX.XX.X1 og XX.XX.XX.X2 pÄ grÊnsefladen `eno1`, og XX.XX.XX.X5 pÄ grÊnsefladen `eno2`.
Der er et XXXX:XXXX:XXXX:XXXX::/64 IPv6-adressepul, der er tildelt grĂŠnsefladen `eno1`, og fra denne XXXX:XXXX:XXXX:XXXX:1:2::/96 blev tildelt til `eno2` efter min anmodning.
Der er 3 domĂŠner `domain1.com`, `domain2.com`, `domain3.com`. For `domain1.com` og `domain3.com` er der et SSL-certifikat.
Der er en Google-konto, som jeg gerne vil knytte til e-mailkontoen `vasya.pupkin@domain1.com` (modtagelse og afsendelse af e-mails direkte fra Gmail-grĂŠnsefladen).
Der skal vĂŠre en e-mailkonto `support@domain2.com`, hvor jeg gerne vil se en kopi af e-mails i min Gmail. Og sjĂŠldent have mulighed for at sende noget fra `support@domain2.com` via webgrĂŠnsefladen.
Der skal vĂŠre en e-mailkonto `ivanov@domain3.com`, som Ivanov vil bruge fra sin iPhone.
Afsendte e-mails skal overholde alle moderne krav til anti-spam.
Der skal vĂŠre det hĂžjeste niveau af kryptering, der er muligt i offentlige netvĂŠrk.
Der skal vÊre understÞttelse af IPv6 bÄde til afsendelse og modtagelse af e-mails.
Der skal vÊre SpamAssassin, som aldrig vil slette e-mails. Den vil enten foretage en bounce, lade det gÄ igennem eller sende det til IMAP-mappen "Spam".
SpamAssassin skal vÊre indstillet til automatisk lÊring: hvis jeg flytter en e-mail til mappen "Spam" - skal den lÊre af det; hvis jeg flytter en e-mail fra mappen "Spam" - skal den lÊre af det. Resultaterne af SpamAssassins lÊring skal pÄvirke, om en e-mail havner i "Spam"-mappen.
PHP-scripts skal kunne sende e-mails pÄ vegne af ethvert domÊne pÄ denne server.
Der skal vÊre en OpenVPN-service, med mulighed for at bruge IPv6 pÄ klienter, som ikke har IPv6.
FĂžrst skal grĂŠnsefladerne og routingen indstilles, inklusive IPv6.
Derefter skal OpenVPN konfigureres, sÄ den forbinder via IPv4 og tildeler klienten en statisk, reel IPv6-adresse. Denne klient skal have adgang til alle IPv6-tjenester pÄ serveren og til enhver IPv6-ressource pÄ internettet.
Derefter skal Postfix konfigureres til at sende e-mails + SPF + DKIM + rDNS og andre lignende smÄting.
Derefter skal Dovecot konfigureres og Multidomain indsĂŠttes.
Derefter skal SpamAssassin konfigureres og trĂŠning indstilles.
Til slut skal Bind installeres.
============= Multi-grĂŠnseflader =============
For at konfigurere grÊnsefladerne skal det skrives sÄdan i "\/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::/80Disse indstillinger kan anvendes pÄ enhver server i tech.ru (med lidt samtykke fra supporten), og det vil straks fungere som det skal.
Hvis du har erfaring med at konfigurere lignende ting for Hetzner, OVH - er det anderledes. Mere kompliceret.
eno1 - er navnet pÄ netvÊrkskort #1 (langsomt, men ubegribelig).
eno2 - er navnet pÄ netvÊrkskort #2 (hurtigt, men med takst).
tun0 â navnet pĂ„ det virtuelle netvĂŠrkskort fra OpenVPN.
XX.XX.XX.X0 â IPv4 #1 pĂ„ eno1.
XX.XX.XX.X1 â IPv4 #2 pĂ„ eno1.
XX.XX.XX.X2 â IPv4 #3 pĂ„ eno1.
XX.XX.XX.X5 â IPv4 #1 pĂ„ eno2.
XX.XX.XX.1 â IPv4 gateway.
XXXX:XXXX:XXXX:XXXX::/64 â IPv6 for hele serveren.
XXXX:XXXX:XXXX:XXXX:1:2::/96 â IPv6 for eno2, alt andet kommer udefra via eno1.
XXXX:XXXX:XXXX:XXXX::1 â IPv6 gateway (det skal bemĂŠrkes, at dette kan/skal gĂžres anderledes. Angiv IPv6 switchens adresse).
dns-nameservers â angivet som 127.0.0.1 (fordi bind er installeret lokalt) og 213.248.1.6 (denne er fra tech.ru).
«table eno1t» og «table eno2t» â meningen med disse route-rule er, at trafik, der kommer ind gennem eno1 -> skal forlade via det samme, mens trafik, der kommer ind gennem eno2 -> skal forlade via det samme. OgsĂ„ forbindelser initieret af serveren skal forlade gennem eno1.
ip route add default via XX.XX.XX.1 table eno1tMed denne kommando angiver vi, at al ukendt trafik, der falder ind under en hvilken som helst regel, der er markeret med «table eno1t» -> skal sendes til interface eno1.
ip route add XX.XX.XX.0/24 dev eno1 src XX.XX.XX.X0 table eno1tMed denne kommando angiver vi, at al trafik initieret af serveren skal sendes til interface eno1.
ip rule add table eno1t from XX.XX.XX.X0
ip rule add table eno1t to XX.XX.XX.X0Med denne kommando angiver vi selv reglerne for mĂŠrkning af trafik.
auto eno1:2
iface eno1:2 inet static
address XX.XX.XX.X2
netmask 255.255.255.0
post-up ip rule add table eno1t from XX.XX.XX.X2
post-up ip rule add table eno1t to XX.XX.XX.X2Denne blok angiver det andet IPv4 for interface eno1.
ip route add 10.8.0.0/24 dev tun0 src XX.XX.XX.X1 table eno1t Med denne kommando angiver vi ruten fra OpenVPN-klienter til lokale IPv4 undtagen XX.XX.XX.X0.
Hvorfor denne kommando er tilstrĂŠkkelig for alle IPv4 â det forstĂ„r jeg stadig ikke.
iface eno1 inet6 static
address XXXX:XXXX:XXXX:XXXX:1:1::/64
gateway XXXX:XXXX:XXXX:XXXX::1Her sÊtter vi adressen for selve interfacet. Serveren vil bruge det som en «udgÄende» adresse. Det vil ikke blive brugt til noget andet.
Hvorfor der stÄr «:1:1::» sÄ besvÊrligt? For at OpenVPN fungerer korrekt og kun til dette formÄl. Mere om dette senere.
Om gateway â sĂ„ lĂŠnge det virker, er det fint. Men korrekt set â her skal den IPv6 switches adresse angives, som serveren er tilsluttet.
Men af en eller anden grund stopper IPv6 med at fungere, hvis jeg gÞr det sÄdan. MÄske er det nogle sÊrheder fra tech.ru.
ip -6 addr add XXXX:XXXX:XXXX:XXXX:1:1:1:1/64 dev $IFACEDette er tilfĂžjelsen af en IPv6-adresse til interfacet. Hvis der er behov for hundrede adresser â sĂ„ betyder det hundrede linjer i denne fil.
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::/80Jeg har markeret adresserne og subnettene for alle interfacene for at gĂžre det mere overskueligt.
eno1 â skal uden undtagelse vĂŠre «/64» â fordi det er hele vores pool af adresser.
tun0 â subnettet skal uden undtagelse vĂŠre stĂžrre end eno1. Ellers vil det ikke vĂŠre muligt at konfigurere en IPv6 gateway for klienter af OpenVPN.
eno2 â subnettet skal uden undtagelse vĂŠre stĂžrre end tun0. Ellers vil OpenVPN-klienter ikke kunne fĂ„ adgang til lokale IPv6-adresser.
For tydelighedens skyld har jeg valgt en subnetmÊssig blok pÄ 16, men man kan endda bruge en blok pÄ «1», hvis man Þnsker det.
SammenhĂŠngende 64+16 = 80, og 80+16 = 96.For endnu mere tydelighed:
XXXX:XXXX:XXXX:XXXX:1:1:YYYY:YYYY â disse adresser skal tildeles specifikke websteder eller tjenester pĂ„ interface eno1.
XXXX:XXXX:XXXX:XXXX:1:2:YYYY:YYYY â disse adresser skal tildeles specifikke websteder eller tjenester pĂ„ interface eno2.
XXXX:XXXX:XXXX:XXXX:1:3:YYYY:YYYY â disse adresser skal tildeles OpenVPN-klienter eller bruges som servicemeddelelser til OpenVPN.
For at konfigurere netvĂŠrket â skal der vĂŠre mulighed for at genstarte serveren.
IPv4 ĂŠndringer fanges ved udfĂžrelse (det skal vĂŠre indpakket i screen â ellers vil denne kommando bare bringe netvĂŠrket ned pĂ„ serveren):
/etc/init.d/networking restartTilfÞj til slutningen af filen «/etc/iproute2/rt_tables»:
100 eno1t
101 eno2t Uden dette kan der ikke bruges brugerdefinerede tabeller i filen «/etc/network/interfaces».
Tallene skal vĂŠre unikke og mindre end 65535.
IPv6 ĂŠndringer kan let ĂŠndres uden genstart, men for dette skal man lĂŠre mindst tre kommandoer:
ip -6 addr ...
ip -6 route ...
ip -6 neigh ...Indstilling af «/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 = 1Dette er «sysctl» indstillingerne for min server. VÊr opmÊrksom pÄ det vigtige.
net.ipv4.ip_forward = 1Uden dette vil OpenVPN ikke fungere overhovedet.
net.ipv6.ip_nonlocal_bind = 1Enhver, der forsĂžger at binde IPv6 (f.eks. nginx) straks efter at interfacet er blevet tildelt â vil fĂ„ en fejl. At adressen ikke er tilgĂŠngelig.
For at undgÄ sÄdan en situation, laves denne indstilling.
net.ipv6.conf.all.forwarding = 1
net.ipv6.conf.all.proxy_ndp = 1Uden disse indstillinger kommer IPv6 trafik fra OpenVPN-klienten ikke ud i verden.
Andre indstillinger er enten irrelevante eller jeg husker ikke, hvorfor de er der.
Men for en sikkerheds skyld efterlader jeg dem «som de er».
For at ĂŠndringerne i denne fil kan trĂŠde i kraft uden genstart af serveren â skal kommandoen udfĂžres:
sysctl -pMere detaljeret om «table» regler:
============= OpenVPN =============
OpenVPN IPv4 fungerer ikke uden iptables.
Jeg har sÄdan en iptables til 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 â dette er min statiske IPv4-adresse for den lokale maskine.
10.8.0.0/24 â IPv4-netvĂŠrk for openvpn. IPv4-adresser til openvpn-klienter.
Reglernes rĂŠkkefĂžlge er vigtig.
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 DROPDette er en begrÊnsning, sÄ kun jeg kan bruge OpenVPN fra min statiske IP.
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eno1 -j SNAT --to-source XX.XX.XX.X0
-- eller --
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eno1 -j MASQUERADEFor at videresende IPv4-pakker mellem OpenVPN-klienter og internettet er det nĂždvendigt at angive en af disse kommandoer.
I forskellige tilfĂŠlde passer en af mulighederne ikke.
Begge kommandoer passer til mit tilfĂŠlde.
Efter at have lĂŠst dokumentationen, valgte jeg den fĂžrste mulighed, fordi den bruger mindre CPU.
For at alle iptables-indstillinger kan blive anvendt efter genstart, skal de gemmes et sted.
iptables-save > /etc/iptables/rules.v4
ip6tables-save > /etc/iptables/rules.v6Disse navne er valgt med omhu. De bruges af pakken "iptables-persistent".
apt-get install iptables-persistentInstallation af hovedpakken OpenVPN:
apt-get install openvpn easy-rsaLad os konfigurere skabelonen til certifikaterne (indsĂŠt dine egne vĂŠrdier):
make-cadir ~/openvpn-ca
cd ~/openvpn-ca
ln -s openssl-1.0.0.cnf openssl.cnfLad os redigere indstillingerne for certifikat-skabelonen:
mcedit vars...
# Disse er standardvĂŠrdier for felter
# som vil blive indsat i certifikatet.
# Lad ingen af disse felter vĂŠre tomme.
export KEY_COUNTRY="RU"
export KEY_PROVINCE="Krasnodar"
export KEY_CITY="Dinskaya"
export KEY_ORG="Own"
export KEY_EMAIL="admin@domain1.com"
export KEY_OU="VPN"
# X509 Emne Felt
export KEY_NAME="server"
...Oprettelse af servercertifikat:
cd ~/openvpn-ca
source vars
./clean-all
./build-ca
./build-key-server server
./build-dh
openvpn --genkey --secret keys/ta.keyLad os forberede muligheden for at oprette de endelige "client-name.opvn" filer:
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-CBCLad os forberede et script, der vil samle alle filer til en enkelt opvn-fil.
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}/${1}.crt
<(echo -e '</cert>n<key>')
${KEY_DIR}/${1}.key
<(echo -e '</key>n<tls-auth>')
${KEY_DIR}/ta.key
<(echo -e '</tls-auth>')
> ${OUTPUT_DIR}/${1}.ovpnOprettelse af den fĂžrste OpenVPN-klient:
cd ~/openvpn-ca
source vars
./build-key client-name
cd ~/client-configs
./make_config.sh client-nameFilen "~/client-configs/files/client-name.ovpn" sendes til klientens enhed.
For iOS clients, you'll need to take a trick:
The content of the 'tls-auth' tag must be without comments.
And also place 'key-direction 1' immediately before the 'tls-auth' tag.
Let's configure the OpenVPN server:
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-CBCThis is needed to assign a static address to each client (not mandatory, but I use it):
# Client config dir
client-config-dir /etc/openvpn/ccdThe most complicated and critical detail.
Unfortunately, OpenVPN is still unable to automatically configure the IPv6 gateway for clients.
You have to manually forward this for each client.
# 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 eno1File '/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 eno1Both scripts use the file '/etc/openvpn/variables':
# Subnet
prefix=XXXX:XXXX:XXXX:XXXX:2:
# netmask
prefixlen=112Why it is written this way â I can't recall.
It currently looks strange netmask = 112 (it should be 96 here).
And the prefix is strange, not corresponding to the tun0 network.
But okay, I'll leave it 'as is'.
cipher DES-EDE3-CBCIt's a matter of taste â I chose this method of connection encryption.
============= Postfix =============
Installing the main package:
apt-get install postfixWhen installing, select 'internet-site'.
My '/etc/postfix/main.cf' looks like this:
smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
biff = no
# at tilfĂžje .domain er MUA's opgave.
append_dot_mydomain = no
readme_directory = no
# Se http://www.postfix.org/COMPATIBILITY_README.html -- standardvÊrdien er 2 pÄ
# friske installationer.
compatibility_level = 2
# TLS parametre
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
# Lagringstype
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 indstillinger
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-adresse pr. domĂŠne
sender_dependent_default_transport_maps = pcre:/etc/postfix/sdd_transport.pcreLad os se nÊrmere pÄ detaljerne i denne konfiguration.
smtpd_tls_cert_file=/etc/ssl/domain1.com.2018.chained.crt
smtpd_tls_key_file=/etc/ssl/domain1.com.2018.keyIfÞlge Habr-brugerne indeholder dette blok `desinformation og forkerte udsagn`.Det var fÞrst 8 Är efter starten af min karriere, at jeg forstod, hvordan SSL fungerer.
Derfor vil jeg tage mig friheden til at beskrive, hvordan man bruger SSL (uden at besvare spÞrgsmÄl som 'Hvordan fungerer det?' og 'Hvorfor fungerer det?').
Grundlaget for moderne kryptering er at skabe et nĂžglepar (to meget lange strenge af tegn).
En 'nĂžgle' er privat, mens den anden nĂžgle er 'offentlig'. Vi opbevarer den private nĂžgle meget omhyggeligt i hemmelighed. Den offentlige nĂžgle gives til alle interesserede.
Ved hjÊlp af den offentlige nÞgle kan man kryptere en tekststreng, sÄ kun ejeren af den private nÞgle kan dekryptere den.
Og det er hele grundlaget for teknologien.Trin nr. 1 â https-websteder.
NÄr browseren tilgÄr webstedet, fÄr den at vide af webserveren, at webstedet er https, og anmoder derfor om den offentlige nÞgle.
Webserveren leverer den offentlige nĂžgle. Browseren bruger den offentlige nĂžgle til at kryptere http-requesten og sender den afsted.
Indholdet af http-requesten kan kun lÊses af den, der har den private nÞgle, altsÄ kun serveren, som der bliver sendt en forespÞrgsel til.
Http-requesten indeholder mindst URI. Derfor, hvis et land forsÞger at begrÊnse adgangen ikke til hele sitet, men til en specifik side - sÄ er det umuligt at gÞre dette for https-sider.Trin nr. 2 - krypteret svar.
Webserveren giver et svar, som nemt kan lĂŠses undervejs.
LĂžsningen er meget enkel - browseren danner lokalt et tilsvarende par af privat-offentlig nĂžgle for hver https-side.
Og sammen med forespĂžrgslen om webstedets offentlige nĂžgle sender den sin lokale offentlige nĂžgle.
Webserveren husker den og krypterer http-response med den specifikke klients offentlige nĂžgle.
Nu kan http-response kun dekrypteres af ejerens private nĂžgle fra klientens browser (det vil sige selve klienten).Trin nr. 3 - etablering af en sikker forbindelse over en offentlig kanal.
I eksempel nr. 2 er der en sÄrbarhed - intet forhindrer en angriber i at opfange http-requesten og redigere oplysningerne om den offentlige nÞgle.
Dermed vil mellemmanden kunne se alt indhold i de sendte/modtagne beskeder, indtil kommunikationskanalen ĂŠndres.
At bekĂŠmpe dette er meget enkelt - det er tilstrĂŠkkeligt at sende browserens offentlige nĂžgle som en besked krypteret med webserverens offentlige nĂžgle.
Webserveren sender sÄ fÞrst et svar af typen "din offentlige nÞgle er sÄdan" og krypterer denne besked med samme offentlige nÞgle.
Browseren ser svaret - hvis der kommer en besked "din offentlige nÞgle er sÄdan" - sÄ er det 100% garanti for, at den pÄgÊldende kommunikationskanal er sikker.
Hvor sikker er den?
Oprettelsen af en sÄdan sikker kommunikationskanal sker med hastigheden ping*2. For eksempel 20 ms.
En angriber skal enten have den private nÞgle fra en af parterne pÄ forhÄnd, eller sÄ skal vedkommende finde den private nÞgle pÄ et par millisekunder.
At bryde en moderne privat nÞgle vil tage Ärtier pÄ en supercomputer.Trin nr. 4 - offentlig database over offentlige nÞgler.
Det er tydeligt, at der i hele denne historie eksisterer en mulighed for en angriber, der sidder pÄ kommunikationskanalen mellem klienten og serveren.
Muligheden for kunden at prĂŠsentere sig som serveren, og serveren som kunden. Og simulere et par nĂžgler i begge retninger.
SĂ„ vil en angriber kunne se al trafik og have mulighed for at 'redigere' trafikken.
For eksempel ĂŠndre adressen, hvor man sender penge, eller kopiere adgangskoden til netbanken eller blokere 'uĂžnsket' indhold.
For at bekÊmpe sÄdanne angribere er der opfundet en offentlig DB med offentlige nÞgler for hver https-side.
Hver browser 'ved', at der findes omkring 200 sÄdanne DB'er. Dette er forudinstalleret i hver browser.
Denne 'viden' er understÞttet af den offentlige nÞgle fra hvert certifikat. Med andre ord er det umuligt at forfalske forbindelsen til hvert specifikt certifikationscenter.Nu er der en simpel forstÄelse af, hvordan man bruger SSL til https.
Hvis man tĂŠnker sig lidt om, vil det blive klart, hvordan efterretningstjenester kan hacke noget i denne konstruktion. Men det vil koste dem forfĂŠrdelige krĂŠfter.
Og for organisationer mindre end NSA eller CIA er det nÊsten umuligt at hacke det eksisterende beskyttelsesniveau, selv for VIP.Jeg vil ogsÄ tilfÞje noget om SSH-forbindelser. Der er ingen offentlige nÞgler der, hvordan skal man sÄ forholde sig. Problemet lÞses pÄ to mÄder.
SSH-password-metode:
Ved den fĂžrste forbindelse skal SSH-klienten advare om, at vi har en ny offentlig nĂžgle fra SSH-serveren.
Og ved efterfĂžlgende forbindelser, hvis der dukker en advarsel op om 'ny offentlig nĂžgle fra ssh-serveren' â vil det betyde, at nogen forsĂžger at overvĂ„ge.
Eller ved den fÞrste forbindelse blev du overvÄget, og nu kommunikerer du med serveren uden mellemled.
Faktisk er det fordi, at det er let, hurtigt og uden krĂŠfter at opdage overvĂ„gningen â at denne type angreb kun bruges i sĂŠrlige tilfĂŠlde pĂ„ specifikke kunder.SSH-nĂžglemetode:
Tag et USB-stik, skriv den private nÞgle til SSH-serveren pÄ det (der er termer og masser af vÊsentlige nuancer, men jeg skriver bare en grundlÊggende gennemgang, ikke en brugsanvisning).
Den offentlige nÞgle efterlader vi pÄ maskinen, hvor SSH-klienten vil vÊre, og den holder vi ogsÄ hemmelig.
Vi tager USB-stikket til serveren, sÊtter det i, kopierer den private nÞgle, og sÄ brÊnder vi USB-stikket og spreder asken for vinden (eller i det mindste formaterer det med nuller).
Og det er det â efter en sĂ„dan operation vil det vĂŠre umuligt at hacke en sĂ„dan ssh-forbindelse. SelvfĂžlgelig vil man i lĂžbet af 10 Ă„r kunne se trafikken pĂ„ en supercomputer â men det er en anden historie.Jeg beklager for off-topic.
SĂ„ nu hvor teorien er kendt. Jeg vil fortĂŠlle om flowet til at oprette et ssl-certifikat.
Ved hjĂŠlp af "openssl genrsa" opretter vi en privat nĂžgle og "skabeloner" til den offentlige nĂžgle.
Vi sender "skabelonerne" til et tredjepartsfirma, som vi betaler omkring $9 for det enkleste certifikat.
Efter et par timer modtager vi vores "offentlige" nĂžgle fra dette tredjepartsfirma sammen med et sĂŠt af flere offentlige nĂžgler.
Hvorfor betale et tredjepartsfirma for at udstede min offentlige nĂžgle â det spĂžrgsmĂ„l vil jeg ikke diskutere her.
Nu er det klart, hvad meningen med inskriptionen er:
smtpd_tls_key_file=\/etc\/ssl\/domain1.com.2018.key I mappen "/etc/ssl" er alle filer til ssl-anliggender opbevaret.
domain1.com â navnet pĂ„ domĂŠnet.
2018 â Ă„ret for nĂžglens oprettelse.
"key" â betegnelsen for, at filen er en privat nĂžgle.
Og meningen med denne fil er:
smtpd_tls_cert_file=\/etc\/ssl\/domain1.com.2018.chained.crt
domain1.com â navnet pĂ„ domĂŠnet.
2018 â Ă„ret for nĂžglens oprettelse.
chained â betegnelsen for, at dette er en kĂŠde af offentlige nĂžgler (den fĂžrste â vores offentlige og de Ăžvrige er dem, der blev sendt fra firmaet, der udstedte den offentlige nĂžgle).
crt â betegnelsen for, at dette er et fĂŠrdigt certifikat (den offentlige nĂžgle med tekniske forklaringer).
smtp_bind_address = XX.XX.XX.X0
smtp_bind_address6 = XXXX:XXXX:XXXX:XXXX:1:1:1:1Denne opsĂŠtning bruges i dette tilfĂŠlde ikke, men er skrevet som eksempel.
Fordi en fejl i denne parameter kan fĂžre til, at spam sendes fra din server (uden din viden).
SĂ„ skal du bevise for alle, at du ikke er skyld i det.
recipient_delimiter = +Mange ved mÄske ikke dette, men det er et standardtegn til at rangere e-mails, og det understÞttes af de fleste moderne mailservere.
Hvis du for eksempel har en mailboks "username@gmail.com", sĂ„ prĂžv at sende til "username+spam@gmail.com" â se, hvad der sker.
inet_protocols = ipv4Dette kan vĂŠre forvirrende.
Men det er ikke uden grund. Hvert nyt domĂŠne â som standard kun IPv4, sĂ„ aktiverer jeg IPv6 for hver enkelt.
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 Her angiver vi, at al indgÄende mail gÄr til dovecot.
Og reglerne for domĂŠner, postkasser, aliaser â findes i databasen.
/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 = yesNu vet postfix, at det kun kan modtage e-mails til videre sending gennem godkendelse med dovecot.
Jeg forstÄr faktisk ikke rigtigt, hvorfor det her skal duplikeres. Vi har jo allerede angivet alt, hvad der er nÞdvendigt i 'virtual_transport'.
Men postfix-systemet er meget gammelt - det mÄ vÊre notater fra gamle dage.
smtpd_recipient_restrictions =
...
smtpd_helo_restrictions =
...
smtpd_client_restrictions =
...Det skal konfigureres forskelligt for hver mailserver.
Jeg har tre mailservere til rÄdighed, og disse indstillinger er meget forskellige pÄ grund af forskellige anvendelseskrav.
Du skal vĂŠre omhyggelig med konfigurationen - ellers vil spam oversvĂžmme dig, eller endnu vĂŠrre - spam vil komme fra dig.
# SPF
policyd-spf_time_limit = 3600Indstilling til et plugin relateret til kontrol af SPF for indkommende mail.
# OpenDKIM
milter_default_action = accept
milter_protocol = 6
smtpd_milters = unix:var/run/opendkim/opendkim.sock
non_smtpd_milters = unix:var/run/opendkim/opendkim.sockIndstilling om, at alle udgÄende e-mails skal forsynes med en DKIM-signatur.
# IP address per domain
sender_dependent_default_transport_maps = pcre:/etc/postfix/sdd_transport.pcreDette er en nÞglekomponent i routing af e-mails, nÄr e-mails sendes fra PHP-scripts.
Fil 'etc/postfix/sdd_transport.pcre':
/^www-domain1@domain1.com$/ domain1:
/^www-domain2@domain1.com$/ domain2:
/^www-domain3@domain1.com$/ domain3:
/@domain1.com$/ domain1:
/@domain2.com$/ domain2:
/@domain3.com$/ domain3:Til venstre - regulĂŠre udtryk. Til hĂžjre - etiketten, som e-mailen mĂŠrkes med.
Postfix vil i henhold til etiketten tage hĂžjde for endnu et par konfigurationslinjer for den specifikke e-mail.Hvordan postfix vil blive omkonfigureret for den specifikke e-mail, vil blive angivet i 'master.cf'.
Linjerne 4, 5, 6 - de er de vigtigste. Den etiket, vi sĂŠtter, svarer til det domĂŠne, vi sender e-mailen fra.
Men ikke altid i PHP-scripts i den gamle kode angives feltet 'from'. SĂ„ kommer brugernavnet til hjĂŠlp.Artiklen er allerede omfattende - jeg ville ikke have lyst til at blive distraheret af konfigurationen af nginx+fpm.
Kort sagt - vi angiver en specifik linux-bruger ejer for hver hjemmeside. Og derfor sin egen fpm-pool.
Fpm-pool bruger enhver PHP-version (det er fantastisk, nÄr man uden problemer kan bruge forskellige PHP-versioner og endda forskellige php.ini-filer pÄ én server for nabohjemmesider).
SĂ„ den specifikke linux-bruger 'www-domain2' har hjemmesiden domain2.com. PĂ„ denne hjemmeside er der kode til at sende e-mails uden angivelse af 'from'-feltet.
Selv i dette tilfĂŠlde vil e-mails blive sendt korrekt og vil aldrig havne i spam.
Min 'etc/postfix/master.cf' ser sÄledes ud:
...
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 Filen er ikke helt komplet â det er allerede meget stort.
Jeg har kun markeret det, der er ĂŠndret.
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}Dette er indstillinger relateret til spamassassin, mere om det senere.
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 Vi tillader tilslutning til mailserveren via port 587.
Det krĂŠver, at man logger ind.
policyd-spf unix - n n - 0 spawn
user=policyd-spf argv=/usr/bin/policyd-spfVi aktiverer SPF-tjek.
apt-get install postfix-policyd-spf-pythonVi vil installere pakken til SPF-tjek ovenfor.
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-domain1Og dette er det mest interessante. Det er muligheden for at sende e-mails for et bestemt domĂŠne fra en bestemt IPv4/IPv6 adresse.
Dette gÞres for rDNS. rDNS er at fÄ en eller anden streng baseret pÄ IP-adressen.
Og til mail bruges denne mulighed til at bekrĂŠfte, at helo faktisk svarer til rDNS for den adresse, som emailen blev sendt fra.Hvis helo ikke svarer til mailens domĂŠne, fra hvilken der blev sendt emailen â tildeles spam point.
Helo svarer ikke til rDNS â der tildeles mange spam point.
Derfor skal hver domĂŠne have sin egen IP-adresse.
For OVH â er der i kontrollen mulighed for at angive rDNS.
For tech.ru â lĂžses spĂžrgsmĂ„let via support.
For AWS â lĂžses spĂžrgsmĂ„let via support.
«inet_protocols» og «smtp_bind_address6» â dette aktiverer understĂžttelse af IPv6.
For IPv6 skal der ogsÄ angives rDNS.
«syslog_name» â dette er for nemmere lĂŠsning af logfiler.
KĂžb certifikater .
.
============= Dovecot =============
apt-get install dovecot-imapd dovecot-pop3d dovecot-lmtpd dovecot-mysql dovecot-antispamIndstilling af mysql, vi installerer selv pakkerne.
Fil «/etc/dovecot/conf.d/10-auth.conf»
disable_plaintext_auth = yes
auth_mechanisms = plain loginGodkendelse kun i krypteret form.
Fil «/etc/dovecot/conf.d/10-mail.conf»
mail_location = maildir:/var/mail/vhosts/%d/%nHer angiver vi lagerstedet for e-mails.
Jeg Ăžnsker, at de skal gemmes i filer og grupperes efter domĂŠner.
Fil «/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 {
}
} Dette er hovedkonfigurationsfilen for dovecot.
Her deaktiverer vi usikrede forbindelser.
Og aktiverer sikre forbindelser.
Fil «/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
}Vi konfigurerer ssl. Angiver, at ssl er et krav.
Og selve certifikatet. Og en vigtig detalje â direktivet «local». Det angiver, hvilken ssl-certifikat der skal bruges for forbindelse til hvilket lokalt IPv4.Forresten, IPv6 er ikke konfigureret her, jeg vil rette dette senere.
XX.XX.XX.X5 (domain2) â der er intet certifikat. For klientforbindelser skal domain1.com angives.
XX.XX.XX.X2 (domain3) â der er et certifikat, for klientforbindelser kan domain1.com eller domain3.com angives.
Fil «/etc/dovecot/conf.d/15-lda.conf»
protocol lda {
mail_plugins = $mail_plugins sieve
}Dette er yderligere nĂždvendigt til spamassassin.
Fil «/etc/dovecot/conf.d/20-imap.conf»
protocol imap {
mail_plugins = $mail_plugins antispam
}Dette er antispam-plugin. NÞdvendigt til at trÊne spamassassin under flytning til/fra mappen «Spam».
Fil «/etc/dovecot/conf.d/20-pop3.conf»
protocol pop3 {
}Der er blot en sÄdan fil.
Fil «/etc/dovecot/conf.d/20-lmtp.conf»
protokol lmtp {
mail_plugins = $mail_plugins sieve
postmaster_address = admin@domain1.com
}Konfiguration af lmtp.
Fil «/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
}Indstillinger for spamassassin trÊning ved flytning til/fra mappen «Spam».
Fil «/etc/dovecot/conf.d/90-sieve.conf»
plugin {
sieve = ~/dovecot.sieve
sieve_dir = ~/sieve
sieve_after = /var/lib/dovecot/sieve/default.sieve
}Fil hvor der angives, hvad der skal gÞres med indgÄende mails.
Fil «/var/lib/dovecot/sieve/default.sieve»
require ["fileinto", "mailbox"];
if header :contains "X-Spam-Flag" "YES" {
fileinto :create "Spam";
}Filen skal kompilere: «sievec default.sieve».
Fil «/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
} Angivelse af sql-filer til autentifikation.
Og selve filen â som en form for autentifikation.
Fil «/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';Dette svarer til de tilsvarende indstillinger for postfix.
Fil «/etc/dovecot/dovecot.conf»
protocols = imap lmtp pop3
listen = *, ::
dict {
}
!include conf.d/*.conf
!include_try local.conf Hovedkonfigurationsfilen.
Det vigtige her er, at vi her angiver/tilfĂžjer protokoller.
============= SpamAssassin =============
apt-get install spamassassin spamcVi installerer pakkerne.
adduser spamd --disabled-loginVi tilfĂžjer brugeren under, hvis navn.
systemctl enable spamassassin.serviceVi aktiverer autostart af spamassassin-tjenesten ved opstart.
Fil «/etc/default/spamassassin»:
CRON=1Aktiverer automatisk opdatering af regler «som standard».
Fil «/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 passwordEn MySQL DB «sa» med brugeren «sa» og password «password» (erstat med noget passende) skal oprettes.
report_safe â det betyder, at der sendes en rapport om spam-e-mail i stedet for selve brevet.
use_bayes â det er indstillinger for maskinlĂŠring i spamassassin.
De Ăžvrige indstillinger for spamassassin blev anvendt tidligere i artiklen.
.
.
.
.
============= Kontakt til fĂŠllesskabet =============
Jeg vil ogsÄ gerne dele en idé med samfundet om, hvordan man kan Þge sikkerheden for de sendte e-mails. Da jeg har dykket sÄ dybt ned i emnet mail.
For at brugeren kan oprette et par nĂžgler pĂ„ sin klient (Outlook, Thunderbird, browser-plugin, âŠ). Offentlig og privat. Den offentlige nĂžgle â sendes til DNS. Den private nĂžgle â gemmes pĂ„ klienten. E-mail-servere skal vĂŠre i stand til at anvende den offentlige nĂžgle til at sende til en bestemt modtager.
Og for at beskytte mod spam ved sÄdanne e-mails (ja, mailserveren vil ikke kunne se indholdet) skal der indfÞres 3 regler:
- Obligatorisk ĂŠgte DKIM-signatur, obligatorisk SPF, obligatorisk rDNS.
- Neuralt netvÊrk til at lÊre om anti-spam + database til dette pÄ klientsiden.
- Krypteringsalgoritmen skal vÊre sÄdan, at afsenderen skal bruge 100 gange mere CPU-kraft til kryptering end modtageren.
Udover offentlige e-mails â udvikle en standard for et tilbudsbrev til 'at starte en sikker korrespondance'. En af brugerne (e-mailkontoen) sender en e-mail til en anden e-mailkonto med et vedhĂŠftet dokument. I e-mailen er teksten et tilbud om at starte en sikker kommunikationskanal og den offentlige nĂžgle for ejerens e-mailkonto (hvor den private nĂžgle er pĂ„ klientsiden).
Man kan endda lave et par nĂžgler specielt til hver korrespondance. Brugeren modtager kan acceptere dette tilbud og sende sin offentlige nĂžgle (ogsĂ„ lavet specielt til denne korrespondance). Derefter sender den fĂžrste bruger en teknisk kontrolmail (krypteret med den anden brugers offentlige nĂžgle) â nĂ„r den anden bruger modtager den, kan han betragte den oprettede kommunikationskanal som pĂ„lidelig. Derefter sender den anden bruger en kontrolmail â og sĂ„ kan den fĂžrste bruger ogsĂ„ betragte den oprettede kanal som sikker.
For at bekĂŠmpe aflytning af nĂžgler undervejs â skal protokollen forudse muligheden for at overfĂžre mindst Ă©n offentlig nĂžgle ved hjĂŠlp af en USB-nĂžgle.
Og vigtigst af alt â at alt dette fungerer (spĂžrgsmĂ„let 'hvem betaler for dette?'):
Indtast mailcertifikater til en pris fra 10$ for 3 Är. Certifikaterne gÞr det muligt for afsenderen at angive i DNS, at "mine offentlige nÞgler er derovre". Og de vil muliggÞre oprettelsen af en sikker forbindelse. Samtidig vil sÄdanne forbindelser vÊre gratis at modtage.
Gmail monetariserer endelig sine brugere. For 10$ i 3 Är - retten til at oprette sikre kommunikationskanaler.
============= Konklusion =============
For at teste hele artiklen havde jeg planlagt at leje en dedikeret server i en mÄned og kÞbe et domÊne med SSL-certifikat.
Men livets omstÊndigheder gÞr, at dette spÞrgsmÄl har trukket ud i 2 mÄneder.
Og da der igen dukkede tid op - besluttede jeg at offentliggÞre artiklen som den er, i stedet for at risikere, at offentliggÞrelsen bliver forsinket i endnu et Är.
Hvis der kommer mange spÞrgsmÄl som "her er ikke nok detaljeret beskrevet" - sÄ vil der sikkert blive krÊfter til at leje en dedikeret server med et nyt domÊne og et nyt SSL-certifikat, samt beskrive det endnu mere detaljeret og vigtigst af alt - identificere alle de vigtige detaljer, der er blevet overset.
Jeg vil ogsÄ gerne modtage feedback om ideen med mailcertifikater. Hvis ideen falder i god jord - vil jeg forsÞge at finde krÊfter til at skrive et udkast til RFC.
Ved kopiering af store dele af artiklen - angiv venligst linket til denne artikel.
Ved oversĂŠttelse til ethvert andet sprog - angiv venligst linket til denne artikel.
PĂ„ engelsk vil jeg selv forsĂžge at oversĂŠtte og efterlade krydslinks.
Kilde: habr.com
