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

Kini nga artikulo bahin sa kung giunsa ang pag-set up sa usa ka modernong mail server.
Postfix + Dovecot. SPF + DKIM + rDNS. Uban sa IPv6.
Uban sa TSL encryption. Uban ang suporta alang sa daghang mga dominyo - bahin sa usa ka tinuod nga sertipiko sa SSL.
Uban ang proteksyon sa antispam ug taas nga rating sa antispam gikan sa ubang mga mail server.
Nagsuporta sa daghang pisikal nga mga interface.
Uban sa OpenVPN, ang koneksyon diin pinaagi sa IPv4, ug diin naghatag IPv6.

Kung dili nimo gusto nga makat-on sa tanan niini nga mga teknolohiya, apan gusto nga mag-set up sa ingon nga server, nan kini nga artikulo alang kanimo.

Ang artikulo wala mosulay sa pagpatin-aw sa matag detalye. Ang katin-awan moadto sa kung unsa ang wala gi-configure ingon sukaranan o hinungdanon gikan sa punto sa pagtan-aw sa konsumedor.

Ang kadasig sa pag-set up sa usa ka mail server dugay na nako nga damgo. Mahimong tanga kini, apan IMHO, mas maayo kini kaysa magdamgo sa usa ka bag-ong awto gikan sa imong paborito nga brand.

Adunay duha ka motibasyon sa pag-set up sa IPv6. Ang usa ka espesyalista sa IT kinahanglan nga magkat-on kanunay sa mga bag-ong teknolohiya aron mabuhi. Gusto nakong himoon ang akong kasarangan nga kontribusyon sa pakigbatok sa censorship.

Ang kadasig sa pag-set up sa OpenVPN mao lang ang pagpaandar sa IPv6 sa lokal nga makina.
Ang kadasig sa pag-set up sa daghang pisikal nga mga interface mao nga sa akong server adunay usa ka interface nga "hinay apan walay kutub" ug lain nga "paspas apan adunay taripa".

Ang kadasig sa pag-set up sa mga setting sa Bind mao nga ang akong ISP naghatag usa ka dili lig-on nga DNS server, ug usahay mapakyas usab ang google. Gusto ko og stable nga DNS server para sa personal nga gamit.

Pagdasig sa pagsulat sa usa ka artikulo - Nagsulat ako usa ka draft 10 ka bulan ang milabay, ug gitan-aw ko na kini kaduha. Bisan kung ang tagsulat kanunay nga nanginahanglan niini, adunay taas nga posibilidad nga kinahanglan usab kini sa uban.

Walay unibersal nga solusyon alang sa usa ka mail server. Apan sulayan nako nga isulat ang usa ka butang sama sa "buhata kini ug unya, kung molihok ang tanan ingon kinahanglan, ilabay ang mga dugang nga butang."

Ang kompanya nga tech.ru adunay Colocation server. Posible nga itandi sa OVH, Hetzner, AWS. Aron masulbad kini nga problema, ang kooperasyon sa tech.ru mahimong labi ka epektibo.

Gi-install ang Debian 9 sa server.

Ang server adunay 2 ka interface `eno1` ug `eno2`. Ang una walay limitasyon, ug ang ikaduha paspas, matag usa.

Adunay 3 ka static nga IP address, XX.XX.XX.X0 ug XX.XX.XX.X1 ug XX.XX.XX.X2 sa `eno1` interface ug XX.XX.XX.X5 sa `eno2` interface .

Anaa XXXX:XXXX:XXXX:XXXX::/64 usa ka pundok sa mga IPv6 nga adres nga gi-assign sa `eno1` interface ug gikan niini XXXX: XXXX: XXXX:XXXX: 1:2::/96 gi-assign sa `eno2` sa akong hangyo.

Adunay 3 ka domain `domain1.com`, `domain2.com`, `domain3.com`. Adunay SSL certificate para sa `domain1.com` ug `domain3.com`.

Duna koy Google account nga gusto nakong isumpay sa akong mailbox[protektado sa email]` (pagdawat ug mail ug pagpadala sa mail direkta gikan sa gmail interface).
Kinahanglan adunay mailbox`[protektado sa email]`, kopya sa email nga gusto nakong makita sa akong gmail. Ug talagsa ra nga makapadala usa ka butang alang sa `[protektado sa email]` pinaagi sa web interface.

Kinahanglan adunay mailbox`[protektado sa email]`, nga gamiton ni Ivanov gikan sa iyang iPhone.

Ang gipadala nga mga email kinahanglang motuman sa tanang modernong mga kinahanglanon sa antispam.
Kinahanglan adunay labing taas nga lebel sa pag-encrypt nga gihatag sa mga pampublikong network.
Kinahanglan adunay suporta sa IPv6 alang sa pagpadala ug pagdawat sa mga sulat.
Kinahanglan adunay usa ka SpamAssassin nga dili gyud mapapas ang mga email. Ug kini mo-bounce o molaktaw o ipadala sa IMAP "Spam" folder.
Ang SpamAssassin auto-learning kinahanglan nga ma-configure: kung akong ibalhin ang usa ka sulat ngadto sa Spam folder, kini makakat-on gikan niini; kon ako mobalhin ug sulat gikan sa Spam folder, kini makakat-on gikan niini. Ang mga resulta sa pagbansay sa SpamAssassin kinahanglan nga makaimpluwensya kung ang sulat matapos sa folder sa Spam.
Ang mga script sa PHP kinahanglan nga makapadala ug mail alang sa bisan unsang domain sa gihatag nga server.
Kinahanglan adunay usa ka serbisyo sa openvpn, nga adunay katakus sa paggamit sa IPv6 sa usa ka kliyente nga wala’y IPv6.

Una kinahanglan nimo nga i-configure ang mga interface ug pag-ruta, lakip ang IPv6.
Dayon kinahanglan nimo nga i-configure ang OpenVPN, nga magkonektar pinaagi sa IPv4 ug maghatag sa kliyente og static-real IPv6 address. Kini nga kliyente adunay access sa tanang IPv6 nga mga serbisyo sa server ug access sa bisan unsang IPv6 resources sa Internet.
Unya kinahanglan nimo nga i-configure ang Postfix aron magpadala mga sulat + SPF + DKIM + rDNS ug uban pang parehas nga gagmay nga mga butang.
Unya kinahanglan nimo nga i-configure ang Dovecot ug i-configure ang Multidomain.
Unya kinahanglan nimo nga i-configure ang SpamAssassin ug i-configure ang pagbansay.
Sa katapusan, i-install ang Bind.

============= Multi-interface =============

Aron ma-configure ang mga interface, kinahanglan nimo kining isulat sa "/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

Kini nga mga setting mahimong magamit sa bisan unsang server sa tech.ru (nga adunay gamay nga koordinasyon uban ang suporta) ug kini molihok dayon ingon nga kini kinahanglan.

Kung adunay ka kasinatian sa pag-set up sa parehas nga mga butang alang sa Hetzner, OVH, lahi kini didto. Mas lisud.

eno1 mao ang ngalan sa network card #1 (hinay apan walay kinutuban).
eno2 mao ang ngalan sa network card #2 (paspas, apan adunay taripa).
Ang tun0 mao ang ngalan sa virtual network card gikan sa OpenVPN.
XX.XX.XX.X0 - IPv4 #1 sa eno1.
XX.XX.XX.X1 - IPv4 #2 sa eno1.
XX.XX.XX.X2 - IPv4 #3 sa eno1.
XX.XX.XX.X5 - IPv4 #1 sa eno2.
XX.XX.XX.1 - IPv4 ganghaan.
XXXX:XXXX:XXXX:XXXX::/64 - IPv6 para sa tibuok server.
XXXX: XXXX: XXXX: XXXX: 1: 2:: / 96 - IPv6 para sa eno2, ang tanan gikan sa gawas moadto sa eno1.
XXXX: XXXX: XXXX: XXXX:: 1 β€” IPv6 gateway (kini angay nga matikdan nga kini mahimo/kinahanglan nga lain nga buhaton. Ipiho ang IPv6 switch).
dns-nameservers - 127.0.0.1 gipakita (tungod kay ang bind gi-install sa lokal) ug 213.248.1.6 (kini gikan sa tech.ru).

"table eno1t" ug "table eno2t" - ang kahulogan niini nga mga ruta-rules mao nga ang trapiko nga mosulod pinaagi sa eno1 -> mogawas niini, ug ang trapiko nga mosulod pinaagi sa eno2 -> mogawas niini. Ug usab ang mga koneksyon nga gipasiugdahan sa server moagi sa eno1.

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

Uban niini nga sugo among gitino nga ang bisan unsang dili masabtan nga trapiko nga nahulog ubos sa bisan unsang lagda nga gimarkahan nga "table eno1t" -> ipadala sa eno1 interface.

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

Uban niini nga sugo among gitino nga ang bisan unsang trapiko nga gisugdan sa server kinahanglan nga idirekta sa eno1 interface.

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

Uban niini nga sugo atong gibutang ang mga lagda alang sa pagmarka sa trapiko.

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

Kini nga block nagtino sa ikaduhang IPv4 alang sa eno1 interface.

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

Uban niini nga sugo among gibutang ang ruta gikan sa OpenVPN nga mga kliyente ngadto sa lokal nga IPv4 gawas sa XX.XX.XX.X0.
Wala gihapon ko makasabut nganong kini nga sugo igo na alang sa tanan nga IPv4.

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

Dinhi among gibutang ang adres alang sa interface mismo. Ang server mogamit niini isip usa ka "outgoing" nga adres. Dili na gamiton sa bisan unsang paagi pag-usab.

Ngano nga ":1:1::" komplikado kaayo? Aron ang OpenVPN molihok sa husto ug alang lamang niini. Dugang pa bahin niini sa ulahi.

Sa hilisgutan sa gateway - kana kung giunsa kini molihok ug maayo kana. Apan ang husto nga paagi mao ang pagpaila dinhi sa IPv6 sa switch diin ang server konektado.

Bisan pa, sa pipila ka hinungdan ang IPv6 mohunong sa pagtrabaho kung buhaton nako kini. Tingali kini usa ka matang sa problema sa tech.ru.

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

Nagdugang kini og IPv6 address sa interface. Kung kinahanglan nimo ang usa ka gatos nga adres, nagpasabut kana usa ka gatos nga linya sa kini nga file.

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

Akong namatikdan ang mga adres ug mga subnet sa tanang interface aron maklaro kini.
eno1 - kinahanglan nga "/64" - tungod kay kini ang among tibuuk nga hugpong sa mga adres.
tun0 - ang subnet kinahanglang mas dako kay sa eno1. Kung dili, dili posible nga ma-configure ang usa ka gateway sa IPv6 alang sa mga kliyente sa OpenVPN.
eno2 - ang subnet kinahanglang mas dako kay sa tun0. Kung dili, ang mga kliyente sa OpenVPN dili maka-access sa mga lokal nga adres sa IPv6.
Alang sa katin-awan, gipili nako ang usa ka subnet nga lakang sa 16, apan kung gusto nimo, mahimo nimo ang "1" nga lakang.
Busa, 64+16 = 80, ug 80+16 = 96.

Para mas klaro pa:
Ang XXXX: XXXX: XXXX: XXXX: 1: 1: YYYY: YYYY mga adres nga kinahanglan i-assign sa piho nga mga site o serbisyo sa eno1 interface.
Ang XXXX: XXXX: XXXX: XXXX: 1: 2: YYYY: YYYY mga adres nga kinahanglan i-assign sa piho nga mga site o serbisyo sa eno2 interface.
Ang XXXX: XXXX: XXXX: XXXX: 1: 3: YYYY: YYYY mga adres nga kinahanglan i-assign sa mga kliyente sa OpenVPN o gamiton isip mga adres sa serbisyo sa OpenVPN.

Aron ma-configure ang network, kinahanglan nga posible nga i-restart ang server.
Ang mga pagbag-o sa IPv4 gikuha kung gipatuman (siguruha nga iputos kini sa screen - kung dili kini nga mando mag-crash lang sa network sa server):

/etc/init.d/networking restart

Idugang sa katapusan sa file "/etc/iproute2/rt_tables":

100 eno1t
101 eno2t

Kung wala kini, dili nimo magamit ang naandan nga mga lamesa sa "/etc/network/interfaces" file.
Ang mga numero kinahanglang talagsaon ug ubos sa 65535.

Ang mga pagbag-o sa IPv6 dali nga mabag-o nga wala’y pag-reboot, apan aron mahimo kini kinahanglan nimo nga makat-on labing menos tulo ka mga sugo:

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

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

Kini ang mga setting sa "sysctl" sa akong server. Tugoti ko nga itudlo ang usa ka importante nga butang.

net.ipv4.ip_forward = 1

Kung wala kini, ang OpenVPN dili gyud molihok.

net.ipv6.ip_nonlocal_bind = 1

Bisan kinsa nga mosulay sa pagbugkos sa IPv6 (pananglitan nginx) dayon pagkahuman sa interface makadawat usa ka sayup. Nga kini nga adres dili magamit.

Aron malikayan ang ingon nga kahimtang, gihimo ang ingon nga setting.

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

Kung wala kini nga mga setting sa IPv6, ang trapiko gikan sa kliyente sa OpenVPN dili mogawas sa kalibutan.

Ang ubang mga setting wala’y kalabotan o wala nako mahinumduman kung para sa unsa kini.
Apan sa kaso lang, gibiyaan nako kini nga "ingon na."

Aron ang mga pagbag-o sa kini nga file makuha nga wala i-reboot ang server, kinahanglan nimo nga ipadagan ang mando:

sysctl -p

Dugang nga mga detalye bahin sa "lamesa" nga mga lagda: habr.com/post/108690

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

Ang OpenVPN IPv4 dili molihok kung wala ang mga iptables.

Ang akong mga iptables sama niini alang sa 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 mao ang akong static IPv4 address sa lokal nga makina.
10.8.0.0/24 - IPv4 openvpn network. Mga adres sa IPv4 alang sa mga kliyente sa openvpn.
Importante ang pagkamakanunayon sa mga lagda.

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

Kini usa ka limitasyon aron ako ra ang makagamit sa OpenVPN gikan sa akong static IP.

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

Aron ipasa ang IPv4 nga mga pakete tali sa mga kliyente sa OpenVPN ug sa Internet, kinahanglan nimo nga irehistro ang usa niini nga mga sugo.

Alang sa lainlaing mga kaso, ang usa sa mga kapilian dili angay.
Ang duha ka mga sugo angay alang sa akong kaso.
Pagkahuman sa pagbasa sa dokumentasyon, gipili nako ang una nga kapilian tungod kay gamay ra ang gigamit nga CPU.

Aron makuha ang tanan nga mga setting sa iptables pagkahuman sa pag-reboot, kinahanglan nimo nga i-save kini bisan diin.

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

Ang ingon nga mga ngalan wala gipili nga sulagma. Gigamit kini sa package nga "iptables-persistent".

apt-get install iptables-persistent

Pag-instalar sa nag-unang OpenVPN nga pakete:

apt-get install openvpn easy-rsa

Mag-set up ta og template para sa mga sertipiko (ilisan ang imong mga mithi):

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

Atong usbon ang mga setting sa template sa sertipiko:

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

Paghimo usa ka sertipiko sa server:

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

Atong andamon ang abilidad sa paghimo sa katapusang "client-name.opvn" nga mga file:

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

# Client mode
client

# Interface tunnel type
dev tun

# TCP protocol
proto tcp-client

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

# Don't bind to local port/address
nobind

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

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

# Enable compression
comp-lzo

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

Mag-andam kita og script nga maghiusa sa tanang file ngadto sa usa ka opvn file.

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

Paghimo sa unang OpenVPN nga kliyente:

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

Ang file nga "~/client-configs/files/client-name.ovpn" gipadala sa device sa kliyente.

Alang sa mga kliyente sa iOS kinahanglan nimo nga buhaton ang mosunod nga limbong:
Ang sulod sa "tls-auth" nga tag kinahanglang walay komento.
Ug ibutang usab ang "key-direction 1" sa wala pa ang "tls-auth" tag.

Atong i-configure ang OpenVPN server config:

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

Gikinahanglan kini aron mabutang ang usa ka static nga adres alang sa matag kliyente (dili kinahanglan, apan gigamit nako kini):

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

Ang labing lisud ug yawe nga detalye.

Ikasubo, ang OpenVPN wala pa mahibal-an kung giunsa ang independente nga pag-configure sa usa ka gateway sa IPv6 alang sa mga kliyente.
Kinahanglan nimo nga "manual" nga ipadala kini alang sa matag kliyente.

# Run client-specific script on connection and disconnection
script-security 2
client-connect "/usr/bin/sudo -u root /etc/openvpn/server-clientconnect.sh"
client-disconnect "/usr/bin/sudo -u root /etc/openvpn/server-clientdisconnect.sh"

File "/etc/openvpn/server-clientconnect.sh":

#!/bin/sh

# Check client variables
if [ -z "$ifconfig_pool_remote_ip" ] || [ -z "$common_name" ]; then
        echo "Missing environment variable."
        exit 1
fi

# Load server variables
. /etc/openvpn/variables

ipv6=""

# Find out if there is a specific config with fixed IPv6 for this client
if [ -f "/etc/openvpn/ccd/$common_name" ]; then
        # Get fixed IPv6 from client config file
        ipv6=$(sed -nr 's/^.*ifconfig-ipv6-push[ t]+([0-9a-fA-F:]+).*$/1/p' "/etc/openvpn/ccd/$common_name")
        echo $ipv6
fi

# Get IPv6 from IPv4
if [ -z "$ipv6" ]; then
        ipp=$(echo "$ifconfig_pool_remote_ip" | cut -d. -f4)
        if ! [ "$ipp" -ge 2 -a "$ipp" -le 254 ] 2>/dev/null; then
                echo "Invalid IPv4 part."
                exit 1
        fi
        hexipp=$(printf '%x' $ipp)
        ipv6="$prefix$hexipp"
fi

# Create proxy rule
/sbin/ip -6 neigh add proxy $ipv6 dev eno1

File "/etc/openvpn/server-clientdisconnect.sh":

#!/bin/sh

# Check client variables
if [ -z "$ifconfig_pool_remote_ip" ] || [ -z "$common_name" ]; then
        echo "Missing environment variable."
        exit 1
fi

# Load server variables
. /etc/openvpn/variables

ipv6=""

# Find out if there is a specific config with fixed IPv6 for this client
if [ -f "/etc/openvpn/ccd/$common_name" ]; then
        # Get fixed IPv6 from client config file
        ipv6=$(sed -nr 's/^.*ifconfig-ipv6-push[ t]+([0-9a-fA-F:]+).*$/1/p' "/etc/openvpn/ccd/$common_name")
fi

# Get IPv6 from IPv4
if [ -z "$ipv6" ]; then
        ipp=$(echo "$ifconfig_pool_remote_ip" | cut -d. -f4)
        if ! [ "$ipp" -ge 2 -a "$ipp" -le 254 ] 2>/dev/null; then
                echo "Invalid IPv4 part."
                exit 1
        fi
        hexipp=$(printf '%x' $ipp)
        ipv6="$prefix$hexipp"
fi

# Delete proxy rule
/sbin/ip -6 neigh del proxy $ipv6 dev eno1

Ang duha ka script naggamit sa file nga "/etc/openvpn/variables":

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

Nalisdan ko sa paghinumdom ngano nga kini gisulat nga ingon niini.

Karon ang netmask = 112 tan-awon nga katingad-an (kini kinahanglan nga 96 didto mismo).
Ug ang prefix katingad-an, dili kini katumbas sa tun0 network.
Pero sige, biyaan na nako.

cipher DES-EDE3-CBC

Dili kini para sa tanan - Gipili nako kini nga pamaagi sa pag-encrypt sa koneksyon.

Pagkat-on og dugang mahitungod sa pag-set up sa OpenVPN IPv4.

Pagkat-on og dugang mahitungod sa pag-set up sa OpenVPN IPv6.

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

Pag-instalar sa panguna nga pakete:

apt-get install postfix

Sa pag-instalar, pilia ang "internet site".

Ang akong "/etc/postfix/main.cf" ingon niini:

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

Atong tan-awon ang mga detalye niini nga config.

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

Sumala sa mga residente sa Khabrovsk, kini nga bloke adunay "sayup nga impormasyon ug dili husto nga mga tesis."8 ka tuig lang pagkahuman sa pagsugod sa akong karera nagsugod ko sa pagsabut kung giunsa ang pagtrabaho sa SSL.

Busa, akong kuhaon ang kagawasan sa paghubit kon unsaon paggamit ang SSL (nga walay pagtubag sa mga pangutana nga "Giunsa kini pagtrabaho?" Ug "Nganong kini nagtrabaho?").

Ang sukaranan sa modernong encryption mao ang paghimo sa usa ka yawe nga pares (duha ka taas nga mga kuldas sa mga karakter).

Ang usa ka "key" pribado, ang laing yawe "publiko". Among gitago pag-ayo ang pribadong yawe. Giapod-apod namon ang yawe sa publiko sa tanan.

Gamit ang usa ka publiko nga yawe, mahimo nimong i-encrypt ang usa ka hugpong sa teksto aron ang tag-iya lamang sa pribadong yawe ang maka-decrypt niini.
Aw, kana ang tibuuk nga sukaranan sa teknolohiya.

Lakang #1 - https nga mga site.
Kung nag-access sa usa ka site, nahibal-an sa browser gikan sa web server nga ang site https ug busa nangayo usa ka yawe sa publiko.
Ang web server naghatag sa publiko nga yawe. Gigamit sa browser ang public key aron ma-encrypt ang http-request ug ipadala kini.
Ang sulod sa usa ka http-hangyo mabasa lamang niadtong adunay pribadong yawe, nga mao, ang server lamang diin ang hangyo gihimo.
Ang hangyo sa Http adunay labing menos usa ka URI. Busa, kung ang usa ka nasud naningkamot sa pagpugong sa pag-access dili sa tibuok nga site, apan sa usa ka piho nga panid, nan kini imposible nga buhaton alang sa https nga mga site.

Lakang #2 - naka-encrypt nga tubag.
Naghatag ang web server og tubag nga dali mabasa sa dalan.
Ang solusyon yano ra kaayo - ang browser sa lokal nga naghimo sa parehas nga pribado-publiko nga pares sa yawe alang sa matag https site.
Ug uban sa hangyo alang sa publiko nga yawe sa site, kini nagpadala sa iyang lokal nga publiko nga yawe.
Ang web server nahinumdom niini ug, sa dihang nagpadala sa http-tubag, gi-encrypt kini gamit ang publikong yawe sa usa ka partikular nga kliyente.
Karon ang http-response mahimo ra ma-decrypted sa tag-iya sa browser sa kliyente nga pribadong yawe (nga mao, ang kliyente mismo).

Lakang No. 3 - pagtukod og usa ka luwas nga koneksyon pinaagi sa usa ka publiko nga channel.
Adunay usa ka kahuyang sa panig-ingnan Num. 2 - walay makapugong sa mga buotan sa pag-intercept sa usa ka http-hangyo ug pag-edit sa impormasyon mahitungod sa publiko nga yawe.
Sa ingon, tin-aw nga makita sa tigpataliwala ang tanan nga sulud sa gipadala ug nadawat nga mga mensahe hangtod mabag-o ang channel sa komunikasyon.
Ang pag-atubang niini yano ra kaayo - ipadala lang ang publiko nga yawe sa browser ingon usa ka mensahe nga gi-encrypt gamit ang publiko nga yawe sa web server.
Ang web server dayon nagpadala una og tubag sama sa "ang imong publiko nga yawe sama niini" ug gi-encrypt kini nga mensahe gamit ang parehas nga yawe sa publiko.
Ang browser nagtan-aw sa tubag - kung ang mensahe nga "ang imong publiko nga yawe sama niini" nadawat - nan kini usa ka 100% nga garantiya nga kini nga channel sa komunikasyon luwas.
Unsa kini ka luwas?
Ang paghimo sa ingon nga luwas nga channel sa komunikasyon mahitabo sa katulin sa ping*2. Pananglitan 20ms.
Ang tig-atake kinahanglan adunay pribado nga yawe sa usa sa mga partido nga abante. O pangitaa ang usa ka pribado nga yawe sa pipila ka mga millisecond.
Ang pag-hack sa usa ka modernong pribadong yawe mokabat ug mga dekada sa usa ka supercomputer.

Lakang #4 - publiko nga database sa publiko nga mga yawe.
Dayag nga, niining tibuok nga istorya adunay usa ka oportunidad alang sa usa ka tig-atake nga molingkod sa channel sa komunikasyon tali sa kliyente ug sa server.
Ang kliyente mahimong magpakaaron-ingnon nga server, ug ang server mahimong magpakaaron-ingnon nga kliyente. Ug sunda ang usa ka parisan sa mga yawe sa duha ka direksyon.
Dayon ang tig-atake makakita sa tanan nga trapiko ug makahimo sa "pag-edit" sa trapiko.
Pananglitan, usba ang adres kung asa ipadala ang kuwarta o kopyaha ang password gikan sa online banking o i-block ang sulud nga "masupak".
Aron mapugngan ang ingon nga mga tig-atake, naghimo sila usa ka publiko nga database nga adunay mga yawe sa publiko alang sa matag https site.
Ang matag browser "nahibal-an" bahin sa paglungtad sa mga 200 nga ingon nga mga database. Nag-una kini nga na-install sa matag browser.
Ang "Kahibalo" gisuportahan sa usa ka publiko nga yawe gikan sa matag sertipiko. Sa ato pa, ang koneksyon sa matag piho nga awtoridad sa sertipikasyon dili mahimong peke.

Karon adunay usa ka yano nga pagsabut kung giunsa ang paggamit sa SSL alang sa https.
Kung gamiton nimo ang imong utok, mahimong klaro kung giunsa ang mga espesyal nga serbisyo maka-hack sa usa ka butang sa kini nga istruktura. Apan kini mogasto kanila sa makalilisang nga mga paningkamot.
Ug ang mga organisasyon nga mas gamay kaysa sa NSA o CIA - hapit imposible nga ma-hack ang kasamtangan nga lebel sa proteksyon, bisan alang sa mga VIP.

Magdugang usab ako bahin sa mga koneksyon sa ssh. Walay mga yawe sa publiko didto, busa unsa ang imong mahimo? Ang isyu masulbad sa duha ka paagi.
Opsyon nga ssh-by-password:
Atol sa unang koneksyon, ang ssh nga kliyente kinahanglan nga magpasidaan nga kita adunay usa ka bag-o nga publiko nga yawe gikan sa ssh server.
Ug sa panahon sa dugang nga mga koneksyon, kung ang pasidaan nga "bag-ong publiko nga yawe gikan sa ssh server" makita, kini nagpasabut nga sila naningkamot sa pag-eavesdrop kanimo.
O na-eavesdrop ka sa imong una nga koneksyon, apan karon nakigsulti ka sa server nga wala’y mga tigpataliwala.
Sa tinuud, tungod sa kamatuoran nga ang kamatuoran sa wiretapping dali, dali ug walay kakugi nga gipadayag, kini nga pag-atake gigamit lamang sa mga espesyal nga kaso alang sa usa ka piho nga kliyente.

Opsyon nga ssh-by-key:
Nagkuha kami usa ka flash drive, isulat ang pribado nga yawe alang sa ssh server niini (adunay mga termino ug daghang hinungdanon nga mga nuances alang niini, apan nagsulat ako usa ka programa sa edukasyon, dili mga panudlo alang sa paggamit).
Among ibilin ang publikong yawe sa makina kon asa ang ssh nga kliyente ug gitago usab namo kini.
Gidala namo ang flash drive ngadto sa server, gisulod kini, gikopya ang pribadong yawe, ug gisunog ang flash drive ug gisabwag ang mga abo ngadto sa hangin (o labing menos i-format kini sa mga zero).
Kana ra - pagkahuman sa ingon nga operasyon imposible nga ma-hack ang ingon nga koneksyon sa ssh. Siyempre, sa 10 ka tuig posible nga makita ang trapiko sa usa ka supercomputer - apan lahi kana nga istorya.

Nangayo kog pasaylo sa offtopic.

Busa karon nga ang teorya nahibal-an. Sultihan ko ikaw bahin sa dagan sa paghimo og SSL certificate.

Gamit ang "openssl genrsa" maghimo mi ug private key ug "blangko" para sa public key.
Gipadala namo ang "mga blangko" ngadto sa usa ka kompanya sa ikatulo nga partido, diin kami nagbayad og gibana-bana nga $9 alang sa pinakasimple nga sertipiko.

Human sa pipila ka oras, madawat namo ang among "publiko" nga yawe ug usa ka set sa pipila ka publikong yawe gikan niining third-party nga kompanya.

Ngano nga ang usa ka ikatulo nga partido nga kompanya magbayad alang sa pagrehistro sa akong publiko nga yawe usa ka lahi nga pangutana, dili namon kini tagdon dinhi.

Karon klaro na kung unsa ang kahulogan sa inskripsiyon:

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

Ang folder nga "/ etc / ssl" naglangkob sa tanan nga mga file alang sa mga isyu sa ssl.
domain1.com β€” ngalan sa domain.
Ang 2018 mao ang tuig sa yawe nga paglalang.
"key" - pagtawag nga ang file usa ka pribado nga yawe.

Ug ang kahulogan niini nga file:

smtpd_tls_cert_file=/etc/ssl/domain1.com.2018.chained.crt
domain1.com β€” ngalan sa domain.
Ang 2018 mao ang tuig sa yawe nga paglalang.
chained - designasyon nga adunay kadena sa mga public key (ang una mao ang atong public key ug ang uban kay gikan sa kompanya nga nag-isyu sa public key).
crt - pagtudlo nga adunay usa ka andam nga gihimo nga sertipiko (publiko nga yawe nga adunay mga teknikal nga pagpatin-aw).

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

Kini nga setting wala gigamit sa kini nga kaso, apan gisulat ingon usa ka pananglitan.

Tungod kay ang usa ka sayup sa kini nga parameter magdala sa spam nga ipadala gikan sa imong server (kung wala ang imong gusto).

Unya pamatud-i sa tanan nga wala kay sala.

recipient_delimiter = +

Daghang mga tawo ang dili mahibal-an, apan kini usa ka sukaranan nga karakter alang sa ranggo nga mga email, ug kini gisuportahan sa kadaghanan sa mga modernong mail server.

Pananglitan, kung ikaw adunay mailbox "[protektado sa email]"Sulayi ipadala sa"[protektado sa email]"- tan-awa kung unsa ang moabut niini.

inet_protocols = ipv4

Mahimong makalibog kini.

Pero dili lang ingon ana. Ang matag bag-ong domain kay sa default IPv4 lang, unya gi-on nako ang IPv6 para sa matag usa nga gilain.

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

Dinhi among gitino nga ang tanan nga umaabot nga mail moadto sa dovecot.
Ug ang mga lagda alang sa domain, mailbox, alias - tan-awa sa database.

/etc/postfix/mysql-virtual-mailbox-domains.cf

user = usermail
password = mailpassword
hosts = 127.0.0.1
dbname = servermail
query = SELECT 1 FROM virtual_domains WHERE name='%s'

/etc/postfix/mysql-virtual-mailbox-maps.cf

user = usermail
password = mailpassword
hosts = 127.0.0.1
dbname = servermail
query = SELECT 1 FROM virtual_users WHERE email='%s'

/etc/postfix/mysql-virtual-alias-maps.cf

user = usermail
password = mailpassword
hosts = 127.0.0.1
dbname = servermail
query = SELECT destination FROM virtual_aliases WHERE source='%s'

# SMTP-Auth settings
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes

Karon nahibal-an na sa postfix nga posible nga modawat ug mail alang sa dugang nga pagpadala pagkahuman sa pagtugot sa dovecot.

Wala gyud ko makasabut ngano nga kini gi-duplicate dinhi. Gitakda na namo ang tanan nga gikinahanglan sa "virtual_transport".

Apan ang sistema sa postfix karaan na kaayo - tingali kini usa ka pagbalik gikan sa karaan nga mga adlaw.

smtpd_recipient_restrictions =
        ...

smtpd_helo_restrictions =
        ...

smtpd_client_restrictions =
        ...

Mahimo kini nga ma-configure nga lahi alang sa matag mail server.

Naa koy 3 ka mail server nga akong magamit ug kini nga mga setting lahi kaayo tungod sa lainlaing mga kinahanglanon sa paggamit.

Kinahanglan nimo nga i-configure kini pag-ayo - kung dili ang spam modagayday kanimo, o mas grabe pa - ang spam modagayday gikan kanimo.

# SPF
policyd-spf_time_limit = 3600

Pag-set up alang sa pipila ka plugin nga may kalabutan sa pagsusi sa SPF sa umaabot nga mga sulat.

# 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

Ang setting mao nga kinahanglan nga maghatag kami usa ka pirma sa DKIM sa tanan nga mga outgoing email.

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

Kini usa ka hinungdanon nga detalye sa pag-ruta sa sulat kung magpadala mga sulat gikan sa mga script sa PHP.

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

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

Sa wala mao ang mga regular nga ekspresyon. Sa tuo adunay label nga nagtimaan sa letra.
Ang postfix uyon sa label - mag-isip sa pipila pa nga linya sa pag-configure alang sa usa ka piho nga sulat.

Kung giunsa pag-usab ang postfix alang sa usa ka piho nga sulat ipakita sa "master.cf".

Ang mga linya 4, 5, 6 mao ang nag-una. Sa ngalan kung asa nga domain among gipadala ang sulat, among gibutang kini nga label.
Apan ang "gikan sa" field dili kanunay gipakita sa PHP script sa daan nga code. Unya ang username moabut sa pagluwas.

Ang artikulo kay lapad na - dili ko gusto nga mabalda pinaagi sa pag-set up sa nginx+fpm.

Sa mubo, alang sa matag site nagbutang kami sa kaugalingon nga tag-iya sa linux-user. Ug sumala sa imong fpm-pool.

Ang Fpm-pool naggamit sa bisan unsang bersyon sa php (kini maayo kung sa parehas nga server mahimo nimong magamit ang lainlaing mga bersyon sa php ug bisan ang lainlaing php.ini alang sa mga silingan nga site nga wala’y problema).

Busa, ang usa ka piho nga linux-user nga "www-domain2" adunay usa ka website domain2.com. Kini nga site adunay code alang sa pagpadala sa mga email nga wala ipiho ang gikan sa uma.

Busa, bisan sa niini nga kaso, ang mga sulat ipadala sa husto ug dili gayud matapos sa spam.

Ang akong "/etc/postfix/master.cf" ingon niini:

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

Ang file wala gihatag sa bug-os - kini dako na kaayo.
Namatikdan ra nako kung unsa ang nabag-o.

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}

Kini ang mga setting nga may kalabotan sa spamassasin, labi pa sa ulahi.

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

Gitugotan ka namo nga makonektar sa mail server pinaagi sa port 587.
Aron mahimo kini, kinahanglan ka mag log in.

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

I-enable ang pagsusi sa SPF.

apt-get install postfix-policyd-spf-python

Atong i-install ang package para sa mga pagsusi sa SPF sa ibabaw.

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

Ug kini mao ang labing makapaikag nga butang. Kini mao ang abilidad sa pagpadala sa mga sulat alang sa usa ka piho nga domain gikan sa usa ka piho nga IPv4/IPv6 address.

Gihimo kini alang sa rDNS. Ang rDNS mao ang proseso sa pagdawat og string pinaagi sa IP address.
Ug alang sa mail, kini nga bahin gigamit sa pagkumpirma nga ang helo tukma nga katumbas sa rDNS sa adres diin gipadala ang email.

Kung ang helo dili motakdo sa domain sa email alang kang kinsa gipadala ang sulat, ang mga puntos sa spam mahatag.

Ang Helo dili tugma sa rDNS - daghang mga puntos sa spam ang gihatag.
Busa, ang matag domain kinahanglan adunay kaugalingon nga IP address.
Alang sa OVH - sa console posible nga ipiho ang rDNS.
Alang sa tech.ru - ang isyu nasulbad pinaagi sa suporta.
Alang sa AWS, ang isyu nasulbad pinaagi sa suporta.
"inet_protocols" ug "smtp_bind_address6" - gipalihok namo ang suporta sa IPv6.
Alang sa IPv6 kinahanglan nimo nga magparehistro sa rDNS.
"syslog_name" - ug kini alang sa kasayon ​​​​sa pagbasa sa mga log.

Pagpalit og mga sertipiko Rekomend ko dinhi.

Pag-set up sa link sa postfix+dovecot dinhi.

Pagbutang sa SPF.

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

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

Pag-set up sa mysql, pag-instalar sa mga pakete mismo.

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

disable_plaintext_auth = yes
auth_mechanisms = plain login

Ang pagtugot gi-encrypt lamang.

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

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

Dinhi among gipakita ang lokasyon sa pagtipig alang sa mga letra.

Gusto nako nga kini tipigan sa mga file ug igrupo sa domain.

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

service imap-login {
  inet_listener imap {
    port = 0
  }
  inet_listener imaps {
    address = XX.XX.XX.X1, XX.XX.XX.X2, XX.XX.XX.X5, [XXXX:XXXX:XXXX:XXXX:1:1:1:1], [XXXX:XXXX:XXXX:XXXX:1:2:1:1], [XXXX:XXXX:XXXX:XXXX:1:1:5:1]
    port = 993
    ssl = yes
  }
}
service pop3-login {
  inet_listener pop3 {
    port = 0
  }
  inet_listener pop3s {
    address = XX.XX.XX.X1, XX.XX.XX.X2, XX.XX.XX.X5, [XXXX:XXXX:XXXX:XXXX:1:1:1:1], [XXXX:XXXX:XXXX:XXXX:1:2:1:1], [XXXX:XXXX:XXXX:XXXX:1:1:5:1]
    port = 995
    ssl = yes
  }
}
service lmtp {
  unix_listener /var/spool/postfix/private/dovecot-lmtp {
    mode = 0600
    user = postfix
    group = postfix
  }
}
service imap {
}
service pop3 {
}
service auth {
  unix_listener auth-userdb {
    mode = 0600
    user = vmail
  }

  unix_listener /var/spool/postfix/private/auth {
    mode = 0666
    user = postfix
    group = postfix
  }
  user = dovecot
}
service auth-worker {
  user = vmail
}
service dict {
  unix_listener dict {
  }
}

Kini ang nag-unang dovecot configuration file.
Dinhi among gi-disable ang dili sigurado nga mga koneksyon.
Ug mahimo ang luwas nga mga koneksyon.

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

ssl = required
ssl_cert = </etc/nginx/ssl/domain1.com.2018.chained.crt
ssl_key = </etc/nginx/ssl/domain1.com.2018.key
local XX.XX.XX.X5 {
  ssl_cert = </etc/nginx/ssl/domain2.com.2018.chained.crt
  ssl_key =  </etc/nginx/ssl/domain2.com.2018.key
}

Pag-set up sa ssl. Gipakita namon nga gikinahanglan ang ssl.
Ug ang sertipiko mismo. Ug usa ka importante nga detalye mao ang "lokal" nga direktiba. Nagpakita kung unsang SSL certificate ang gamiton kung magkonektar kung asa nga lokal nga IPv4.

Pinaagi sa dalan, ang IPv6 wala ma-configure dinhi, akong tul-iron kini nga pagkawala sa ulahi.
XX.XX.XX.X5 (domain2) - walay sertipiko. Aron makonektar ang mga kliyente kinahanglan nimong ipiho ang domain1.com.
XX.XX.XX.X2 (domain3) - adunay sertipiko, mahimo nimong ipiho ang domain1.com o domain3.com aron makonektar ang mga kliyente.

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

protocol lda {
  mail_plugins = $mail_plugins sieve
}

Kinahanglan kini alang sa spamassassin sa umaabot.

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

protocol imap {
  mail_plugins = $mail_plugins antispam
}

Kini usa ka plugin nga antispam. Gikinahanglan alang sa pagbansay sa spamassasin sa panahon sa pagbalhin ngadto/gikan sa β€œSpam” folder.

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

protocol pop3 {
}

Adunay usa ra ka file.

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

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

Pag-set up sa lmtp.

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

plugin {
  antispam_backend = pipe
  antispam_trash = Trash;trash
  antispam_spam = Junk;Spam;SPAM
  antispam_pipe_program_spam_arg = --spam
  antispam_pipe_program_notspam_arg = --ham
  antispam_pipe_program = /usr/bin/sa-learn
  antispam_pipe_program_args = --username=%Lu
}

Mga setting sa pagbansay sa Spamassasin sa panahon sa pagbalhin ngadto/gikan sa Spam folder.

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

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

Usa ka file nga nagtino kung unsa ang buhaton sa umaabot nga mga sulat.

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

require ["fileinto", "mailbox"];

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

Kinahanglan nimong i-compile ang file: "sievec default.sieve".

File "/etc/dovecot/conf.d/auth-sql.conf.ext"

passdb {
  driver = sql
  args = /etc/dovecot/dovecot-sql.conf.ext
}
userdb {
  driver = static
  args = uid=vmail gid=vmail home=/var/mail/vhosts/%d/%n
}

Pagtino sa mga sql file alang sa pagtugot.
Ug ang file mismo gigamit ingon usa ka paagi sa pagtugot.

File "/etc/dovecot/dovecot-sql.conf.ext"

driver = mysql
connect = host=127.0.0.1 dbname=servermail user=usermail password=password
default_pass_scheme = SHA512-CRYPT
password_query = SELECT email as user, password FROM virtual_users WHERE email='%u';

Kini katumbas sa parehas nga mga setting alang sa postfix.

File "/etc/dovecot/dovecot.conf"

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

Panguna nga configuration file.
Ang hinungdanon nga butang mao nga among gipakita dinhi - pagdugang mga protocol.

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

apt-get install spamassassin spamc

Atong i-install ang mga pakete.

adduser spamd --disabled-login

Magdugang ta ug user para kang kinsa.

systemctl enable spamassassin.service

Gitugotan namon ang awtomatikong pagkarga sa serbisyo sa spamassassin sa pagkarga.

File "/etc/default/spamassassin":

CRON=1

Pinaagi sa pagpagana sa awtomatik nga pag-update sa mga lagda "sa default".

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

Kinahanglan ka nga maghimo usa ka database nga "sa" sa mysql nga adunay gumagamit nga "sa" nga adunay password nga "password" (ilis ang usa ka butang nga igo).

report_safe - magpadala kini ug report sa spam email imbes nga sulat.
use_bayes mao ang mga setting sa pagkat-on sa makina nga spamassassin.

Ang nahabilin nga mga setting sa spammassassin gigamit sa sayo pa sa artikulo.

Kinatibuk-ang setting nga "spamassassin".
Mahitungod sa pagbalhin sa mga bag-ong Spam email sa IMAP "Spam" folder.
Mahitungod sa usa ka yano nga kombinasyon sa Dovecot + SpamAssassin.
Girekomenda nako ang pagbasa sa teorya sa pagkat-on sa spamassasin kung magbalhin mga letra sa mga folder sa imap (ug dili nako girekomenda nga gamiton kini).

============= Apela sa komunidad =============

Gusto usab nako nga ihulog ang usa ka ideya sa komunidad kung giunsa ang pagdugang sa lebel sa seguridad sa gipasa nga mga sulat. Tungod kay ako nalingaw kaayo sa hilisgutan sa mail.

Aron ang tiggamit makahimo og usa ka parisan sa mga yawe sa iyang kliyente (panan-aw, thunderbird, browser-plugin, ...). Pampubliko ug pribado. Publiko - ipadala sa DNS. Pribado - pagluwas sa kliyente. Ang mga mail server mahimo’g mogamit usa ka publiko nga yawe aron ipadala sa usa ka piho nga nakadawat.

Ug aron mapanalipdan batok sa spam nga adunay ingon nga mga sulat (oo, ang mail server dili makatan-aw sa sulud) - kinahanglan nimo nga ipaila ang 3 nga mga lagda:

  1. Mandatoryong tinuod nga DKIM signature, mandatory SPF, mandatory rDNS.
  2. Usa ka neural network sa hilisgutan sa pagbansay sa antispam + usa ka database alang niini sa bahin sa kliyente.
  3. Ang encryption algorithm kinahanglan nga ingon nga ang nagpadala nga bahin kinahanglan nga mogasto sa 100 ka pilo nga CPU nga gahum sa encryption kaysa sa nakadawat nga bahin.

Dugang sa publiko nga mga sulat, paghimo og usa ka sumbanan nga sulat sa sugyot "aron magsugod sa luwas nga mga sulat." Usa sa mga tiggamit (mailbox) nagpadala usa ka sulat nga adunay kadugtong sa lain nga mailbox. Ang sulat naglangkob sa usa ka text proposal sa pagsugod sa usa ka luwas nga komunikasyon channel alang sa mga sulat ug ang publiko nga yawe sa tag-iya sa mailbox (nga adunay usa ka pribado nga yawe sa kliyente nga bahin).

Mahimo ka pa nga maghimo usa ka pares nga yawe nga piho alang sa matag sulat. Ang tigdawat nga tiggamit makadawat niini nga tanyag ug ipadala ang iyang publikong yawe (gihimo usab nga espesipiko alang niini nga sulat). Sunod, ang una nga tiggamit nagpadala usa ka sulat sa pagkontrol sa serbisyo (na-encrypt sa publiko nga yawe sa ikaduha nga tiggamit) - sa pagkadawat diin ang ikaduha nga tiggamit makonsiderar nga kasaligan ang naporma nga channel sa komunikasyon. Sunod, ang ikaduha nga tiggamit nagpadala usa ka sulat sa pagkontrol - ug dayon ang una nga tiggamit mahimo usab nga ikonsiderar nga luwas ang naporma nga channel.

Aron mapugngan ang interception sa mga yawe sa dalan, ang protocol kinahanglan maghatag alang sa posibilidad sa pagpasa sa labing menos usa ka publiko nga yawe gamit ang flash drive.

Ug ang labing hinungdanon nga butang mao nga kini tanan molihok (ang pangutana mao "kinsa ang mobayad niini?"):
Pagsulod sa mga sertipiko sa koreyo sugod sa $10 sulod sa 3 ka tuig. Nga magtugot sa nagpadala sa pagpakita sa dns nga "ang akong publiko nga mga yawe anaa didto." Ug hatagan ka nila og higayon nga magsugod usa ka luwas nga koneksyon. Sa samang higayon, ang pagdawat sa maong mga koneksyon libre.
Ang gmail sa katapusan nag-monetize sa mga tiggamit niini. Alang sa $10 kada 3 ka tuig - ang katungod sa paghimo og luwas nga mga agianan sa sulat.

============= Konklusyon ==============

Aron masulayan ang tibuuk nga artikulo, mag-abang ako usa ka dedikado nga server sa usa ka bulan ug mopalit usa ka domain nga adunay sertipiko sa SSL.

Apan ang mga kahimtang sa kinabuhi naugmad mao nga kini nga isyu nagdugay sulod sa 2 ka bulan.
Ug mao nga, sa diha nga ako adunay libre nga oras pag-usab, nakahukom ako nga imantala ang artikulo sa ingon, imbes nga peligro nga ang publikasyon magdugay sa usa pa ka tuig.

Kung adunay daghang mga pangutana sama sa "apan wala kini gihulagway sa igo nga detalye", nan tingali adunay kusog sa pagkuha sa usa ka dedikado nga server nga adunay usa ka bag-ong domain ug usa ka bag-ong sertipiko sa SSL ug ihulagway kini sa labi ka detalyado ug, kadaghanan. importante, ilha ang tanang nawala nga importanteng mga detalye.

Gusto usab kong makakuha og feedback sa mga ideya bahin sa mga sertipiko sa koreyo. Kung gusto nimo ang ideya, sulayan nako nga makit-an ang kusog sa pagsulat og draft para sa rfc.

Kung nagkopya sa dagkong mga bahin sa usa ka artikulo, paghatag ug link niini nga artikulo.
Kung naghubad sa bisan unsang ubang sinultian, paghatag usa ka link sa kini nga artikulo.
Ako mismo mosulay sa paghubad niini ngadto sa English ug magbilin ug mga cross-reference.


Source: www.habr.com

Idugang sa usa ka comment