Debian + Postfix + Dovecot + Multidomain + SSL + IPv6 + OpenVPN + Pir-navber + SpamAssassin-learn + Bind

Ev gotar li ser meriv çawa serverek nameyê ya nûjen saz dike.
Postfix + Dovecot. SPF + DKIM + rDNS. Bi IPv6.
Bi şîfrekirina TSL. Bi piştgirî ji bo gelek domên - beşek bi sertîfîkaya SSL-ya rastîn.
Bi parastina antîspam û rêjeyek bilind a antispam ji serverên din ên nameyê re.
Gelek pêwendiyên fîzîkî piştgirî dike.
Bi OpenVPN re, girêdana ku bi IPv4 ve ye, û ku IPv6 peyda dike.

Heke hûn nexwazin van hemî teknolojiyên fêr bibin, lê hûn dixwazin serverek wusa saz bikin, wê hingê ev gotar ji bo we ye.

Gotar hewl nade ku her hûrgulî rave bike. Ravekirin diçe tiştê ku wekî standard nehatiye mîheng kirin an ji hêla xerîdar ve girîng e.

Motivasyona sazkirina serverek e-nameyê xewnek min a demdirêj e. Dibe ku ev bêaqil xuya bike, lê IMHO, ew ji xewna gerîdeyek nû ya ji marqeya xweya bijare pir çêtir e.

Ji bo sazkirina IPv6 du motîvasyon hene. Pêdivî ye ku pisporek IT-ê bi berdewamî teknolojiyên nû fêr bibe da ku bijî. Ez dixwazim di têkoşîna li dijî sansurê de tevkariya xwe ya hindik bikim.

Motivasyona sazkirina OpenVPN tenê ev e ku IPv6 li ser makîneya herêmî bixebite.
Motivasyona sazkirina çend navgînên laşî ev e ku li ser servera min navberek "hêdî lê bêsînor" û ya din jî "zû lê bi tarîf" heye.

Motivasyona sazkirina mîhengên Bind ev e ku ISP-ya min serverek DNS-a nestêbar peyda dike, û google jî carinan têk diçe. Ez ji bo karanîna kesane serverek DNS-ya domdar dixwazim.

Motîvasyona nivîsandina gotarekê - Min 10 meh berê pêşnûmeyek nivîsî, û min berê du caran lê nihêrî. Her çend nivîskar bi rêkûpêk pêdiviya wê hebe jî, îhtimalek mezin heye ku kesên din jî pê hewce bibin.

Ji bo serverek nameyê çareseriyek gerdûnî tune. Lê ez ê hewl bidim ku tiştek wekî "vê bike û paşê, gava ku her tişt wekî ku divê bixebite, tiştên zêde bavêje" binivîsim.

Pargîdaniya tech.ru serverek Colocation heye. Dibe ku bi OVH, Hetzner, AWS re were berhev kirin. Ji bo çareserkirina vê pirsgirêkê, hevkariya bi tech.ru re dê pir bi bandortir be.

Debian 9 li ser serverê hatî saz kirin.

Pêşkêşkar 2 navberên `eno1` û `eno2` hene. Ya yekem bêsînor e, û ya duyemîn bi rêzê zû ye.

3 navnîşanên IP-ya statîk hene, XX.XX.XX.X0 û XX.XX.XX.X1 û XX.XX.XX.X2 li ser pêwendiya `eno1` û XX.XX.XX.X5 li ser pêwendiya `eno2` .

Berdest XXXX:XXX:XXX:XXXX::/64 komek navnîşanên IPv6 ku ji navbeyna `eno1` re hatine veqetandin û ji wê XXXX:XXXX:XXXX:XXXX:1:2::/96 li ser daxwaza min ji `eno2` re hate veqetandin.

3 domên `domain1.com`, `domain2.com`, `domain3.com` hene. Ji bo `domain1.com` û `domain3.com` sertîfîkaya SSL heye.

Hesabek min a Google heye ku ez dixwazim qutiya posta xwe pê ve girêbidim[email parastî]` (wergirtin û şandina e-nameyê rasterast ji navgîniya gmail).
Divê qutiyeke posteyê hebe`[email parastî]`, kopiyek e-nameya ku ez dixwazim di gmail-a xwe de bibînim. Û kêm e ku meriv bikaribe tiştekî li ser navê ``[email parastî]` bi navgîniya webê.

Divê qutiyeke posteyê hebe`[email parastî]`, ku Ivanov dê ji iPhone-a xwe bikar bîne.

E-nameyên şandin divê bi hemî daxwazên nûjen ên antispam re tevbigerin.
Pêdivî ye ku di torên gelemperî de asta herî bilind a şîfrekirinê hebe.
Divê hem ji bo şandin û hem jî ji bo wergirtina nameyan piştgirîya IPv6 hebe.
Pêdivî ye ku SpamAssassin hebe ku çu carî e-nameyê jê neke. Û ew ê bişkîne an jî bişkîne an bişîne peldanka IMAP "Spam".
Pêdivî ye ku fêrbûna oto-SpamAssassin were mîheng kirin: ger ez nameyekê bixim peldanka Spam, ew ê ji vê yekê fêr bibe; ger ez nameyekê ji peldanka Spam bar bikim, ew ê ji vê yekê fêr bibe. Encamên perwerdehiya SpamAssassin divê bandor bike ka name di peldanka Spam de biqede.
Skrîptên PHP divê bikaribin li ser navê her domainê li ser serverek diyar e-nameyê bişînin.
Pêdivî ye ku karûbarek openvpn hebe, bi şiyana karanîna IPv6 li ser xerîdarek ku IPv6 tune ye.

Pêşî hûn hewce ne ku navbeynkar û rêvekirinê, tevî IPv6, mîheng bikin.
Dûv re hûn ê hewce bikin ku OpenVPN-ê mîheng bikin, ku dê bi IPv4 ve girêbide û navnîşek IPv6-ya statîk-rast-rast ji xerîdar re peyda bike. Ev xerîdar dê bigihîje hemî karûbarên IPv6 li ser serverê û bigihîje her çavkaniyên IPv6 li ser Înternetê.
Dûv re hûn ê hewce bikin ku Postfix-ê mîheng bikin da ku tîpan + SPF + DKIM + rDNS û tiştên piçûk ên mîna hev bişîne.
Dûv re hûn hewce ne ku Dovecot mîheng bikin û Multidomain-ê mîheng bikin.
Dûv re hûn ê hewce bikin ku SpamAssassin mîheng bikin û perwerdehiyê mîheng bikin.
Di dawiyê de, Bind saz bikin.

============= Pirnavber ==============

Ji bo veavakirina navbeynkaran, hûn hewce ne ku vê yekê di "/etc/network/interfaces" de binivîsin.

# 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

Van mîhengan dikarin li ser her serverek li tech.ru (bi piçek hevrêziyek bi piştgirîyê re) werin sepandin û ew ê tavilê wekî ku divê bixebite.

Ger we ezmûna sazkirina tiştên wekhev ji bo Hetzner, OVH heye, ew li wir cûda ye. Zehmettir.

eno1 navê qerta torê #1 e (hêdî lê bêsînor).
eno2 navê qerta torê #2 e (zû, lê bi tarîf).
tun0 navê qerta torê ya virtual ji OpenVPN e.
XX.XX.XX.X0 - IPv4 #1 li ser eno1.
XX.XX.XX.X1 - IPv4 #2 li ser eno1.
XX.XX.XX.X2 - IPv4 #3 li ser eno1.
XX.XX.XX.X5 - IPv4 #1 li ser eno2.
XX.XX.XX.1 - Deriyê IPv4.
XXX:XXX:XXXX:XXXX::/64 - IPv6 ji bo tevahiya serverê.
XXXX:XXX:XXXX:XXXX:1:2::/96 - IPv6 ji bo eno2, her tiştê din ji derve diçe eno1.
XXXX:XXX:XXXX:XXXX::1 — Deriyê IPv6 (hêjayî gotinê ye ku ev dikare/divê bi rengekî cûda were kirin. Guhestina IPv6 diyar bike).
dns-nameservers - 127.0.0.1 tê destnîşan kirin (ji ber ku bind li herêmî hatî saz kirin) û 213.248.1.6 (ev ji tech.ru ye).

"table eno1t" û "table eno2t" - wateya van rêgezan ev e ku seyrûsefera ku di eno1 -> re derbas dibe dê jê re derbikeve, û seyrûsefera ku ji eno2 -> tê bikeve dê jê re derkeve. Û her weha girêdanên ku ji hêla serverê ve hatî destpêkirin dê bi eno1 re derbas bibin.

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

Bi vê fermanê re em diyar dikin ku her seyrûsefera nefêmkirî ya ku dikeve binê qaîdeyek bi nîşana "table eno1t" -> ji navrûya eno1 re were şandin.

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

Bi vê fermanê re em diyar dikin ku her seyrûsefera ku ji hêla serverê ve hatî destpêkirin divê berbi pêwendiya eno1 ve were rêve kirin.

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

Bi vê fermanê em qaîdeyên nîşankirina trafîkê destnîşan dikin.

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

Ev blok ji bo pêwendiya eno4 IPv1-ya duyemîn diyar dike.

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

Bi vê fermanê re me rêça ji xerîdarên OpenVPN berbi IPv4-ya herêmî ve ji xeynî XX.XX.XX.X0 saz kir.
Ez hîn jî fam nakim çima ev ferman ji bo hemî IPv4 bes e.

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

Li vir e ku em navnîşana navrûyê bixwe destnîşan dikin. Dê server wê wekî navnîşek "derketin" bikar bîne. Dê careke din bi tu awayî neyê bikar anîn.

Çima ":1:1::" ewqas tevlihev e? Ji ber vê yekê OpenVPN rast û tenê ji bo vê yekê dixebite. Zêdetir li ser vê paşê.

Li ser mijara dergehê - ew çawa dixebite û ew baş e. Lê awayê rast ev e ku meriv li vir IPv6-ya guhêrbar ku server pê ve girêdayî ye destnîşan bike.

Lêbelê, ji ber hin sedeman ger ez wiya bikim IPv6 kar disekine. Dibe ku ev pirsgirêkek tech.ru ye.

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

Ev navnîşek IPv6 li navrûyê zêde dike. Ger ji we re sed navnîşan hewce bike, ev tê wateya sed rêzên vê pelê.

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

Min navnîşan û subnetên hemî navbeynkaran destnîşan kir da ku wê zelal bikim.
eno1 - divê "/64"- ji ber ku ev tevaya navnîşanên me ye.
tun0 - divê subnet ji eno1 mezintir be. Wekî din, ne gengaz e ku meriv dergehek IPv6 ji bo xerîdarên OpenVPN mîheng bike.
eno2 - divê subnet ji tun0 mezintir be. Wekî din, xerîdarên OpenVPN dê nikaribin bigihîjin navnîşanên IPv6 yên herêmî.
Ji bo zelaliyê, min pêngavek jêrtorê ya 16 hilbijart, lê heke hûn bixwazin, hûn dikarin gavê "1" jî bikin.
Li gorî vê yekê, 64 + 16 = 80, û 80 + 16 = 96.

Ji bo zelalbûna hê mezintir:
XXXX:XXX:XXXX:XXXX:1:1:YYYY:YYYY navnîşan in ku divê ji bo malper an karûbarên taybetî yên li ser navbeynkariya eno1 werin veqetandin.
XXXX:XXX:XXXX:XXXX:1:2:YYYY:YYYY navnîşan in ku divê ji bo malper an karûbarên taybetî yên li ser navbeynkariya eno2 werin veqetandin.
XXXX:XXX:XXXX:XXXX:1:3:YYYY:YYYY navnîşan in ku divê ji xerîdarên OpenVPN re werin veqetandin an wekî navnîşanên karûbarê OpenVPN werin bikar anîn.

Ji bo mîhengkirina torê, divê gengaz be ku server ji nû ve dest pê bike.
Guhertinên IPv4 dema ku têne darve kirin têne hildan (bê guman wê li ser ekranê bipêçin - wekî din ev ferman dê bi tenê torê li ser serverê têk bibe):

/etc/init.d/networking restart

Li dawiya pelê "/etc/iproute2/rt_tables" zêde bikin:

100 eno1t
101 eno2t

Bêyî vê, hûn nekarin tabloyên xwerû di pelê "/etc/network/interfaces" de bikar bînin.
Divê hejmar yekta bin û ji 65535 kêmtir bin.

Guhertinên IPv6 bêyî ji nû ve destpêkirinê bi hêsanî têne guheztin, lê ji bo vê yekê hûn hewce ne ku bi kêmî ve sê fermanan fêr bibin:

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

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

Ev mîhengên servera min "sysctl" ne. Bila ez tiştek girîng destnîşan bikim.

net.ipv4.ip_forward = 1

Bêyî vê, OpenVPN ê qet nexebite.

net.ipv6.ip_nonlocal_bind = 1

Her kesê ku hewl dide ku IPv6 (mînak nginx) tavilê piştî ku pêvek hildiweşe, dê xeletiyek bistîne. Ku ev navnîşana peyda nabe.

Ji bo ku rewşek wiha nemîne, mîhengek wiha tê çêkirin.

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

Bêyî van mîhengên IPv6, seyrûsefera ji xerîdar OpenVPN dernakeve cîhanê.

Mîhengên din an ne têkildar in an jî nayê bîra min ji bo çi ne.
Lê di her rewşê de, ez wê "wek ku ye" dihêlim.

Ji bo ku guheztinên vê pelê bêyî nûvekirina serverê werin hildan, hûn hewce ne ku fermanê bişopînin:

sysctl -p

Zêdetir hûrgulî di derbarê qaîdeyên "maseyê" de: habr.com/post/108690

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

OpenVPN IPv4 bêyî iptables naxebite.

Iptablesên min ji bo VPN wiha ne:

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 navnîşana min a IPv4 statîk a makîneya herêmî ye.
10.8.0.0/24 - IPv4 tora openvpn. Navnîşanên IPv4 ji bo xerîdarên openvpn.
Lihevhatina rêbazan girîng e.

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

Ev sînorek e ku tenê ez dikarim OpenVPN ji IP-ya xweya statîk bikar bînim.

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

Ji bo şandina pakêtên IPv4 di navbera xerîdarên OpenVPN û Înternetê de, hûn hewce ne ku yek ji van fermanan tomar bikin.

Ji bo rewşên cûda, yek ji vebijarkan ne guncaw e.
Her du ferman ji bo doza min minasib in.
Piştî xwendina belgeyê, min vebijarka yekem hilbijart ji ber ku ew kêmtir CPU bikar tîne.

Ji bo ku hemî mîhengên iptables piştî rebootkirinê werin hilanîn, hûn hewce ne ku wan li cîhek hilînin.

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

Navên wiha bi tesadufî nehatine hilbijartin. Ew ji hêla pakêta "iptables-persistent" ve têne bikar anîn.

apt-get install iptables-persistent

Sazkirina pakêta OpenVPN ya sereke:

apt-get install openvpn easy-rsa

Ka em ji bo sertîfîkayan şablonek saz bikin (nirxên xwe biguhezînin):

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

Ka em mîhengên şablonê sertîfîkayê biguherînin:

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

Sertîfîkaya serverê biafirîne:

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

Ka em şiyana afirandina pelên dawîn "client-name.opvn" amade bikin:

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

Ka em skrîptek amade bikin ku dê hemî pelan di pelek opvn-ê de bike yek.

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

Afirandina yekem xerîdar OpenVPN:

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

Pelê "~/client-configs/files/client-name.ovpn" ji cîhaza xerîdar re tê şandin.

Ji bo xerîdarên iOS-ê hûn ê hewce bikin ku xêzika jêrîn bikin:
Naveroka tagê "tls-auth" divê bê şîrove be.
Û her weha "key-direction 1" yekser berî nîşana "tls-auth" deyne.

Ka em mîhengê servera OpenVPN-ê mîheng bikin:

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

Ev pêdivî ye ku ji bo her xerîdar navnîşek statîk were danîn (ne hewce ye, lê ez wê bikar tînim):

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

Detayên herî dijwar û sereke.

Mixabin, OpenVPN hîn nizane ka meriv çawa serbixwe ji bo xerîdaran dergehek IPv6 mîheng bike.
Pêdivî ye ku hûn "bi destan" vê yekê ji bo her xerîdar bi pêş bixin.

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

Pelê "/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

Pelê "/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

Her du nivîsar pelê "/etc/openvpn/variables" bikar tînin:

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

Ez zehmet dibînim ku bê bîra min çima wiha hatiye nivîsandin.

Naha netmask = 112 xerîb xuya dike (divê li wir 96 be).
Û pêşgir xerîb e, ew bi tora tun0 re nagire.
Lê baş e, ez ê wekî xwe bihêlim.

cipher DES-EDE3-CBC

Ev ne ji bo her kesî ye - min ev rêbaza şîfrekirina pêwendiyê hilbijart.

Di derbarê sazkirina OpenVPN IPv4 de bêtir fêr bibin.

Di derbarê sazkirina OpenVPN IPv6 de bêtir fêr bibin.

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

Sazkirina pakêta sereke:

apt-get install postfix

Dema sazkirinê, "malpera înternetê" hilbijêrin.

"/etc/postfix/main.cf"ya min wiha xuya dike:

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

Ka em li hûrguliyên vê mîhengê binêrin.

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

Li gorî niştecihên Khabrovsk, ev blok "dezînformasyon û tezên nerast" dihewîne.Tenê 8 sal piştî destpêka kariyera min min dest pê kir ku fêm bikim ka SSL çawa dixebite.

Ji ber vê yekê, ez ê azadiya şirovekirinê bigirim ka meriv çawa SSL bikar tîne (bêyî bersiva pirsên "Ew çawa dixebite?" û "Çima dixebite?").

Bingeha şîfrekirina nûjen afirandina cotek mifteyê ye (du rêzikên pir dirêj ên karakteran).

Yek "kilît" taybet e, mifteya din "gelemperî" ye. Em mifteya taybet pir bi baldarî veşartî digirin. Em mifteya giştî li her kesî belav dikin.

Bi karanîna mifteyek gelemperî, hûn dikarin rêzek nivîsê şîfre bikin da ku tenê xwediyê mifteya taybet bikaribe wê deşîfre bike.
Welê, ew tevahî bingeha teknolojiyê ye.

Gav #1 - Malperên https.
Dema ku digihîje malperek, gerok ji servera malperê fêr dibe ku malper https ye û ji ber vê yekê mifteyek gelemperî daxwaz dike.
Pêşkêşkara malperê mifteya giştî dide. Gerok mifteya giştî bikar tîne da ku http-daxwaza şîfre bike û bişîne.
Naveroka http-daxwazek tenê dikare ji hêla kesên ku mifteya taybet heye, ango, tenê servera ku daxwaz jê re tê kirin, were xwendin.
Http-daxwaza herî kêm URI heye. Ji ber vê yekê, heke welatek hewl dide ku ne bi tevahî malperê, lê ji rûpelek taybetî re gihîştina sînordar bike, wê hingê ev ne gengaz e ku meriv ji bo malperên https bike.

Gav #2 - bersiva şîfrekirî.
Pêşkêşkara malperê bersivek ku li ser rê bi hêsanî tê xwendin peyda dike.
Çareserî zehf hêsan e - gerok bi herêmî ji bo her malpera https heman cotê mifteya taybet-gelemperî diafirîne.
Û digel daxwaza mifteya giştî ya malperê, ew mifteya giştî ya herêmî dişîne.
Pêşkêşkara malperê wê bi bîr tîne û, dema ku http-bersiv dişîne, wê bi mifteya giştî ya xerîdarek taybetî şîfre dike.
Naha http-bersiv tenê ji hêla xwediyê mifteya taybet a geroka xerîdar ve (ango, xerîdar bixwe) dikare were deşîfrekirin.

Gav No. 3 - avakirina pêwendiyek ewledar bi riya kanalek gelemperî.
Di mînaka No. 2 de xisariyek heye - tiştek nahêle ku xêrxwazan serî li http-daxwazekê bidin û agahdariya li ser mifteya giştî biguherînin.
Bi vî rengî, navbeynkar dê bi zelalî hemî naveroka peyamên şandin û wergirtinê bibîne heya ku kanala ragihandinê biguheze.
Têkiliya bi vê yekê zehf hêsan e - tenê mifteya giştî ya gerokê wekî peyamek ku bi mifteya giştî ya servera malperê hatî şîfrekirin bişînin.
Dûv re servera malperê pêşî bersivek wekî "mifteya weya giştî wiha ye" dişîne û vê peyamê bi heman mifteya giştî şîfre dike.
Gerok li bersivê mêze dike - heke peyama "mifteya weya giştî wiha ye" were wergirtin - wê hingê ev 100% garantî ye ku ev kanala ragihandinê ewle ye.
Çiqas ewle ye?
Afirandina kanalek pêwendiyek wusa ewledar bi leza ping * 2 pêk tê. Mînak 20 ms.
Divê êrîşkar pêşî mifteya taybet a yek ji partiyan hebe. An jî di nav çend milliseconan de mifteyek taybet bibînin.
Hackkirina yek mifteya taybet a nûjen dê bi dehsalan li ser superkomputerek bigire.

Gav #4 - databasa giştî ya mifteyên giştî.
Eşkere ye, di tevahiya vê çîrokê de derfetek heye ku êrîşkar li ser kanala ragihandinê ya di navbera xerîdar û serverê de rûne.
Xerîdar dikare xwe wekî server nîşan bide, û server dikare xwe wekî xerîdar bike. Û di her du aliyan de cotek bişkokan bişopînin.
Dûv re êrîşkar dê hemî trafîkê bibîne û dê bikaribe trafîkê "biguherîne".
Mînakî, navnîşana ku meriv li ku derê drav bişîne biguhezîne an şîfreya ji bankinga serhêl kopî bike an naveroka "dijber" asteng bike.
Ji bo şerkirina êrîşkerên weha, wan ji bo her malpera https databasek giştî ya bi mifteyên gelemperî peyda kirin.
Her gerokek bi hebûna 200 databasên weha "dizane". Ev di her gerokê de pêş-sazkirî tê.
"Zanîn" ji her sertîfîkayê ji hêla mifteyek gelemperî ve tê piştgirî kirin. Ango, girêdana bi her dezgehek pejirandî ya taybetî re nikare were sextekirin.

Naha têgihiştinek hêsan heye ka meriv çawa SSL-ê ji bo https bikar tîne.
Ger hûn mêjiyê xwe bikar bînin, dê zelal bibe ka karûbarên taybetî çawa dikarin di vê avahiyê de tiştek hack bikin. Lê ew ê berdêla wan hewildanên cinawir be.
Û rêxistinên ji NSA an CIA piçûktir - hema hema ne gengaz e ku asta parastinê ya heyî, tewra ji bo VIP-an jî hak bike.

Ez ê di derbarê girêdanên ssh de jî lê zêde bikim. Li wir mifteyên gelemperî tune, ji ber vê yekê hûn dikarin çi bikin? Pirsgirêk bi du awayan çareser dibe.
Vebijêrk ssh-by-password:
Di dema pêwendiya yekem de, pêdivî ye ku muwekîlê ssh hişyar bike ku me mifteyek giştî ya nû ji servera ssh heye.
Û di dema girêdanên din de, heke hişyariya "mifteya giştî ya nû ji servera ssh" xuya bibe, ew ê tê vê wateyê ku ew hewl didin ku we bibihîzin.
An jî we li ser pêwendiya weya yekem hate guhdarî kirin, lê naha hûn bêyî navbeynkar bi serverê re diaxivin.
Bi rastî, ji ber ku rastiya têlefonê bi hêsanî, zû û bêhêz eşkere dibe, ev êrîş tenê di rewşên taybetî de ji bo xerîdarek taybetî tête bikar anîn.

Vebijêrk ssh-bi-key:
Em ajokerek flash-ê digirin, mifteya taybet a servera ssh li ser wê dinivîsin (ji bo vê yekê şert û gelek nuwazeyên girîng hene, lê ez bernameyek perwerdehiyê dinivîsim, ne talîmatên ji bo karanînê).
Em mifteya giştî li ser makîneya ku dê muwekîlê ssh lê be dihêlin û em wê jî veşartî dihêlin.
Em ajokera flashê tînin ser serverê, têxin nav xwe, mifteya taybet kopî bikin, û ajokera flashê dişewitînin û axê li bayê belav dikin (an bi kêmanî wê bi sifiran format bikin).
Ew her tişt e - piştî operasyonek wusa, ew ê ne gengaz be ku pêwendiyek wusa ssh hack bike. Bê guman, di nav 10 salan de dê gengaz be ku li ser superkomputerek seyrûseferê were dîtin - lê ew çîrokek cûda ye.

Ez ji bo offtopic lêborînê dixwazim.

Îcar niha ku teoriya tê zanîn. Ez ê ji we re qala herikîna afirandina sertîfîkayek SSL-ê bikim.

Bi karanîna "openssl genrsa" em ji bo mifteya gelemperî mifteyek taybet û "vala" diafirînin.
Em "valan" ji pargîdaniyek sêyemîn re dişînin, ku em ji bo sertîfîkaya herî hêsan bi qasî 9 $ didin.

Piştî çend demjimêran, em mifteya xweya "gelemperî" û komek çend kilîdên giştî ji vê pargîdaniya sêyemîn werdigirin.

Çima pêdivî ye ku pargîdaniyek sêyemîn ji bo qeydkirina mifteya min a gelemperî drav bide, pirsek cûda ye, em ê li vir nahesibînin.

Niha eşkere ye ku wateya nivîsê çi ye:

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

Peldanka "/etc/ssl" hemî pelên ji bo pirsgirêkên ssl dihewîne.
domain1.com - navê domain.
2018 sala afirandina sereke ye.
"kilît" - destnîşan dike ku pel mifteyek taybet e.

Û wateya vê pelê:

smtpd_tls_cert_file=/etc/ssl/domain1.com.2018.chained.crt
domain1.com - navê domain.
2018 sala afirandina sereke ye.
zincîrkirî - binavkirina ku zincîreyek mifteyên giştî hene (ya yekem mifteya meya giştî ye û yên mayî yên ku ji pargîdaniya ku mifteya giştî derxistiye hatine).
crt - destnîşan dike ku sertîfîkayek amade heye (mifteya giştî bi ravekirinên teknîkî).

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

Ev mîheng di vê rewşê de nayê bikaranîn, lê wekî nimûne tê nivîsandin.

Ji ber ku di vê parameterê de xeletiyek dê bibe sedema şandina spam ji servera we (bêyî daxwaza we).

Hingê ji her kesî re îspat bike ku hûn ne sûcdar in.

recipient_delimiter = +

Dibe ku pir kes nizanibin, lê ev karakterek standard e ji bo rêzkirina e-nameyê, û ew ji hêla piraniya serverên nameyên nûjen ve tê piştgirî kirin.

Mînakî, heke qutiya posteyê we hebe "[email parastî]"biceribînin ku bişînin"[email parastî]"- Binêre çi jê tê.

inet_protocols = ipv4

Ev dibe ku tevlihev be.

Lê ne tenê wisa ye. Her domaina nû ji hêla xwerû tenê IPv4 e, wê hingê ez IPv6 ji bo her yekê ji hev veqetînim.

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

Li vir em diyar dikin ku hemî e-nameyên hatinî diçin dovecot.
Û qaîdeyên ji bo domain, mailbox, navnav - li databasê binêrin.

/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

Naha postfix dizane ku e-name ji bo şandina bêtir tenê piştî destûrnameyê bi dovecot re dikare were pejirandin.

Ez bi rastî bi rastî fêm nakim çima ev li vir dubare ye. Me berê her tiştê ku di "virtual_transport" de hewce dike diyar kiriye.

Lê pergala postfix pir kevn e - dibe ku ew paşvekêşek ji rojên berê ye.

smtpd_recipient_restrictions =
        ...

smtpd_helo_restrictions =
        ...

smtpd_client_restrictions =
        ...

Ev dikare ji bo her serverek e-nameyê bi rengek cûda were mîheng kirin.

Li ber destê min 3 serverên nameyê hene û ev mîheng ji ber hewcedariyên karanîna cûda pir cûda ne.

Pêdivî ye ku hûn wê bi baldarî mîheng bikin - wekî din dê spam biherike nav we, an jî xirabtir - dê spam ji we birijîne.

# SPF
policyd-spf_time_limit = 3600

Sazkirina hin pêveka ku bi kontrolkirina SPF-ya tîpên hatî ve girêdayî ye.

# 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

Mîheng ev e ku divê em bi hemî e-nameyên derketinê re îmzeyek DKIM peyda bikin.

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

Dema ku nameyan ji nivîsarên PHP-ê dişînin ev hûrguliyek bingehîn e di rêvekirina nameyan de.

Pelê "/etc/postfix/sdd_transport.pcre":

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

Li milê çepê îfadeyên rêkûpêk hene. Li aliyê rastê etîketek heye ku herfê nîşan dide.
Postfix li gorî labelê - dê çend rêzikên mîhengê yên din ji bo nameyek taybetî bigire ber çavan.

Çawa tam postfix dê ji bo nameyek taybetî ji nû ve were mîheng kirin dê di "master.cf" de were destnîşan kirin.

Rêzên 4, 5, 6 yên sereke ne. Li ser navê kîjan domainê em nameyê dişînin, em vê labelê danîne.
Lê qada "ji" di koda kevn de her gav di nivîsarên PHP-ê de nayê destnîşan kirin. Dûv re navê bikarhêner ji bo rizgariyê tê.

Gotar jixwe berfireh e - ez naxwazim ku bi sazkirina nginx + fpm ve mijûl bibim.

Bi kurtasî, ji bo her malperek me xwediyê bikarhênerê Linux-ê xwe destnîşan kir. Û li gorî vê yekê fpm-poolê we.

Fpm-pool her guhertoyek php-ê bikar tîne (Genga ku li ser heman serverê hûn dikarin guhertoyên cihêreng ên php-ê û tewra php.ini-ya cihêreng jî ji bo malperên cîran bêyî pirsgirêk bikar bînin) xweş e.

Ji ber vê yekê, bikarhênerek taybetî ya linux "www-domain2" xwediyê malperek domain2.com e. Di vê malperê de kodek heye ji bo şandina e-nameyê bêyî ku qada ji diyar bike.

Ji ber vê yekê, tewra di vê rewşê de, name dê rast werin şandin û dê çu carî nekevin nav spam.

"/etc/postfix/master.cf"ya min wiha xuya dike:

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

Pelê bi tevahî nayê peyda kirin - ew jixwe pir mezin e.
Min tenê destnîşan kir ku çi hatî guhertin.

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}

Ev mîhengên bi spamassasin ve girêdayî ne, li ser wê paşê.

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

Em dihêlin hûn bi porta 587 ve bi servera nameyê ve girêdayî bibin.
Ji bo vê yekê, divê hûn têkevinê.

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

Kontrola SPF çalak bike.

apt-get install postfix-policyd-spf-python

Ka em pakêtê ji bo kontrolên SPF li jor saz bikin.

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

Û ev tişta herî balkêş e. Ev şiyana şandina nameyan ji bo domainek taybetî ji navnîşek IPv4 / IPv6 taybetî ye.

Ev ji bo xatirê rDNS tê kirin. rDNS pêvajoya wergirtina rêzek bi navnîşana IP-yê ye.
Û ji bo nameyê, ev taybetmendî tê bikar anîn da ku piştrast bike ku helo tam bi rDNS-a navnîşana ku e-name jê hatî şandin re têkildar e.

Ger helo bi domaina e-nameyê ku li ser navê kê hatî şandin hev nagire, xalên spam têne xelat kirin.

Helo bi rDNS re nayê hev - gelek xalên spam têne xelat kirin.
Li gorî vê yekê, divê her domain navnîşana IP-ya xwe hebe.
Ji bo OVH - di konsolê de gengaz e ku rDNS diyar bike.
Ji bo tech.ru - pirsgirêk bi piştgirî tê çareser kirin.
Ji bo AWS, pirsgirêk bi piştgirî tê çareser kirin.
"inet_protocols" û "smtp_bind_address6" - em piştgiriya IPv6 çalak dikin.
Ji bo IPv6 jî hûn hewce ne ku rDNS qeyd bikin.
"syslog_name" - û ev ji bo hêsankirina xwendina têketin e.

Sertîfîkayan bikirin Ez li vir pêşniyar dikim.

Li vir girêdana postfix+dovecot saz bikin.

Sazkirina SPF.

============== Kevok ==============

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

Sazkirina mysql, sazkirina pakêtan bi xwe.

Pelê "/etc/dovecot/conf.d/10-auth.conf"

disable_plaintext_auth = yes
auth_mechanisms = plain login

Destûr tenê bi şîfre ye.

Pelê "/etc/dovecot/conf.d/10-mail.conf"

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

Li vir em cîhê hilanînê ji bo tîpan destnîşan dikin.

Ez dixwazim ku ew di pelan de werin hilanîn û li gorî domainê werin kom kirin.

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

Ev pelê veavakirina dovecot-a sereke ye.
Li vir em girêdanên neewle neçalak dikin.
Û girêdanên ewledar çalak bikin.

Pelê "/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
}

Sazkirina ssl. Em destnîşan dikin ku ssl hewce ye.
Û sertîfîka bi xwe. Û hûrguliyek girîng dîrektîfa "herêmî" ye. Nîşan dide ku kîjan sertîfîkaya SSL-ê dema ku bi kîjan IPv4-a herêmî ve tê girêdan bikar bîne.

Bi awayê, IPv6 li vir nehatiye mîheng kirin, ez ê paşê vê kêmasiyê rast bikim.
XX.XX.XX.X5 (domain2) - sertîfîka tune. Ji bo girêdana xerîdaran divê hûn domain1.com diyar bikin.
XX.XX.XX.X2 (domain3) - sertîfîkayek heye, hûn dikarin domain1.com an domain3.com diyar bikin ku xerîdaran girêdin.

Pelê "/etc/dovecot/conf.d/15-lda.conf"

protocol lda {
  mail_plugins = $mail_plugins sieve
}

Ev ê di pêşerojê de ji bo spamassassin hewce bike.

Pelê "/etc/dovecot/conf.d/20-imap.conf"

protocol imap {
  mail_plugins = $mail_plugins antispam
}

Ev pêvekek antispam e. Ji bo perwerdekirina spamassasin di dema veguhastina / ji peldanka "Spam" de hewce ye.

Pelê "/etc/dovecot/conf.d/20-pop3.conf"

protocol pop3 {
}

Tenê dosyayek wisa heye.

Pelê "/etc/dovecot/conf.d/20-lmtp.conf"

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

Sazkirina lmtp.

Pelê "/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
}

Mîhengên perwerdehiya Spamassasin di dema veguheztina ber / ji peldanka Spam de.

Pelê "/etc/dovecot/conf.d/90-sieve.conf"

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

Dosyayek ku diyar dike ku bi tîpên hatinî çi bikin.

Pelê "/var/lib/dovecot/sieve/default.sieve"

require ["fileinto", "mailbox"];

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

Pêdivî ye ku hûn pelê berhev bikin: "sievec default.sieve".

Pelê "/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
}

Ji bo destûrnameyê pelên sql diyar dikin.
Û pel bi xwe wekî rêbazek destûrnameyê tê bikar anîn.

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

Ev ji bo postfix mîhengên wekhev re têkildar e.

Pelê "/etc/dovecot/dovecot.conf"

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

Pelê veavakirina sereke.
Ya girîng ev e ku em li vir destnîşan dikin - protokolan zêde bikin.

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

apt-get install spamassassin spamc

Ka em pakêtan saz bikin.

adduser spamd --disabled-login

Werin em bikarhênerek li ser navê wî zêde bikin.

systemctl enable spamassassin.service

Em piştî barkirinê karûbarê spamassassin-a barkirina otomatîk çalak dikin.

Pelê "/etc/default/spamassassin":

CRON=1

Bi çalakkirina nûvekirina otomatîkî ya qaîdeyan "bi xwerû".

Pelê "/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

Hûn hewce ne ku di mysql-ê de bi bikarhênerê "sa" re bi şîfreya "şîfreya" databasek "sa" biafirînin (li şûna tiştek têr).

report_safe - ev ê li şûna nameyekê raporek e-nameya spam bişîne.
use_bayes mîhengên fêrbûna makîneyê spamassassin in.

Mîhengên spamassassin ên mayî berê di gotarê de hatin bikar anîn.

Mîhenga giştî "spamassassin".
Di derbarê veguheztina e-nameyên Spam-a nû li peldanka IMAP "Spam"..
Der barê tevliheviyek hêsan a Dovecot + SpamAssassin.
Ez xwendina teoriya fêrbûna spamassasin pêşniyar dikim dema ku tîpan di peldankên imap de diherikînin (û ez karanîna wê pêşniyar nakim).

============= Bangawazî ji civakê re ==============

Di heman demê de ez dixwazim ramanek bavêjim nav civakê ka meriv çawa asta ewlehiya nameyên şandin zêde dike. Ji ber ku ez pir kûr di mijara nameyê de me.

Da ku bikarhêner bikaribe cotek bişkokan li ser muwekîlê xwe biafirîne (outlook, thunderbird, gerok-plugin, ...). Giştî û taybet. Giştî - bişînin DNS. Taybet - li ser xerîdar xilas bike. Pêşkêşkerên nameyê dê bikaribin mifteyek gelemperî bikar bînin da ku ji wergirek taybetî re bişînin.

Û ji bo parastina li dijî spam bi tîpên weha (erê, servera nameyê dê nikaribe naverokê bibîne) - hûn hewce ne ku 3 qaîdeyan destnîşan bikin:

  1. Îmzeya DKIM-a rastîn a mecbûrî, SPF-ya mecbûrî, rDNS ya mecbûrî.
  2. Tora neuralî li ser mijara perwerdehiya antîspam + databasa ji bo wê li ser milê xerîdar.
  3. Divê algorîtmaya şîfrekirinê wisa be ku divê aliyê şandî 100 qat zêdetir hêza CPU li ser şîfrekirinê ji aliyê wergirtinê xerc bike.

Digel nameyên gelemperî, nameyek pêşniyarek standard "ji bo destpêkirina pêwendiya ewledar" pêşve bibin. Yek ji bikarhêneran (qutiya posteyê) nameyekê bi pêvekê re ji qutiya posteyê din re dişîne. Name pêşnumayek nivîsê vedihewîne da ku kanalek pêwendiya ewledar ji bo danûstandinê û mifteya giştî ya xwediyê qutiya posteyê (bi mifteyek taybet li milê xerîdar) dest pê bike.

Tewra hûn dikarin ji bo her hevpeyivînê bi taybetî çend kilîtan çêbikin. Bikarhênerê wergir dikare vê pêşniyarê qebûl bike û mifteya xwe ya giştî bişîne (jî bi taybetî ji bo vê pêwendiyê hatî çêkirin). Dûv re, bikarhênerê yekem nameyek kontrola karûbarê dişîne (bi mifteya giştî ya bikarhênerê duyemîn hatî şîfre kirin) - piştî wergirtina wê bikarhênerê duyemîn dikare kanala ragihandinê ya çêkirî pêbawer bihesibîne. Dûv re, bikarhênerê duyemîn nameyek kontrolê dişîne - û dûv re bikarhênerê yekem dikare kanala avakirî jî ewledar bihesibîne.

Ji bo şerkirina bi destwerdana mifteyên li ser rê, protokol divê îmkana veguheztina bi kêmanî yek mifteya giştî bi karanîna ajokerek flash peyda bike.

Û ya herî girîng ev e ku ew hemî dixebite (pirs ev e "kî dê ji bo wê bide?"):
Sertîfîkayên posteyê ku ji 10 $ dest pê dikin ji bo 3 salan têkevin. Ku dê bihêle ku şander di dns-ê de destnîşan bike ku "mifteyên min ên gelemperî li wir in." Û ew ê fersendê bidin we ku hûn pêwendiyek ewledar dest pê bikin. Di heman demê de, pejirandina girêdanên weha belaş e.
gmail di dawiyê de ji bikarhênerên xwe pereyan dike. Ji bo her 10 salan 3 $ - mafê afirandina kanalên pêwendiya ewledar.

============= Encam ==============

Ji bo ceribandina tevahiya gotarê, ez ê mehekê serverek veqetandî kirê bikim û bi sertîfîkaya SSL re domainek bikirim.

Lê şert û mercên jiyanê pêş ket û ev mijar 2 mehan dirêj kir.
Û ji ber vê yekê, gava ku min dîsa wextê xwe azad bû, min biryar da ku gotarê wekî ku heye biweşînim, ne ku xetera ku weşan salek din dirêj bike.

Ger pir pirsên mîna "lê ev bi hûrgulî têra xwe nayê ravekirin" hebin, wê hingê dibe ku hêzek hebe ku meriv serverek diyarkirî bi domainek nû û sertîfîkayek SSL-ya nû bigire û wê bi hûrgulî rave bike û, pir. ya girîng, hemî hûrguliyên girîng ên winda nas bikin.

Di heman demê de ez dixwazim li ser ramanên di derbarê sertîfîkayên postayê de bertek bistînim. Heke hûn ji ramanê hez dikin, ez ê hewl bidim ku hêzê bibînim ku pêşnûmeyek ji bo rfc binivîsim.

Dema ku beşên mezin ên gotarekê kopî dikin, lînka vê gotarê peyda bikin.
Dema ku hûn wergerînin zimanek din, lînka vê gotarê bidin.
Ez ê bi xwe hewl bidim ku wê wergerînim Îngilîzî û referansên xaçê bihêlim.


Source: www.habr.com

Add a comment