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

Makala hii ni kuhusu jinsi ya kuanzisha seva ya barua ya kisasa.
Postfix + Dovecot. SPF + DKIM + rDNS. Na IPv6.
Kwa usimbaji fiche wa TSL. Kwa usaidizi wa vikoa vingi - sehemu na cheti halisi cha SSL.
Kwa ulinzi wa antispam na ukadiriaji wa juu wa antispam kutoka kwa seva zingine za barua.
Inasaidia miingiliano mingi ya kimwili.
Kwa OpenVPN, muunganisho ambao ni kupitia IPv4, na ambayo hutoa IPv6.

Ikiwa hutaki kujifunza teknolojia hizi zote, lakini unataka kuanzisha seva hiyo, basi makala hii ni kwa ajili yako.

Nakala hiyo haijaribu kuelezea kila undani. Maelezo huenda kwa kile ambacho hakijasanidiwa kama kiwango au ni muhimu kutoka kwa mtazamo wa watumiaji.

Motisha ya kusanidi seva ya barua imekuwa ndoto yangu ya muda mrefu. Hii inaweza kuonekana kuwa ya kijinga, lakini IMHO, ni bora zaidi kuliko kuota gari mpya kutoka kwa chapa yako uipendayo.

Kuna motisha mbili za kusanidi IPv6. Mtaalamu wa TEHAMA anahitaji kujifunza teknolojia mpya kila mara ili aendelee kuishi. Ningependa kutoa mchango wangu wa kawaida katika vita dhidi ya udhibiti.

Motisha ya kusanidi OpenVPN ni kupata tu IPv6 kufanya kazi kwenye mashine ya ndani.
Motisha ya kusanidi miingiliano kadhaa ya mwili ni kwamba kwenye seva yangu nina kiolesura kimoja "polepole lakini kisicho na kikomo" na kingine "haraka lakini kwa ushuru".

Motisha ya kusanidi mipangilio ya Bind ni kwamba ISP yangu hutoa seva ya DNS isiyo thabiti, na google pia wakati mwingine hushindwa. Ninataka seva ya DNS thabiti kwa matumizi ya kibinafsi.

Motisha ya kuandika makala - niliandika rasimu miezi 10 iliyopita, na tayari nimeiangalia mara mbili. Hata kama mwandishi anaihitaji mara kwa mara, kuna uwezekano mkubwa kwamba wengine pia wataihitaji.

Hakuna suluhisho la jumla kwa seva ya barua. Lakini nitajaribu kuandika kitu kama "fanya hivi na kisha, wakati kila kitu kitafanya kazi inavyopaswa, tupa vitu vya ziada."

Kampuni ya tech.ru ina seva ya Colocation. Inawezekana kulinganisha na OVH, Hetzner, AWS. Ili kutatua tatizo hili, ushirikiano na tech.ru utakuwa na ufanisi zaidi.

Debian 9 imewekwa kwenye seva.

Seva ina violesura 2 `eno1` na `eno2`. Ya kwanza haina ukomo, na ya pili ni ya haraka, kwa mtiririko huo.

Kuna anwani 3 za IP tuli, XX.XX.XX.X0 na XX.XX.XX.X1 na XX.XX.XX.X2 kwenye kiolesura cha `eno1` na XX.XX.XX.X5 kwenye kiolesura cha `eno2` .

Inapatikana XXXX:XXXX:XXXX:XXXX::/64 kundi la anwani za IPv6 ambazo zimepewa kiolesura cha `eno1` na kutoka kwayo XXXX:XXXX:XXXX:XXXX:1:2::/96 ilitumwa `eno2` kwa ombi langu.

Kuna vikoa 3 `domain1.com`, `domain2.com`, `domain3.com`. Kuna cheti cha SSL cha `domain1.com` na `domain3.com`.

Nina akaunti ya Google ambayo ningependa kuunganisha kisanduku changu cha barua[barua pepe inalindwa]` (kupokea barua na kutuma barua moja kwa moja kutoka kwa kiolesura cha gmail).
Lazima kuwe na kisanduku cha barua`[barua pepe inalindwa]`, nakala ya barua ambayo ninataka kuona katika gmail yangu. Na ni nadra kuweza kutuma kitu kwa niaba ya `[barua pepe inalindwa]`kupitia kiolesura cha wavuti.

Lazima kuwe na kisanduku cha barua`[barua pepe inalindwa]`, ambayo Ivanov atatumia kutoka kwa iPhone yake.

Barua pepe zilizotumwa lazima zitii mahitaji yote ya kisasa ya antispam.
Lazima kuwe na kiwango cha juu zaidi cha usimbaji fiche kinachotolewa katika mitandao ya umma.
Kunapaswa kuwa na usaidizi wa IPv6 kwa kutuma na kupokea barua.
Kunapaswa kuwa na SpamAssassin ambayo haitawahi kufuta barua pepe. Na itaruka au kuruka au kutuma kwa folda ya "Taka" ya IMAP.
Kujifunza kiotomatiki kwa SpamAssassin lazima kusanidiwe: nikihamisha barua kwenye folda ya Barua Taka, itajifunza kutokana na hili; nikihamisha barua kutoka kwa folda ya Barua Taka, itajifunza kutokana na hili. Matokeo ya mafunzo ya SpamAssassin yanapaswa kuathiri ikiwa barua itaishia kwenye folda ya Barua Taka.
Hati za PHP lazima ziweze kutuma barua kwa niaba ya kikoa chochote kwenye seva fulani.
Lazima kuwe na huduma ya openvpn, yenye uwezo wa kutumia IPv6 kwa mteja ambaye hana IPv6.

Kwanza unahitaji kusanidi miingiliano na uelekezaji, pamoja na IPv6.
Kisha utahitaji kusanidi OpenVPN, ambayo itaunganishwa kupitia IPv4 na kumpa mteja anwani ya IPv6 tuli-halisi. Mteja huyu atapata ufikiaji wa huduma zote za IPv6 kwenye seva na ufikiaji wa rasilimali zozote za IPv6 kwenye Mtandao.
Kisha utahitaji kusanidi Postfix kutuma barua + SPF + DKIM + rDNS na vitu vingine vidogo sawa.
Kisha utahitaji kusanidi Dovecot na kusanidi Multidomain.
Kisha utahitaji kusanidi SpamAssassin na kusanidi mafunzo.
Hatimaye, sakinisha Bind.

============= Violesura vingi ==============

Ili kusanidi miingiliano, unahitaji kuandika hii katika "/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

Mipangilio hii inaweza kutumika kwenye seva yoyote katika tech.ru (pamoja na uratibu mdogo na usaidizi) na itafanya kazi mara moja kama inavyopaswa.

Ikiwa una uzoefu wa kusanidi vitu sawa kwa Hetzner, OVH, ni tofauti hapo. Ngumu zaidi.

eno1 ni jina la kadi ya mtandao #1 (polepole lakini isiyo na kikomo).
eno2 ni jina la kadi ya mtandao # 2 (haraka, lakini kwa ushuru).
tun0 ni jina la kadi ya mtandao pepe kutoka OpenVPN.
XX.XX.XX.X0 - IPv4 #1 kwenye eno1.
XX.XX.XX.X1 - IPv4 #2 kwenye eno1.
XX.XX.XX.X2 - IPv4 #3 kwenye eno1.
XX.XX.XX.X5 - IPv4 #1 kwenye eno2.
XX.XX.XX.1 - IPv4 lango.
XXXX:XXXX:XXXX:XXXX::/64 - IPv6 kwa seva nzima.
XXXX:XXXX:XXXX:XXXX:1:2::/96 - IPv6 kwa eno2, kila kitu kingine kutoka nje kinaingia kwenye eno1.
XXXX:XXXX:XXXX:XXXX::1 β€” IPv6 lango (inafaa kukumbuka kuwa hii inaweza/inapaswa kufanywa kwa njia tofauti. Bainisha swichi ya IPv6).
dns-nameservers - 127.0.0.1 imeonyeshwa (kwa sababu bind imewekwa ndani) na 213.248.1.6 (hii ni kutoka kwa tech.ru).

"meza eno1t" na "meza eno2t" - maana ya kanuni hizi za njia ni kwamba trafiki inayoingia kupitia eno1 -> ingeondoka kupitia hiyo, na trafiki inayoingia kupitia eno2 -> ingeondoka kupitia hiyo. Na pia miunganisho iliyoanzishwa na seva ingepitia eno1.

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

Kwa amri hii tunabainisha kwamba trafiki yoyote isiyoeleweka ambayo iko chini ya sheria yoyote iliyoandikwa "meza eno1t" -> itumwe kwenye kiolesura cha eno1.

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

Kwa amri hii tunabainisha kwamba trafiki yoyote iliyoanzishwa na seva inapaswa kuelekezwa kwenye kiolesura cha eno1.

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

Kwa amri hii tunaweka sheria za kuashiria trafiki.

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

Kizuizi hiki kinabainisha IPv4 ya pili ya kiolesura cha eno1.

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

Kwa amri hii tunaweka njia kutoka kwa wateja wa OpenVPN hadi IPv4 ya ndani isipokuwa XX.XX.XX.X0.
Bado sielewi kwa nini amri hii inatosha kwa IPv4 yote.

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

Hapa ndipo tunaweka anwani ya kiolesura yenyewe. Seva itaitumia kama anwani "inayotoka". Haitatumika kwa njia yoyote tena.

Kwa nini ":1:1::" ni ngumu sana? Ili OpenVPN ifanye kazi kwa usahihi na kwa hili tu. Zaidi juu ya hili baadaye.

Kwenye mada ya lango - ndivyo inavyofanya kazi na ni sawa. Lakini njia sahihi ni kuonyesha hapa IPv6 ya swichi ambayo seva imeunganishwa.

Walakini, kwa sababu fulani IPv6 itaacha kufanya kazi ikiwa nitafanya hivi. Labda hii ni aina fulani ya shida ya tech.ru.

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

Hii ni kuongeza anwani ya IPv6 kwenye kiolesura. Ikiwa unahitaji anwani mia, hiyo inamaanisha mistari mia kwenye faili hii.

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

Nilibaini anwani na subnets za miingiliano yote ili kuifanya iwe wazi.
eno1 - lazima iwe "/64"- kwa sababu hii ni dimbwi letu la anwani.
tun0 - subnet lazima iwe kubwa kuliko eno1. Vinginevyo, haitawezekana kusanidi lango la IPv6 kwa wateja wa OpenVPN.
eno2 - subnet lazima iwe kubwa kuliko tun0. Vinginevyo, wateja wa OpenVPN hawataweza kufikia anwani za ndani za IPv6.
Kwa uwazi, nilichagua hatua ndogo ya 16, lakini ikiwa unataka, unaweza hata kufanya hatua "1".
Ipasavyo, 64+16 = 80, na 80+16 = 96.

Kwa uwazi zaidi:
XXXX:XXXX:XXXX:XXXX:1:1:YYYY:YYYY ni anwani ambazo zinapaswa kupewa tovuti au huduma mahususi kwenye kiolesura cha eno1.
XXXX:XXXX:XXXX:XXXX:1:2:YYYY:YYYY ni anwani ambazo zinapaswa kupewa tovuti au huduma mahususi kwenye kiolesura cha eno2.
XXXX:XXXX:XXXX:XXXX:1:3:YYYY:YYYY ni anwani ambazo zinapaswa kukabidhiwa kwa wateja wa OpenVPN au kutumika kama anwani za huduma za OpenVPN.

Ili kusanidi mtandao, itawezekana kuwasha tena seva.
Mabadiliko ya IPv4 yanachukuliwa wakati yanatekelezwa (hakikisha unaifunika kwenye skrini - vinginevyo amri hii itagonga mtandao kwenye seva):

/etc/init.d/networking restart

Ongeza hadi mwisho wa faili "/etc/iproute2/rt_tables":

100 eno1t
101 eno2t

Bila hii, huwezi kutumia meza maalum katika faili "/etc/network/interfaces".
Nambari lazima ziwe za kipekee na zisizozidi 65535.

Mabadiliko ya IPv6 yanaweza kubadilishwa kwa urahisi bila kuwasha upya, lakini ili kufanya hivyo unahitaji kujifunza angalau amri tatu:

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

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

Hii ni mipangilio ya "sysctl" ya seva yangu. Ngoja nionyeshe jambo muhimu.

net.ipv4.ip_forward = 1

Bila hii, OpenVPN haitafanya kazi hata kidogo.

net.ipv6.ip_nonlocal_bind = 1

Mtu yeyote anayejaribu kufunga IPv6 (kwa mfano nginx) mara tu baada ya kiolesura kukamilika atapokea hitilafu. Kwamba anwani hii haipatikani.

Ili kuepuka hali hiyo, kuweka vile hufanywa.

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

Bila mipangilio hii ya IPv6, trafiki kutoka kwa mteja wa OpenVPN haiendi ulimwenguni.

Mipangilio mingine haifai au sikumbuki ni ya nini.
Lakini ikiwa tu, ninaiacha "kama ilivyo."

Ili mabadiliko kwenye faili hii yachukuliwe bila kuwasha tena seva, unahitaji kutekeleza amri:

sysctl -p

Maelezo zaidi juu ya sheria za "meza": habr.com/post/108690

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

OpenVPN IPv4 haifanyi kazi bila iptables.

Iptables zangu ni kama hii kwa 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 ni anwani yangu tuli ya IPv4 ya mashine ya ndani.
10.8.0.0/24 - IPv4 openvpn mtandao. Anwani za IPv4 kwa wateja wa openvpn.
Uthabiti wa sheria ni muhimu.

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

Hiki ni kizuizi ili mimi pekee ninaweza kutumia OpenVPN kutoka kwa IP yangu tuli.

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

Ili kusambaza pakiti za IPv4 kati ya wateja wa OpenVPN na Mtandao, unahitaji kusajili mojawapo ya amri hizi.

Kwa kesi tofauti, moja ya chaguo haifai.
Amri zote mbili zinafaa kwa kesi yangu.
Baada ya kusoma nyaraka, nilichagua chaguo la kwanza kwa sababu hutumia CPU kidogo.

Ili mipangilio yote ya iptables ichukuliwe baada ya kuanza upya, unahitaji kuwahifadhi mahali fulani.

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

Majina kama haya hayakuchaguliwa kwa bahati. Zinatumiwa na kifurushi cha "iptables-persistent".

apt-get install iptables-persistent

Kufunga kifurushi kikuu cha OpenVPN:

apt-get install openvpn easy-rsa

Hebu tuweke kiolezo cha vyeti (badala ya maadili yako):

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

Hebu tuhariri mipangilio ya kiolezo cha cheti:

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

Unda cheti cha seva:

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

Wacha tuandae uwezo wa kuunda faili za mwisho za "client-name.opvn":

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

# Client mode
client

# Interface tunnel type
dev tun

# TCP protocol
proto tcp-client

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

# Don't bind to local port/address
nobind

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

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

# Enable compression
comp-lzo

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

Wacha tuandae hati ambayo itaunganisha faili zote kuwa faili moja ya opvn.

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

#!/bin/bash

# First argument: Client identifier

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

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

Kuunda mteja wa kwanza wa OpenVPN:

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

Faili "~/client-configs/files/client-name.ovpn" inatumwa kwa kifaa cha mteja.

Kwa wateja wa iOS utahitaji kufanya hila zifuatazo:
Maudhui ya lebo ya "tls-auth" lazima yasiwe na maoni.
Na pia weka "mwelekeo wa ufunguo 1" mara moja kabla ya lebo ya "tls-auth".

Wacha tusanidi usanidi wa seva ya 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

Hii inahitajika ili kuweka anwani tuli kwa kila mteja (sio lazima, lakini ninaitumia):

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

Maelezo magumu zaidi na muhimu.

Kwa bahati mbaya, OpenVPN bado haijui jinsi ya kujitegemea kusanidi lango la IPv6 kwa wateja.
Unapaswa "kusambaza mwenyewe" hii kwa kila mteja.

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

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

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

Hati zote mbili hutumia faili "/etc/openvpn/vigezo":

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

Ninapata shida kukumbuka kwa nini imeandikwa hivi.

Sasa netmask = 112 inaonekana ya kushangaza (inapaswa kuwa 96 hapo hapo).
Na kiambishi awali ni cha kushangaza, hailingani na mtandao wa tun0.
Lakini sawa, nitaiacha kama ilivyo.

cipher DES-EDE3-CBC

Hii sio ya kila mtu - nilichagua njia hii ya kusimba kiunganisho.

Pata maelezo zaidi kuhusu kusanidi OpenVPN IPv4.

Pata maelezo zaidi kuhusu kusanidi OpenVPN IPv6.

============= Marekebisho ya posta =============

Kuweka kifurushi kikuu:

apt-get install postfix

Wakati wa kufunga, chagua "tovuti ya mtandao".

Yangu "/etc/postfix/main.cf" inaonekana kama hii:

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

Wacha tuangalie maelezo ya usanidi huu.

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

Kulingana na wakaazi wa Khabrovsk, kizuizi hiki kina "taarifa potofu na nadharia zisizo sahihi."Miaka 8 tu baada ya kuanza kwa kazi yangu ndipo nilianza kuelewa jinsi SSL inavyofanya kazi.

Kwa hivyo, nitachukua uhuru wa kuelezea jinsi ya kutumia SSL (bila kujibu maswali "Inafanyaje kazi?" na "Kwa nini inafanya kazi?").

Msingi wa encryption ya kisasa ni kuundwa kwa jozi muhimu (kamba mbili za muda mrefu sana za wahusika).

"Ufunguo" mmoja ni wa faragha, ufunguo mwingine ni "umma". Tunaweka ufunguo wa faragha kwa uangalifu sana. Tunasambaza ufunguo wa umma kwa kila mtu.

Kwa kutumia ufunguo wa umma, unaweza kusimba mfuatano wa maandishi kwa njia fiche ili mmiliki wa ufunguo wa faragha pekee aweze kuuondoa.
Naam, hiyo ndiyo msingi mzima wa teknolojia.

Hatua #1 - tovuti za https.
Wakati wa kufikia tovuti, kivinjari hujifunza kutoka kwa seva ya wavuti kwamba tovuti ni https na kwa hiyo huomba ufunguo wa umma.
Seva ya wavuti inatoa ufunguo wa umma. Kivinjari hutumia ufunguo wa umma kusimba ombi la http na kulituma.
Yaliyomo katika ombi la http yanaweza kusomwa tu na wale ambao wana ufunguo wa kibinafsi, ambayo ni, seva tu ambayo ombi hufanywa.
Ombi la Http lina angalau URI. Kwa hivyo, ikiwa nchi inajaribu kuzuia ufikiaji sio kwa tovuti nzima, lakini kwa ukurasa maalum, basi hii haiwezekani kufanya kwa tovuti za https.

Hatua #2 - jibu lililosimbwa kwa njia fiche.
Seva ya wavuti hutoa jibu ambalo linaweza kusomeka kwa urahisi barabarani.
Suluhisho ni rahisi sana - kivinjari ndani ya nchi hutoa jozi sawa za ufunguo wa kibinafsi-umma kwa kila tovuti ya https.
Na pamoja na ombi la ufunguo wa umma wa tovuti, hutuma ufunguo wake wa ndani wa umma.
Seva ya wavuti inaikumbuka na, wakati wa kutuma majibu ya http, huisimba kwa ufunguo wa umma wa mteja maalum.
Sasa majibu ya http yanaweza tu kusimbwa na mmiliki wa ufunguo wa faragha wa kivinjari (yaani, mteja mwenyewe).

Hatua ya 3 - kuanzisha uunganisho salama kupitia kituo cha umma.
Kuna udhaifu katika mfano Nambari 2 - hakuna kinachozuia watu wenye mapenzi mema kuingilia ombi la http na kuhariri habari kuhusu ufunguo wa umma.
Kwa hivyo, mpatanishi ataona wazi maudhui yote ya ujumbe uliotumwa na kupokea hadi kituo cha mawasiliano kitabadilika.
Kushughulikia hili ni rahisi sana - tuma tu ufunguo wa umma wa kivinjari kama ujumbe uliosimbwa kwa njia fiche kwa ufunguo wa umma wa seva ya wavuti.
Seva ya wavuti kisha kwanza hutuma jibu kama "ufunguo wako wa umma uko hivi" na husimba ujumbe huu kwa ufunguo sawa wa umma.
Kivinjari kinaangalia jibu - ikiwa ujumbe "ufunguo wako wa umma ni kama huu" umepokelewa - basi hii ni hakikisho la 100% kwamba kituo hiki cha mawasiliano ni salama.
Je, ni salama kiasi gani?
Uundaji wa njia salama kama hiyo ya mawasiliano hufanyika kwa kasi ya ping * 2. Kwa mfano 20ms.
Mshambulizi lazima awe na ufunguo wa faragha wa mmoja wa wahusika mapema. Au pata ufunguo wa faragha katika milisekunde kadhaa.
Kudukua ufunguo mmoja wa kisasa wa faragha itachukua miongo kadhaa kwenye kompyuta kuu.

Hatua # 4 - hifadhidata ya umma ya funguo za umma.
Kwa wazi, katika hadithi hii yote kuna fursa kwa mshambuliaji kukaa kwenye kituo cha mawasiliano kati ya mteja na seva.
Mteja anaweza kujifanya kuwa seva, na seva inaweza kujifanya kuwa mteja. Na uige jozi ya funguo katika pande zote mbili.
Kisha mshambuliaji ataona trafiki yote na ataweza "kuhariri" trafiki.
Kwa mfano, badilisha anwani ya kutuma pesa au unakili nenosiri kutoka kwa benki ya mtandaoni au uzuie maudhui "yanayoweza kupingwa".
Ili kupambana na washambuliaji kama hao, walikuja na hifadhidata ya umma iliyo na funguo za umma kwa kila tovuti ya https.
Kila kivinjari "kinajua" juu ya uwepo wa hifadhidata kama 200 hivi. Hii inakuja ikiwa imesakinishwa awali katika kila kivinjari.
"Maarifa" yanaungwa mkono na ufunguo wa umma kutoka kwa kila cheti. Hiyo ni, muunganisho kwa kila mamlaka maalum ya uthibitishaji hauwezi kughushiwa.

Sasa kuna ufahamu rahisi wa jinsi ya kutumia SSL kwa https.
Ikiwa unatumia ubongo wako, itakuwa wazi jinsi huduma maalum zinaweza kudanganya kitu katika muundo huu. Lakini itawagharimu juhudi kubwa.
Na mashirika madogo kuliko NSA au CIA - karibu haiwezekani kudukua kiwango kilichopo cha ulinzi, hata kwa VIP.

Pia nitaongeza kuhusu miunganisho ya ssh. Hakuna funguo za umma hapo, kwa hivyo unaweza kufanya nini? Suala hilo linatatuliwa kwa njia mbili.
Chaguo ssh-kwa-nenosiri:
Wakati wa muunganisho wa kwanza, mteja wa ssh anapaswa kuonya kwamba tuna ufunguo mpya wa umma kutoka kwa seva ya ssh.
Na wakati wa miunganisho zaidi, ikiwa onyo "ufunguo mpya wa umma kutoka kwa seva ya ssh" litaonekana, itamaanisha kuwa wanajaribu kukusikiliza.
Au ulisikizwa kwenye muunganisho wako wa kwanza, lakini sasa unawasiliana na seva bila waamuzi.
Kweli, kutokana na ukweli kwamba ukweli wa wiretapping ni rahisi, haraka na bila kujitahidi, shambulio hili linatumika tu katika kesi maalum kwa mteja maalum.

Chaguo ssh-by-key:
Tunachukua gari la flash, andika ufunguo wa kibinafsi kwa seva ya ssh juu yake (kuna masharti na nuances nyingi muhimu kwa hili, lakini ninaandika programu ya elimu, si maagizo ya matumizi).
Tunaacha ufunguo wa umma kwenye mashine ambapo mteja wa ssh atakuwa na pia tunaiweka siri.
Tunaleta gari la flash kwenye seva, kuiingiza, nakala ya ufunguo wa kibinafsi, na kuchoma gari la flash na kueneza majivu kwa upepo (au angalau kuitengeneza kwa zero).
Hiyo ndiyo yote - baada ya operesheni kama hiyo haitawezekana kuvinjari unganisho kama hilo la ssh. Kwa kweli, katika miaka 10 itawezekana kutazama trafiki kwenye kompyuta kubwa - lakini hiyo ni hadithi tofauti.

Naomba radhi kwa offtopic.

Kwa hivyo sasa nadharia inajulikana. Nitakuambia kuhusu mtiririko wa kuunda cheti cha SSL.

Kwa kutumia "openssl genrsa" tunaunda ufunguo wa faragha na "mapengo" kwa ufunguo wa umma.
Tunatuma "ajabu" kwa kampuni nyingine, ambayo tunalipa takriban $9 kwa cheti rahisi zaidi.

Baada ya saa kadhaa, tunapokea ufunguo wetu wa "umma" na seti ya funguo kadhaa za umma kutoka kwa kampuni hii ya watu wengine.

Kwa nini kampuni ya tatu inapaswa kulipa usajili wa ufunguo wangu wa umma ni swali tofauti, hatutazingatia hapa.

Sasa ni wazi maana ya maandishi ni nini:

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

Folda ya "/etc/ssl" ina faili zote za masuala ya ssl.
domain1.com - jina la kikoa.
2018 ni mwaka wa uumbaji muhimu.
"ufunguo" - kuashiria kwamba faili ni ufunguo wa kibinafsi.

Na maana ya faili hii:

smtpd_tls_cert_file=/etc/ssl/domain1.com.2018.chained.crt
domain1.com - jina la kikoa.
2018 ni mwaka wa uumbaji muhimu.
minyororo - uteuzi kwamba kuna mlolongo wa funguo za umma (ya kwanza ni ufunguo wetu wa umma na iliyobaki ni yale yaliyotoka kwa kampuni iliyotoa ufunguo wa umma).
crt - uteuzi kwamba kuna cheti kilichotengenezwa tayari (ufunguo wa umma na maelezo ya kiufundi).

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

Mpangilio huu hautumiwi katika kesi hii, lakini imeandikwa kama mfano.

Kwa sababu hitilafu katika parameta hii itasababisha barua taka kutumwa kutoka kwa seva yako (bila mapenzi yako).

Kisha uthibitishe kwa kila mtu kwamba huna hatia.

recipient_delimiter = +

Watu wengi wanaweza wasijue, lakini hii ni herufi ya kawaida ya kuweka barua pepe, na inaungwa mkono na seva nyingi za kisasa za barua.

Kwa mfano, ikiwa una kisanduku cha barua "[barua pepe inalindwa]"jaribu kutuma kwa"[barua pepe inalindwa]"- angalia kile kinachotokea.

inet_protocols = ipv4

Hii inaweza kuwa na utata.

Lakini sio hivyo tu. Kila kikoa kipya ni kwa chaguo-msingi IPv4 pekee, kisha ninawasha IPv6 kwa kila moja kando.

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

Hapa tunabainisha kuwa barua zote zinazoingia huenda kwa dovecot.
Na sheria za kikoa, sanduku la barua, lakabu - angalia kwenye hifadhidata.

/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

Sasa postfix inajua kuwa barua inaweza kukubaliwa kwa kutuma zaidi tu baada ya kuidhinishwa na dovecot.

Kwa kweli sielewi kwa nini hii inarudiwa hapa. Tayari tumebainisha kila kitu kinachohitajika katika "virtual_transport".

Lakini mfumo wa postfix ni wa zamani sana - labda ni kurudi nyuma kutoka kwa siku za zamani.

smtpd_recipient_restrictions =
        ...

smtpd_helo_restrictions =
        ...

smtpd_client_restrictions =
        ...

Hii inaweza kusanidiwa tofauti kwa kila seva ya barua.

Nina seva 3 za barua ninazo nazo na mipangilio hii ni tofauti sana kwa sababu ya mahitaji tofauti ya matumizi.

Unahitaji kuisanidi kwa uangalifu - vinginevyo barua taka itakumiminikia, au mbaya zaidi - barua taka zitatoka kwako.

# SPF
policyd-spf_time_limit = 3600

Kuweka kwa programu-jalizi fulani inayohusiana na kuangalia SPF ya herufi zinazoingia.

# 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

Mpangilio ni kwamba lazima tupe saini ya DKIM na barua pepe zote zinazotoka.

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

Hii ni maelezo muhimu katika kuelekeza barua wakati wa kutuma barua kutoka kwa hati za PHP.

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

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

Upande wa kushoto ni maneno ya kawaida. Upande wa kulia ni lebo inayoashiria herufi.
Postfix kwa mujibu wa lebo - itazingatia mistari michache zaidi ya usanidi kwa barua maalum.

Jinsi postfix itasanidiwa upya kwa herufi maalum itaonyeshwa katika "master.cf".

Mstari wa 4, 5, 6 ndio kuu. Kwa niaba ya kikoa gani tunatuma barua, tunaweka lebo hii.
Lakini sehemu ya "kutoka" haionyeshwa kila wakati katika hati za PHP kwenye nambari ya zamani. Kisha jina la mtumiaji linakuja kuwaokoa.

Nakala tayari ni pana - nisingependa kukengeushwa kwa kusanidi nginx+fpm.

Kwa kifupi, kwa kila tovuti tunaweka mmiliki wake wa mtumiaji wa linux. Na ipasavyo fpm-pool yako.

Fpm-pool hutumia toleo lolote la php (ni nzuri wakati kwenye seva hiyo unaweza kutumia matoleo tofauti ya php na hata php.ini tofauti kwa tovuti za jirani bila matatizo).

Kwa hivyo, mtumiaji maalum wa linux "www-domain2" ana tovuti domain2.com. Tovuti hii ina msimbo wa kutuma barua pepe bila kubainisha kutoka kwa uga.

Kwa hiyo, hata katika kesi hii, barua zitatumwa kwa usahihi na hazitawahi kuishia kwenye barua taka.

Yangu "/etc/postfix/master.cf" inaonekana kama hii:

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

Faili haijatolewa kwa ukamilifu - tayari ni kubwa sana.
Niligundua tu kile kilichobadilishwa.

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}

Hii ni mipangilio inayohusiana na spamassasin, zaidi juu ya hiyo baadaye.

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

Tunakuruhusu kuunganisha kwa seva ya barua kupitia mlango 587.
Ili kufanya hivyo, lazima uingie.

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

Washa ukaguzi wa SPF.

apt-get install postfix-policyd-spf-python

Wacha tusakinishe kifurushi cha ukaguzi wa SPF hapo juu.

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

Na hili ndilo jambo la kuvutia zaidi. Huu ni uwezo wa kutuma barua kwa kikoa mahususi kutoka kwa anwani mahususi ya IPv4/IPv6.

Hii inafanywa kwa ajili ya rDNS. rDNS ni mchakato wa kupokea kamba kwa anwani ya IP.
Na kwa barua, kipengele hiki kinatumika kuthibitisha kwamba helo inalingana kabisa na rDNS ya anwani ambayo barua pepe ilitumwa.

Ikiwa helo hailingani na kikoa cha barua pepe kwa niaba yake ambaye barua ilitumwa, pointi za barua taka zitatolewa.

Helo hailingani na rDNS - pointi nyingi za barua taka hutolewa.
Ipasavyo, kila kikoa lazima kiwe na anwani yake ya IP.
Kwa OVH - katika console inawezekana kutaja rDNS.
Kwa tech.ru - suala linatatuliwa kwa msaada.
Kwa AWS, suala linatatuliwa kupitia usaidizi.
"inet_protocols" na "smtp_bind_address6" - tunawasha usaidizi wa IPv6.
Kwa IPv6 unahitaji pia kusajili rDNS.
"syslog_name" - na hii ni kwa urahisi wa kusoma kumbukumbu.

Nunua vyeti Ninapendekeza hapa.

Inasanidi kiungo cha postfix+dovecot hapa.

Kuweka SPF.

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

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

Kuanzisha mysql, kusanikisha vifurushi vyenyewe.

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

disable_plaintext_auth = yes
auth_mechanisms = plain login

Uidhinishaji umesimbwa kwa njia fiche pekee.

Faili β€œ/etc/dovecot/conf.d/10-mail.conf”

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

Hapa tunaonyesha mahali pa kuhifadhi barua.

Ninataka zihifadhiwe katika faili na kuwekwa kwenye vikundi kwa kikoa.

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

Hii ndio faili kuu ya usanidi ya dovecot.
Hapa tunazima miunganisho isiyolindwa.
Na uwezeshe miunganisho salama.

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

Kuanzisha ssl. Tunaonyesha kuwa ssl inahitajika.
Na cheti chenyewe. Na maelezo muhimu ni maagizo ya "ndani". Inaonyesha cheti kipi cha SSL cha kutumia unapounganisha kwa IPv4 ya ndani.

Kwa njia, IPv6 haijasanidiwa hapa, nitarekebisha upungufu huu baadaye.
XX.XX.XX.X5 (kikoa2) - hakuna cheti. Ili kuunganisha wateja unahitaji kubainisha domain1.com.
XX.XX.XX.X2 (kikoa3) - kuna cheti, unaweza kubainisha domain1.com au domain3.com ili kuunganisha wateja.

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

protocol lda {
  mail_plugins = $mail_plugins sieve
}

Hii itahitajika kwa spamassassin katika siku zijazo.

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

protocol imap {
  mail_plugins = $mail_plugins antispam
}

Hii ni programu-jalizi ya antispam. Inahitajika kwa mafunzo ya spamassasin wakati wa kuhamisha hadi/kutoka folda ya "Taka".

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

protocol pop3 {
}

Kuna faili kama hiyo.

Faili β€œ/etc/dovecot/conf.d/20-lmtp.conf”

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

Kuanzisha lmtp.

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

Mipangilio ya mafunzo ya Spamassasin wakati wa kuhamisha hadi/kutoka kwenye folda ya Barua Taka.

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

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

Faili inayobainisha cha kufanya na herufi zinazoingia.

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

require ["fileinto", "mailbox"];

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

Unahitaji kukusanya faili: "sievec default.sieve".

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

Inabainisha faili za sql kwa idhini.
Na faili yenyewe hutumiwa kama njia ya idhini.

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

Hii inalingana na mipangilio sawa ya postfix.

Faili "/etc/dovecot/dovecot.conf"

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

Faili kuu ya usanidi.
Jambo muhimu ni kwamba tunaonyesha hapa - ongeza itifaki.

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

apt-get install spamassassin spamc

Hebu tusakinishe vifurushi.

adduser spamd --disabled-login

Hebu tuongeze mtumiaji kwa niaba yake.

systemctl enable spamassassin.service

Tunawezesha huduma ya upakiaji wa spamassassin kiotomatiki inapopakia.

Faili "/etc/default/spamassassin":

CRON=1

Kwa kuwezesha uppdatering otomatiki wa sheria "kwa chaguo-msingi".

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

Unahitaji kuunda hifadhidata "sa" katika mysql na mtumiaji "sa" na nenosiri "nenosiri" (badilisha na kitu cha kutosha).

report_safe - hii itatuma ripoti ya barua pepe taka badala ya barua.
use_bayes ni mipangilio ya kujifunza mashine ya spamassassin.

Mipangilio iliyobaki ya spamassassin ilitumiwa mapema katika makala.

Mpangilio wa jumla "spamassassin".
Kuhusu kuhamisha barua pepe mpya za Barua taka hadi kwenye folda ya "Spam" ya IMAP.
Kuhusu mchanganyiko rahisi wa Dovecot + SpamAssassin.
Ninapendekeza kusoma nadharia ya ujifunzaji ya spamassasin wakati wa kusonga herufi kwenye folda za imap (na siipendekezi kuitumia).

============= Rufaa kwa jamii ==============

Ningependa pia kutupa wazo kwa jamii kuhusu jinsi ya kuongeza kiwango cha usalama wa barua zinazotumwa. Kwa kuwa nimezama sana katika mada ya barua.

Ili mtumiaji aweze kuunda jozi ya funguo kwenye mteja wake (mtazamo, thunderbird, browser-plugin, ...). Umma na faragha. Umma - tuma kwa DNS. Binafsi - hifadhi kwa mteja. Seva za barua zitaweza kutumia ufunguo wa umma kutuma kwa mpokeaji mahususi.

Na kulinda dhidi ya barua taka na barua kama hizo (ndio, seva ya barua haitaweza kuona yaliyomo) - utahitaji kuanzisha sheria 3:

  1. Sahihi halisi ya lazima ya DKIM, SPF ya lazima, rDNS ya lazima.
  2. Mtandao wa neva kuhusu mafunzo ya antispam + hifadhidata yake kwa upande wa mteja.
  3. Kanuni ya usimbaji fiche lazima iwe hivyo kwamba upande unaotuma lazima utumie nguvu ya CPU mara 100 kwenye usimbaji fiche kuliko upande unaopokea.

Mbali na barua za umma, tengeneza barua ya kawaida ya pendekezo "kuanza mawasiliano salama." Mmoja wa watumiaji (sanduku la barua) hutuma barua iliyo na kiambatisho kwenye sanduku lingine la barua. Barua hiyo ina pendekezo la maandishi ili kuanza njia salama ya mawasiliano kwa mawasiliano na ufunguo wa umma wa mmiliki wa sanduku la barua (na ufunguo wa kibinafsi kwenye upande wa mteja).

Unaweza kutengeneza funguo kadhaa mahsusi kwa kila mawasiliano. Mtumiaji wa mpokeaji anaweza kukubali toleo hili na kutuma ufunguo wake wa umma (pia umetengenezwa mahususi kwa mawasiliano haya). Ifuatayo, mtumiaji wa kwanza hutuma barua ya udhibiti wa huduma (iliyosimbwa na ufunguo wa umma wa mtumiaji wa pili) - baada ya kupokea ambayo mtumiaji wa pili anaweza kuzingatia njia ya mawasiliano iliyoundwa kuwa ya kuaminika. Ifuatayo, mtumiaji wa pili hutuma barua ya kudhibiti - na kisha mtumiaji wa kwanza anaweza pia kuzingatia usalama wa kituo kilichoundwa.

Ili kupambana na kuingiliwa kwa funguo kwenye barabara, itifaki inapaswa kutoa uwezekano wa kupeleka angalau ufunguo mmoja wa umma kwa kutumia gari la flash.

Na jambo muhimu zaidi ni kwamba yote hufanya kazi (swali ni "nani atalipia?"):
Weka vyeti vya posta kuanzia $10 kwa miaka 3. Ambayo itamruhusu mtumaji kuashiria katika dns kwamba "funguo zangu za umma ziko hapo." Na watakupa fursa ya kuanza muunganisho salama. Wakati huo huo, kukubali miunganisho kama hiyo ni bure.
gmail hatimaye inachuma mapato kwa watumiaji wake. Kwa $10 kwa miaka 3 - haki ya kuunda njia salama za mawasiliano.

============= Hitimisho =============

Ili kujaribu nakala nzima, ningekodisha seva iliyojitolea kwa mwezi mmoja na kununua kikoa kilicho na cheti cha SSL.

Lakini hali za maisha zilikua kwa hivyo suala hili likaendelea kwa miezi 2.
Na kwa hivyo, nilipokuwa na wakati wa bure tena, niliamua kuchapisha nakala hiyo kama ilivyo, badala ya kuhatarisha kwamba uchapishaji huo ungeendelea kwa mwaka mwingine.

Ikiwa kuna maswali mengi kama vile "lakini hili halijaelezewa kwa undani wa kutosha", basi labda kutakuwa na nguvu ya kuchukua seva iliyojitolea iliyo na kikoa kipya na cheti kipya cha SSL na kuielezea kwa undani zaidi na, nyingi. muhimu, kutambua maelezo yote muhimu ambayo hayapo.

Ningependa pia kupata maoni juu ya mawazo kuhusu vyeti vya posta. Ikiwa unapenda wazo hilo, nitajaribu kupata nguvu ya kuandika rasimu ya rfc.

Wakati wa kunakili sehemu kubwa za kifungu, toa kiunga cha nakala hii.
Unapotafsiri kwa lugha nyingine yoyote, toa kiungo cha makala haya.
Nitajaribu kutafsiri kwa Kiingereza mwenyewe na kuacha marejeleo mtambuka.


Chanzo: mapenzi.com

Kuongeza maoni