Debian + Postfix + Dovecot + Multidomain + SSL + IPv6 + OpenVPN + Олон интерфэйс + SpamAssassin-сургалт + Бинд

Энэ нийтлэл нь орчин үеийн мэйл серверийг хэрхэн тохируулах тухай юм.
Postfix + Dovecot. SPF + DKIM + rDNS. IPv6-тай.
TSL шифрлэлттэй. Олон домэйны дэмжлэгтэйгээр - жинхэнэ SSL сертификаттай хэсэг.
Спамаас хамгаалах хамгаалалт болон бусад имэйл серверүүдээс өндөр үнэлгээтэй.
Олон тооны физик интерфэйсийг дэмждэг.
OpenVPN-тэй бол холболт нь IPv4-ээр дамждаг бөгөөд IPv6-г хангадаг.

Хэрэв та эдгээр бүх технологийг сурахыг хүсэхгүй байгаа ч ийм сервер суулгахыг хүсч байвал энэ нийтлэл танд зориулагдсан болно.

Нийтлэлд бүх нарийн ширийн зүйлийг тайлбарлахыг оролдоогүй болно. Тайлбар нь стандартаар тохируулагдаагүй эсвэл хэрэглэгчийн үүднээс чухал ач холбогдолтой зүйлд хамаарна.

Мэйл сервер байгуулах сэдэл бол миний удаан хугацааны мөрөөдөл байсан. Энэ нь тэнэг сонсогдож магадгүй, гэхдээ IMHO, энэ нь таны дуртай брэндийн шинэ машин мөрөөдөж байснаас хамаагүй дээр юм.

IPv6-г тохируулах хоёр сэдэл бий. Мэдээллийн технологийн мэргэжилтэн оршин тогтнохын тулд шинэ технологид байнга суралцах шаардлагатай байдаг. Би цензурын эсрэг тэмцэлд өөрийн хувь нэмрээ оруулахыг хүсч байна.

OpenVPN-г тохируулах сэдэл нь зөвхөн IPv6-г дотоод машин дээр ажиллуулах явдал юм.
Хэд хэдэн физик интерфэйсийг тохируулах сэдэл нь миний сервер дээр нэг интерфейс "удаан боловч хязгааргүй", нөгөө нь "хурдан боловч тарифтай" интерфэйстэй болсон явдал юм.

Бинийн тохиргоог хийх сэдэл нь миний ISP тогтворгүй DNS серверээр хангадаг бөгөөд google мөн заримдаа бүтэлгүйтдэг. Би хувийн хэрэгцээнд зориулж тогтвортой DNS сервер хүсч байна.

Нийтлэл бичих сэдэл - Би 10 сарын өмнө ноорог бичсэн бөгөөд аль хэдийн хоёр удаа үзсэн. Зохиогчид байнга хэрэгтэй байсан ч бусдад хэрэгтэй байх магадлал өндөр байдаг.

Мэйл серверийн бүх нийтийн шийдэл байдаггүй. Гэхдээ би "үүнийг хий, дараа нь бүх зүйл хэвийн болмогц илүү зүйлээ хая" гэх мэт зүйлийг бичихийг хичээх болно.

tech.ru компани нь Colocation сервертэй. OVH, Hetzner, AWS-тэй харьцуулах боломжтой. Энэ асуудлыг шийдэхийн тулд tech.ru-тай хамтран ажиллах нь илүү үр дүнтэй байх болно.

Сервер дээр Debian 9 суулгасан.

Сервер нь `eno2` болон `eno1` гэсэн 2 интерфэйстэй. Эхнийх нь хязгааргүй, хоёр дахь нь хурдан байдаг.

`eno3` интерфэйс дээр XX.XX.XX.X0 ба XX.XX.XX.X1 болон XX.XX.XX.X2, `eno1` интерфейс дээр XX.XX.XX.X5 гэсэн 2 статик IP хаяг байдаг. .

Боломжтой XXXX:XXXX:XXXX:XXXX::/64 `eno6` интерфэйс болон түүнээс XXXX:XXXX:XXXX:XXXX:1:1::/2-д оноогдсон IPv96 хаягуудын санг миний хүсэлтээр `eno2`-д өгсөн.

`domain3.com`, `domain1.com`, `domain2.com` гэсэн 3 домэйн байдаг. `domain1.com` болон `domain3.com`-д зориулсан SSL сертификат байна.

Надад шуудангийн хайрцгаа холбохыг хүсч буй Google бүртгэл байна[имэйлээр хамгаалагдсан]` (gmail интерфэйсээс шуудан хүлээн авах, шуудан илгээх).
Шуудангийн хайрцаг` байх ёстой[имэйлээр хамгаалагдсан]`, миний gmail дээр харахыг хүссэн имэйлийн хуулбар. Мөн `-ийн өмнөөс ямар нэг зүйл илгээх нь ховор[имэйлээр хамгаалагдсан]` вэб интерфэйсээр дамжуулан.

Шуудангийн хайрцаг` байх ёстой[имэйлээр хамгаалагдсан]`, Иванов үүнийг iPhone-оосоо ашиглах болно.

Илгээсэн имэйлүүд нь спамаас хамгаалах орчин үеийн бүх шаардлагыг хангасан байх ёстой.
Нийтийн сүлжээнд хамгийн дээд түвшний шифрлэлт байх ёстой.
Захидал илгээх, хүлээн авах аль алинд нь IPv6 дэмжлэг байх ёстой.
Имэйлийг хэзээ ч устгахгүй SpamAssassin байх ёстой. Энэ нь үсрэх эсвэл алгасах эсвэл IMAP "Спам" хавтас руу илгээх болно.
SpamAssassin-ийн автомат сургалтыг тохируулах ёстой: хэрэв би захиаг Спам хавтас руу зөөвөл энэ нь үүнээс суралцах болно; Хэрэв би Спам хавтсаас захидал зөөвөл энэ нь үүнээс суралцах болно. SpamAssassin-ийн сургалтын үр дүн нь захидал Спам хавтсанд орох эсэхэд нөлөөлөх ёстой.
РНР скриптүүд нь тухайн сервер дээрх аль ч домэйны нэрийн өмнөөс шуудан илгээх чадвартай байх ёстой.
IPv6-гүй үйлчлүүлэгч дээр IPv6 ашиглах чадвартай openvpn үйлчилгээ байх ёстой.

Эхлээд та интерфэйс болон чиглүүлэлт, түүний дотор IPv6-г тохируулах хэрэгтэй.
Дараа нь та OpenVPN-ийг тохируулах шаардлагатай бөгөөд энэ нь IPv4-ээр холбогдож, үйлчлүүлэгчийг статик-бодит IPv6 хаягаар хангана. Энэ үйлчлүүлэгч нь сервер дээрх бүх IPv6 үйлчилгээнд хандах боломжтой бөгөөд Интернет дэх IPv6 эх сурвалжид хандах боломжтой болно.
Дараа нь та Postfix-г захидал илгээх + SPF + DKIM + rDNS болон бусад ижил төстэй жижиг зүйлсийг тохируулах хэрэгтэй болно.
Дараа нь та Dovecot болон Multidomain-ийг тохируулах хэрэгтэй болно.
Дараа нь та SpamAssassin-ийг тохируулж, сургалтыг тохируулах хэрэгтэй болно.
Эцэст нь Bind програмыг суулгана уу.

============= Олон интерфейс ============

Интерфейсүүдийг тохируулахын тулд та үүнийг "/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

Эдгээр тохиргоог tech.ru-ийн аль ч сервер дээр (дэмжлэгтэй бага зэрэг зохицуулалттай) ашиглаж болох бөгөөд тэр даруй ажиллах болно.

Хэрэв та Hetzner, OVH-д ижил төстэй зүйлийг тохируулж байсан туршлагатай бол тэнд өөр байх болно. Илүү төвөгтэй.

eno1 нь сүлжээний картын №1 нэр юм (удаан боловч хязгааргүй).
eno2 нь сүлжээний картын №2 нэр юм (хурдан, гэхдээ тарифтай).
tun0 нь OpenVPN-ийн виртуал сүлжээний картын нэр юм.
XX.XX.XX.X0 - eno4 дээрх IPv1 #1.
XX.XX.XX.X1 - eno4 дээрх IPv2 #1.
XX.XX.XX.X2 - eno4 дээрх IPv3 #1.
XX.XX.XX.X5 - eno4 дээрх IPv1 #2.
XX.XX.XX.1 - IPv4 гарц.
ХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХ ::/64 - Бүх серверт зориулсан IPv6.
XXXX:XXXX:XXXX:XXXX:1:2::/96 - eno6-д зориулсан IPv2, гаднаасаа бусад бүх зүйл eno1 руу ордог.
XXXX:XXXX:XXXX:XXXX::1 — IPv6 гарц (үүнийг өөрөөр хийх боломжтойг анхаарах нь зүйтэй. IPv6 шилжүүлэгчийг зааж өгнө үү).
dns-nameservers - 127.0.0.1-г зааж өгсөн (учир нь bind нь дотооддоо суулгасан) болон 213.248.1.6 (энэ нь tech.ru сайтаас).

“Хүснэгт eno1t” болон “хүснэгт eno2t” - эдгээр маршрутын дүрмийн утга нь eno1 ->-ээр орж байгаа хөдөлгөөн түүгээр гарч, eno2 ->-оор орж байгаа хөдөлгөөн түүгээр дамждаг. Мөн серверийн эхлүүлсэн холболтууд eno1-ээр дамждаг.

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

Энэ командын тусламжтайгаар бид "хүснэгт eno1t" -> тэмдэглэгдсэн дүрэмд хамаарах аливаа ойлгомжгүй урсгалыг eno1 интерфейс рүү илгээхийг зааж өгдөг.

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

Энэ командын тусламжтайгаар бид серверээс эхлүүлсэн аливаа урсгалыг eno1 интерфейс рүү чиглүүлэх ёстойг зааж өгсөн.

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

Энэ командын тусламжтайгаар бид замын хөдөлгөөний тэмдэглэгээ хийх дүрмийг тогтоодог.

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

Энэ блок нь eno4 интерфэйсийн хоёр дахь IPv1-ийг зааж өгдөг.

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

Энэ командын тусламжтайгаар бид OpenVPN үйлчлүүлэгчээс XX.XX.XX.X4-аас бусад локал IPv0 хүртэлх замыг тохируулсан.
Энэ тушаал яагаад бүх IPv4-д хангалттай байдгийг би ойлгохгүй байна.

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

Энд бид интерфейсийн хаягийг тохируулдаг. Сервер үүнийг "гадагш" хаяг болгон ашиглах болно. Дахиж ямар нэгэн байдлаар ашиглахгүй.

":1:1::" яагаад ийм төвөгтэй байдаг вэ? Ингэснээр OpenVPN зөв бөгөөд зөвхөн үүний төлөө ажилладаг. Энэ талаар дараа дэлгэрэнгүй.

Гарцын сэдвээр - энэ нь ийм байдлаар ажилладаг бөгөөд энэ нь зүгээр юм. Гэхдээ зөв арга бол сервер холбогдсон шилжүүлэгчийн IPv6-г энд зааж өгөх явдал юм.

Гэхдээ ямар нэг шалтгааны улмаас би үүнийг хийвэл IPv6 ажиллахаа болино. Энэ нь магадгүй tech.ru-ийн нэг төрлийн асуудал юм.

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

Энэ нь интерфэйс дээр IPv6 хаяг нэмж байна. Хэрэв танд зуун хаяг хэрэгтэй бол энэ файлд зуун мөр байна гэсэн үг.

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

Үүнийг ойлгомжтой болгохын тулд би бүх интерфейсийн хаяг, дэд сүлжээг тэмдэглэв.
eno1 - байх ёстой "/64"- учир нь энэ бол бидний бүх хаягийн сан юм.
tun0 - дэд сүлжээ нь eno1-ээс том байх ёстой. Үгүй бол OpenVPN үйлчлүүлэгчдэд IPv6 гарцыг тохируулах боломжгүй болно.
eno2 - дэд сүлжээ нь tun0-аас том байх ёстой. Үгүй бол OpenVPN үйлчлүүлэгчид дотоод IPv6 хаяг руу нэвтрэх боломжгүй болно.
Тодорхой болгохын тулд би дэд сүлжээний 16 алхамыг сонгосон, гэхдээ хэрэв хүсвэл "1" алхамыг хийж болно.
Үүний дагуу 64+16 = 80, 80+16 = 96.

Илүү тодорхой болгохын тулд:
XXXX:XXXX:XXXX:XXXX:1:1:YYYY:YYYY нь eno1 интерфэйс дээрх тодорхой сайт эсвэл үйлчилгээнд оноох ёстой хаягууд юм.
XXXX:XXXX:XXXX:XXXX:1:2:YYYY:YYYY нь eno2 интерфэйс дээрх тодорхой сайт эсвэл үйлчилгээнд оноох ёстой хаягууд юм.
XXXX:XXXX:XXXX:XXXX:1:3:YYYY:YYYY нь OpenVPN үйлчлүүлэгчдэд оноох эсвэл OpenVPN үйлчилгээний хаяг болгон ашиглах хаягууд юм.

Сүлжээг тохируулахын тулд серверийг дахин эхлүүлэх боломжтой байх ёстой.
IPv4-ийн өөрчлөлтийг гүйцэтгэсний дараа авна (үүнийг дэлгэцэн дээр боохоо мартуузай - эс тэгвээс энэ тушаал нь сервер дээрх сүлжээг сүйрүүлэх болно):

/etc/init.d/networking restart

"/etc/iproute2/rt_tables" файлын төгсгөлд нэмнэ үү:

100 eno1t
101 eno2t

Үүнгүйгээр та "/etc/network/interfaces" файл дахь тусгай хүснэгтүүдийг ашиглах боломжгүй.
Тоонууд нь өвөрмөц бөгөөд 65535-аас бага байх ёстой.

IPv6 өөрчлөлтийг дахин ачаалахгүйгээр амархан өөрчлөх боломжтой боловч үүнийг хийхийн тулд та дор хаяж гурван тушаалыг сурах хэрэгтэй:

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

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

Эдгээр нь миний серверийн "sysctl" тохиргоо юм. Би нэг чухал зүйлийг онцолж хэлье.

net.ipv4.ip_forward = 1

Үүнгүйгээр OpenVPN огт ажиллахгүй.

net.ipv6.ip_nonlocal_bind = 1

Интерфэйс дууссаны дараа шууд IPv6 (жишээ нь nginx) холбохыг оролдсон хэн бүхэн алдаа хүлээн авах болно. Энэ хаяг байхгүй байна.

Ийм нөхцөл байдлаас зайлсхийхийн тулд ийм тохиргоог хийдэг.

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

Эдгээр IPv6 тохиргоогүйгээр OpenVPN клиентээс ирсэн траффик дэлхий рүү гарахгүй.

Бусад тохиргоо нь хамааралгүй эсвэл юунд зориулагдсан болохыг би санахгүй байна.
Гэхдээ ямар ч тохиолдолд би үүнийг "байгаагаар нь" үлдээдэг.

Энэ файлын өөрчлөлтийг серверийг дахин ачаалахгүйгээр авахын тулд та дараах тушаалыг ажиллуулах хэрэгтэй.

sysctl -p

"Хүснэгт" дүрмийн талаар дэлгэрэнгүй мэдээлэл: habr.com/post/108690

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

OpenVPN IPv4 нь iptablesгүйгээр ажиллахгүй.

Миний iptables 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 бол миний дотоод машины статик IPv4 хаяг юм.
10.8.0.0/24 - IPv4 openvpn сүлжээ. Openvpn үйлчлүүлэгчдэд зориулсан IPv4 хаягууд.
Дүрмийн тууштай байдал нь чухал юм.

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

Энэ нь зөвхөн би өөрийн статик IP-ээс OpenVPN-г ашиглах боломжтой хязгаарлалт юм.

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

OpenVPN үйлчлүүлэгчид болон интернетийн хооронд IPv4 пакетуудыг дамжуулахын тулд та эдгээр командын аль нэгийг бүртгүүлэх шаардлагатай.

Өөр өөр тохиолдлуудад сонголтуудын аль нэг нь тохиромжгүй байдаг.
Хоёр тушаал хоёулаа миний тохиолдолд тохиромжтой.
Баримт бичгийг уншсаны дараа би хамгийн бага CPU ашигладаг тул эхний сонголтыг сонгосон.

Дахин ачаалсны дараа бүх iptables тохиргоог авахын тулд тэдгээрийг хаа нэгтээ хадгалах хэрэгтэй.

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

Ийм нэрийг санамсаргүй сонгоогүй. Тэдгээрийг "iptables-persistent" багц ашигладаг.

apt-get install iptables-persistent

Үндсэн OpenVPN багцыг суулгаж байна:

apt-get install openvpn easy-rsa

Сертификатуудын загварыг тохируулцгаая (утгаа орлуулна уу):

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

Гэрчилгээний загварын тохиргоог засъя:

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

Серверийн гэрчилгээ үүсгэх:

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

Эцсийн "client-name.opvn" файлуудыг үүсгэх чадварыг бэлдье:

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

# Client mode
client

# Interface tunnel type
dev tun

# TCP protocol
proto tcp-client

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

# Don't bind to local port/address
nobind

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

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

# Enable compression
comp-lzo

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

Бүх файлуудыг нэг opvn файлд нэгтгэх скриптийг бэлдье.

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

#!/bin/bash

# First argument: Client identifier

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

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

Эхний OpenVPN клиентийг үүсгэх:

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

“~/client-configs/files/client-name.ovpn” файлыг үйлчлүүлэгчийн төхөөрөмж рүү илгээсэн.

iOS үйлчлүүлэгчдийн хувьд та дараах заль мэхийг хийх хэрэгтэй болно.
"tls-auth" тагийн агуулга нь тайлбаргүй байх ёстой.
Мөн "tls-auth" тагийн өмнө "key-direction 1"-ийг тавь.

OpenVPN серверийн тохиргоог хийцгээе:

cd ~/openvpn-ca/keys
cp ca.crt ca.key server.crt server.key ta.key dh2048.pem /etc/openvpn
gunzip -c /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz | tee /etc/openvpn/server.conf
mcedit /etc/openvpn/server.conf

# Listen port
port 1194

# Protocol
proto tcp-server

# IP tunnel
dev tun0
tun-ipv6
push tun-ipv6

# Master certificate
ca ca.crt

# Server certificate
cert server.crt

# Server private key
key server.key

# Diffie-Hellman parameters
dh dh2048.pem

# Allow clients to communicate with each other
client-to-client

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

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

# Server mode and client subnets
server 10.8.0.0 255.255.255.0
server-ipv6 XXXX:XXXX:XXXX:XXXX:1:3::/80
topology subnet

# IPv6 routes
push "route-ipv6 XXXX:XXXX:XXXX:XXXX::/64"
push "route-ipv6 2000::/3"

# DNS (for Windows)
# These are OpenDNS
push "dhcp-option DNS 208.67.222.222"
push "dhcp-option DNS 208.67.220.220"

# Configure all clients to redirect their default network gateway through the VPN
push "redirect-gateway def1 bypass-dhcp"
push "redirect-gateway ipv6" #For iOS

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

# Ping every 10s. Timeout of 120s.
keepalive 10 120

# Enable compression
comp-lzo

# User and group
user vpn
group vpn

# Log a short status
status openvpn-status.log

# Logging verbosity
##verb 4

# Custom config
tls-auth ta.key 0
cipher DES-EDE3-CBC

Энэ нь үйлчлүүлэгч бүрт статик хаяг тогтооход шаардлагатай (шаардлагагүй, гэхдээ би үүнийг ашигладаг):

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

Хамгийн хэцүү, гол нарийн ширийн зүйл.

Харамсалтай нь OpenVPN нь үйлчлүүлэгчдэд зориулсан IPv6 гарцыг хэрхэн бие даан тохируулахаа хараахан мэдэхгүй байна.
Та үүнийг үйлчлүүлэгч бүрт "гараар" дамжуулах ёстой.

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

“/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

“/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

Хоёр скрипт хоёулаа “/etc/openvpn/variables” файлыг ашигладаг:

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

Энд яагаад ингэж бичсэнийг санахад хэцүү байна.

Одоо сүлжээний маск = 112 хачирхалтай харагдаж байна (энэ нь яг тэнд 96 байх ёстой).
Угтвар нь хачирхалтай, tun0 сүлжээнд тохирохгүй байна.
Гэхдээ зүгээр, би үүнийг байгаагаар нь үлдээх болно.

cipher DES-EDE3-CBC

Энэ нь хүн бүрт тохирохгүй - би холболтыг шифрлэх энэ аргыг сонгосон.

OpenVPN IPv4-ийг тохируулах талаар нэмэлт мэдээлэл авна уу.

OpenVPN IPv6-ийг тохируулах талаар нэмэлт мэдээлэл авна уу.

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

Үндсэн багцыг суулгаж байна:

apt-get install postfix

Суулгахдаа "интернет сайт" -ыг сонгоно уу.

Миний "/etc/postfix/main.cf" дараах байдалтай байна.

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

Энэ тохиргооны дэлгэрэнгүйг харцгаая.

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

Хабаровскийн оршин суугчдын үзэж байгаагаар энэ блок нь "буруу мэдээлэл, буруу тезис" агуулдаг.Би карьераа эхлүүлснээс хойш ердөө 8 жилийн дараа SSL хэрхэн ажилладагийг ойлгож эхэлсэн.

Тиймээс би SSL-г хэрхэн ашиглах талаар тайлбарлах болно ("Энэ яаж ажилладаг вэ?", "Яагаад ажилладаг вэ?" Гэсэн асуултанд хариулалгүйгээр).

Орчин үеийн шифрлэлтийн үндэс нь түлхүүр хос (маш урт тэмдэгтийн хоёр мөр) үүсгэх явдал юм.

Нэг "түлхүүр" нь хувийн, нөгөө түлхүүр нь "нийтийн" юм. Бид хувийн түлхүүрээ маш болгоомжтой нууцалдаг. Бид нийтийн түлхүүрийг хүн бүрт тараадаг.

Нийтийн түлхүүрийг ашигласнаар та текстийн мөрийг шифрлэх боломжтой бөгөөд ингэснээр зөвхөн хувийн түлхүүрийн эзэмшигч үүнийг тайлж чадна.
Энэ бол технологийн бүх үндэс юм.

Алхам №1 - https сайтууд.
Сайт руу нэвтрэх үед хөтөч вэб серверээс тухайн сайт нь https гэдгийг мэддэг тул нийтийн түлхүүрийг хүсдэг.
Вэб сервер нь нийтийн түлхүүрийг өгдөг. Хөтөч нь http-хүсэлтийг шифрлэж илгээхийн тулд нийтийн түлхүүрийг ашигладаг.
http-хүсэлтийн агуулгыг зөвхөн хувийн түлхүүртэй хүмүүс, өөрөөр хэлбэл хүсэлт гаргасан сервер л унших боломжтой.
Http-хүсэлт дор хаяж URI агуулна. Тиймээс, хэрэв улс орон бүхэлд нь сайт руу биш, харин тодорхой хуудсанд хандах хандалтыг хязгаарлахыг оролдож байгаа бол https сайтуудын хувьд үүнийг хийх боломжгүй юм.

Алхам №2 - шифрлэгдсэн хариулт.
Вэб сервер нь зам дээр амархан уншиж болох хариултыг өгдөг.
Шийдэл нь маш энгийн - хөтөч нь https сайт бүрт ижил хувийн болон нийтийн түлхүүрийн хослолыг дотооддоо үүсгэдэг.
Мөн сайтын нийтийн түлхүүрийн хүсэлтийн хамт өөрийн дотоод нийтийн түлхүүрийг илгээдэг.
Вэб сервер үүнийг санаж, http-хариу илгээхдээ үүнийг тодорхой үйлчлүүлэгчийн нийтийн түлхүүрээр шифрлэдэг.
Одоо http-хариултыг зөвхөн үйлчлүүлэгчийн хөтчийн хувийн түлхүүрийн эзэмшигч (өөрөөр хэлбэл үйлчлүүлэгч өөрөө) тайлж болно.

Алхам №3 - нийтийн сувгаар аюулгүй холболтыг бий болгох.
2-р жишээнд сул тал бий - сайн санаат хүмүүст http-хүсэлтийг таслан зогсоох, нийтийн түлхүүрийн талаарх мэдээллийг засварлахад юу ч саад болохгүй.
Тиймээс зуучлагч нь харилцааны суваг өөрчлөгдөх хүртэл илгээсэн болон хүлээн авсан мессежийн бүх агуулгыг тодорхой харах болно.
Үүнийг шийдвэрлэх нь маш энгийн - вэб серверийн нийтийн түлхүүрээр шифрлэгдсэн мессеж болгон хөтчийн нийтийн түлхүүрийг илгээхэд л хангалттай.
Дараа нь вэб сервер эхлээд "таны нийтийн түлхүүр ийм байна" гэх мэт хариу илгээж, энэ мессежийг ижил нийтийн түлхүүрээр шифрлэдэг.
Хөтөч хариултыг хардаг - хэрэв "таны нийтийн түлхүүр ийм байна" гэсэн мессеж ирсэн бол энэ нь харилцаа холбооны суваг аюулгүй байгаагийн 100% баталгаа юм.
Хэр аюулгүй вэ?
Ийм найдвартай холбооны сувгийг бий болгох нь ping*2 хурдаар явагддаг. Жишээлбэл, 20 мс.
Халдагчид аль нэг талын хувийн түлхүүрийг урьдчилан эзэмшсэн байх ёстой. Эсвэл хэдэн миллисекундын дотор хувийн түлхүүр олоорой.
Орчин үеийн нэг хувийн түлхүүрийг хакердах нь супер компьютер дээр хэдэн арван жил шаардагдана.

Алхам №4 - нийтийн түлхүүрүүдийн нийтийн мэдээллийн сан.
Мэдээжийн хэрэг, энэ бүх түүхэнд халдагчид үйлчлүүлэгч болон серверийн хоорондох холбооны суваг дээр суух боломж байгаа нь ойлгомжтой.
Үйлчлүүлэгч нь сервер, сервер нь үйлчлүүлэгчийн дүр эсгэж болно. Мөн хоёр чиглэлд хос товчлуурыг дуурай.
Дараа нь халдагч бүх урсгалыг харж, урсгалыг "засах" боломжтой болно.
Жишээлбэл, мөнгө илгээх хаягаа өөрчлөх эсвэл онлайн банкнаас нууц үгээ хуулах эсвэл "эсэргүүцэлтэй" контентыг блоклох.
Ийм халдлагатай тэмцэхийн тулд тэд https сайт бүрийн нийтийн түлхүүр бүхий нийтийн мэдээллийн санг гаргаж ирэв.
Хөтөч бүр 200 орчим ийм мэдээллийн сан байгаа талаар "мэддэг". Энэ нь бүх хөтөч дээр урьдчилан суулгасан байдаг.
"Мэдлэг" нь гэрчилгээ бүрийн нийтийн түлхүүрээр баталгааждаг. Өөрөөр хэлбэл, тодорхой гэрчилгээжүүлэх байгууллага бүртэй холболтыг хуурамчаар үйлдэх боломжгүй юм.

Одоо https-д SSL-г хэрхэн ашиглах талаар энгийн ойлголттой болсон.
Хэрэв та тархиа ашиглавал тусгай албаныхан энэ бүтцэд ямар нэгэн зүйлийг хэрхэн хакердаж чадах нь тодорхой болно. Гэхдээ энэ нь тэдэнд асар их хүчин чармайлт гаргах болно.
NSA эсвэл ТТГ-аас жижиг байгууллагууд - VIP-ийн хувьд ч гэсэн одоо байгаа хамгаалалтын түвшинг хакердах нь бараг боломжгүй юм.

Би мөн ssh холболтын талаар нэмэх болно. Тэнд нийтийн түлхүүр байхгүй, та юу хийж чадах вэ? Асуудлыг хоёр аргаар шийддэг.
Сонголт ssh нууц үг:
Эхний холболтын үед ssh үйлчлүүлэгч бидэнд ssh серверээс шинэ нийтийн түлхүүр байгаа гэдгийг анхааруулах ёстой.
Цаашид холболт хийх үед "ssh серверийн шинэ нийтийн түлхүүр" гэсэн анхааруулга гарч ирвэл тэд таныг чагнахыг оролдож байна гэсэн үг юм.
Эсвэл та анхны холболтоо чагнаж байсан ч одоо сервертэй зуучлагчгүйгээр харилцаж байна.
Үнэн хэрэгтээ, утсыг чагнасан баримт нь амархан, хурдан бөгөөд хүчин чармайлтгүйгээр илчлэгддэг тул энэ халдлагыг зөвхөн тодорхой үйлчлүүлэгчийн хувьд онцгой тохиолдолд ашигладаг.

Түлхүүрээр ssh сонголт:
Бид флаш диск аваад, үүн дээр ssh серверийн хувийн түлхүүрийг бичдэг (үүнд нэр томьёо, олон чухал нюансууд байдаг, гэхдээ би ашиглах заавар биш боловсролын програм бичиж байна).
Бид нийтийн түлхүүрийг ssh үйлчлүүлэгч байх машин дээр үлдээдэг бөгөөд үүнийг нууцалдаг.
Бид флаш дискийг серверт авчирч, оруулаад, хувийн түлхүүрийг хуулж, флаш дискийг шатааж, үнсийг салхинд цацна (эсвэл ядаж тэгээр форматлана).
Энэ бүгд - ийм үйлдлийн дараа ийм ssh холболтыг хакердах боломжгүй болно. Мэдээжийн хэрэг, 10 жилийн дараа суперкомпьютер дээр замын хөдөлгөөнийг харах боломжтой болно, гэхдээ энэ бол өөр түүх юм.

Сэдвээс гадуур бичсэнд хүлцэл өчье.

Тиймээс одоо онол нь мэдэгдэж байна. SSL сертификат үүсгэх урсгалын талаар би танд хэлэх болно.

"Openssl genrsa"-г ашиглан бид хувийн түлхүүр болон нийтийн түлхүүрийн "хоосон"-ыг үүсгэдэг.
Бид гуравдагч талын компани руу "хоосон" илгээдэг бөгөөд бид хамгийн энгийн гэрчилгээнд ойролцоогоор 9 доллар төлдөг.

Хэдэн цагийн дараа бид энэ гуравдагч талын компаниас "нийтийн" түлхүүр болон хэд хэдэн нийтийн түлхүүрүүдийг хүлээн авна.

Яагаад гуравдагч этгээдийн компани миний нийтийн түлхүүрийг бүртгүүлэхэд мөнгө төлөх ёстой вэ гэдэг нь тусдаа асуулт бөгөөд бид үүнийг энд авч үзэхгүй.

Энэ бичээс ямар утгатай болох нь тодорхой боллоо.

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

"/etc/ssl" хавтас нь ssl-тэй холбоотой бүх файлуудыг агуулна.
domain1.com — домэйн нэр.
2018 он бол гол бүтээлийн жил юм.
"түлхүүр" - файл нь хувийн түлхүүр гэдгийг илтгэнэ.

Мөн энэ файлын утга нь:

smtpd_tls_cert_file=/etc/ssl/domain1.com.2018.chained.crt
domain1.com — домэйн нэр.
2018 он бол гол бүтээлийн жил юм.
гинжлэгдсэн - нийтийн түлхүүрүүдийн гинж байгаа гэсэн тэмдэглэгээ (эхнийх нь бидний нийтийн түлхүүр, үлдсэн нь нийтийн түлхүүрийг гаргасан компаниас ирсэн зүйл).
crt - бэлэн гэрчилгээ байгаа гэсэн тэмдэглэгээ (техникийн тайлбар бүхий нийтийн түлхүүр).

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

Энэ тохиргоог энэ тохиолдолд ашиглахгүй, харин жишээ болгон бичсэн болно.

Учир нь энэ параметрийн алдаа нь таны серверээс спам илгээхэд хүргэдэг (таны хүсэлгүйгээр).

Дараа нь та буруугүй гэдгээ бүх хүнд нотлох хэрэгтэй.

recipient_delimiter = +

Олон хүмүүс мэдэхгүй байж болох ч энэ нь имэйлийг эрэмблэх стандарт тэмдэгт бөгөөд үүнийг орчин үеийн ихэнх шуудангийн серверүүд дэмждэг.

Жишээлбэл, хэрэв танд шуудангийн хайрцаг байгаа бол "[имэйлээр хамгаалагдсан]"илгээж үзээрэй"[имэйлээр хамгаалагдсан]"- Үүнээс юу гарч байгааг хараарай.

inet_protocols = ipv4

Энэ нь төөрөгдүүлсэн байж магадгүй юм.

Гэхдээ зүгээр ч нэг тийм биш. Шинэ домэйн бүр анхдагчаар зөвхөн IPv4, дараа нь би IPv6-г тус тусад нь асаана.

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

Энд бид бүх ирж буй захидал тагтаа руу очдогийг зааж өгсөн.
Мөн домэйн, шуудангийн хайрцаг, нэрийн дүрмүүд - мэдээллийн сангаас харна уу.

/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

Одоо postfix нь тагтаатай зөвшөөрөл авсны дараа шууданг цаашид илгээх боломжтой гэдгийг мэддэг болсон.

Яагаад энд давхардсаныг би үнэхээр ойлгохгүй байна. Бид "виртуал_тээвэр" -д шаардлагатай бүх зүйлийг аль хэдийн тодорхойлсон.

Гэхдээ постфикс систем нь маш эртний бөгөөд магадгүй энэ нь хуучин өдрүүдийн эргэн тойронд байсан байх.

smtpd_recipient_restrictions =
        ...

smtpd_helo_restrictions =
        ...

smtpd_client_restrictions =
        ...

Үүнийг шуудангийн сервер бүрт өөр өөрөөр тохируулж болно.

Надад 3 мэйл сервер байгаа бөгөөд эдгээр тохиргоо нь өөр өөр хэрэглээний шаардлагуудаас шалтгаалж өөр өөр байдаг.

Та үүнийг сайтар тохируулах хэрэгтэй - эс тэгвээс спам тан руу орох болно, эсвэл бүр дордох болно - спам чамаас асгарах болно.

# SPF
policyd-spf_time_limit = 3600

Ирж буй үсгүүдийн SPF-г шалгахтай холбоотой зарим залгаасыг тохируулж байна.

# 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

Тохируулга нь бид бүх илгээсэн имэйлд DKIM гарын үсгийг өгөх ёстой.

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

Энэ нь PHP скриптээс захидал илгээх үед захидлын чиглүүлэлтийн гол нарийн ширийн зүйл юм.

“/etc/postfix/sdd_transport.pcre” файл:

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

Зүүн талд байнгын илэрхийллүүд байна. Баруун талд үсгийг тэмдэглэсэн шошго байна.
Шошгоны дагуу Postfix - тодорхой үсгийн тохиргооны хэд хэдэн мөрийг харгалзан үзнэ.

Тодорхой үсэгт зориулж постфиксийг яг хэрхэн тохируулахыг "master.cf"-д зааж өгөх болно.

4, 5, 6-р мөрүүд нь гол мөрүүд юм. Бид ямар домэйны нэрийн өмнөөс захидал илгээж байгаа бол бид энэ шошгыг тавьдаг.
Гэхдээ хуучин кодын PHP скриптүүдэд "from" талбарыг үргэлж заадаггүй. Дараа нь хэрэглэгчийн нэр аврах ажилд ирнэ.

Нийтлэл аль хэдийн өргөн хүрээтэй байна - nginx+fpm-г тохируулснаар би сатаарахыг хүсэхгүй байна.

Товчхондоо, сайт бүрийн хувьд бид өөрийн гэсэн linux-хэрэглэгчийн эзэмшигчийг тогтоодог. Үүний дагуу таны fpm-цөөрөм.

Fpm-pool нь php-ийн аль ч хувилбарыг ашигладаг (нэг сервер дээр та php-ийн өөр хувилбар, бүр өөр өөр php.ini-г хөрш зэргэлдээх сайтуудад асуудалгүй ашиглах боломжтой бол энэ нь маш сайн).

Тиймээс тодорхой Linux-хэрэглэгч "www-domain2" нь domain2.com вэбсайттай байдаг. Энэ сайт нь from талбарыг заалгүйгээр имэйл илгээх кодтой.

Тиймээс, энэ тохиолдолд ч гэсэн захидал зөв илгээгдэх бөгөөд хэзээ ч спам руу орохгүй.

Миний "/etc/postfix/master.cf" дараах байдалтай байна.

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

Файлыг бүрэн эхээр нь өгөөгүй - энэ нь аль хэдийн маш том байна.
Би юу өөрчлөгдсөнийг л тэмдэглэсэн.

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}

Эдгээр нь spamassasin-тай холбоотой тохиргоонууд бөгөөд дараа нь дэлгэрэнгүй ярих болно.

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

Бид танд 587 портоор дамжуулан шуудангийн серверт холбогдох боломжийг олгож байна.
Үүнийг хийхийн тулд та нэвтэрч орох ёстой.

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

SPF шалгахыг идэвхжүүлнэ үү.

apt-get install postfix-policyd-spf-python

Дээрх SPF шалгах багцыг суулгацгаая.

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

Мөн энэ бол хамгийн сонирхолтой зүйл юм. Энэ нь тодорхой IPv4/IPv6 хаягаас тодорхой домэйнд захидал илгээх чадвар юм.

Энэ нь rDNS-ийн төлөө хийгддэг. rDNS нь IP хаягаар мөр хүлээн авах үйл явц юм.
Мөн шуудангийн хувьд энэ функцийг helo нь имэйл илгээсэн хаягийн rDNS-тэй яг таарч байгааг батлахад ашигладаг.

Хэрэв захидал илгээсэн имэйлийн домайнтай таарахгүй бол спам оноо олгоно.

Helo rDNS-тэй таарахгүй - маш олон спам оноо өгдөг.
Үүний дагуу домэйн бүр өөрийн гэсэн IP хаягтай байх ёстой.
OVH-ийн хувьд - консол дээр rDNS-ийг зааж өгөх боломжтой.
tech.ru-ийн хувьд асуудал нь дэмжлэгээр шийдэгддэг.
AWS-ийн хувьд асуудлыг дэмжлэгтэйгээр шийдвэрлэдэг.
"inet_protocols" ба "smtp_bind_address6" - бид IPv6 дэмжлэгийг идэвхжүүлдэг.
IPv6-ийн хувьд та мөн rDNS бүртгүүлэх хэрэгтэй.
"syslog_name" - энэ нь бүртгэлийг уншихад хялбар юм.

Сертификат худалдаж авах Би энд санал болгож байна.

Энд postfix+dovecot холбоосыг тохируулж байна.

SPF тохиргоо.

============= Тагтаа =============

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

Mysql-г тохируулах, багцуудыг өөрсдөө суулгах.

Файл "/etc/dovecot/conf.d/10-auth.conf"

disable_plaintext_auth = yes
auth_mechanisms = plain login

Зөвшөөрөл нь зөвхөн шифрлэгдсэн байна.

“/etc/dovecot/conf.d/10-mail.conf” файл

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

Энд бид үсэг хадгалах газрыг зааж өгсөн болно.

Би тэдгээрийг файлд хадгалж, домайнаар бүлэглэхийг хүсч байна.

Файл "/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 {
  }
}

Энэ бол тагтааны үндсэн тохиргооны файл юм.
Энд бид хамгаалалтгүй холболтыг идэвхгүй болгодог.
Мөн аюулгүй холболтыг идэвхжүүл.

Файл "/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
}

ssl-г тохируулж байна. Бид ssl шаардлагатай гэдгийг харуулж байна.
Мөн гэрчилгээ нь өөрөө. Мөн нэг чухал зүйл бол "орон нутгийн" заавар юм. Ямар локал IPv4-д холбогдоход ямар SSL сертификат ашиглахыг заана.

Дашрамд хэлэхэд, IPv6 энд тохируулагдаагүй байна, би энэ орхигдлыг дараа засах болно.
XX.XX.XX.X5 (домэйн2) - гэрчилгээ байхгүй. Үйлчлүүлэгчдийг холбохын тулд та domain1.com хаягийг зааж өгөх хэрэгтэй.
XX.XX.XX.X2 (domain3) - гэрчилгээ байгаа бөгөөд та үйлчлүүлэгчдийг холбохын тулд domain1.com эсвэл domain3.com-ыг зааж өгч болно.

Файл "/etc/dovecot/conf.d/15-lda.conf"

protocol lda {
  mail_plugins = $mail_plugins sieve
}

Энэ нь ирээдүйд spamassassin-д хэрэгтэй болно.

Файл "/etc/dovecot/conf.d/20-imap.conf"

protocol imap {
  mail_plugins = $mail_plugins antispam
}

Энэ бол спамын эсрэг залгаас юм. "Спам" хавтас руу шилжүүлэх үед спамассасиныг сургахад шаардлагатай.

Файл "/etc/dovecot/conf.d/20-pop3.conf"

protocol pop3 {
}

Яг ийм файл байна.

"/etc/dovecot/conf.d/20-lmtp.conf" файл

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

lmtp-г тохируулж байна.

Файл "/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
}

Спам хавтас руу шилжүүлэх/хэрэглэх үеийн Spamassasin сургалтын тохиргоо.

Файл "/etc/dovecot/conf.d/90-sieve.conf"

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

Ирж буй үсгүүдийг юу хийхийг зааж өгсөн файл.

Файл "/var/lib/dovecot/sieve/default.sieve"

require ["fileinto", "mailbox"];

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

Та "sievec default.sieve" файлыг эмхэтгэх хэрэгтэй.

Файл "/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
}

Зөвшөөрөл авахын тулд sql файлуудыг зааж өгч байна.
Мөн файлыг өөрөө зөвшөөрлийн арга болгон ашигладаг.

Файл "/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';

Энэ нь postfix-ийн ижил төстэй тохиргоотой тохирч байна.

Файл "/etc/dovecot/dovecot.conf"

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

Үндсэн тохиргооны файл.
Хамгийн чухал зүйл бол бид энд зааж өгөх явдал юм - протокол нэмэх.

============= СпамАссассин =============

apt-get install spamassassin spamc

Багцуудыг суулгацгаая.

adduser spamd --disabled-login

Хэний нэрийн өмнөөс хэрэглэгч нэмж оруулъя.

systemctl enable spamassassin.service

Бид ачаалах үед автоматаар ачаалах спамассасин үйлчилгээг идэвхжүүлдэг.

"/etc/default/spamassassin" файл:

CRON=1

"Анхдагчаар" дүрмийн автомат шинэчлэлтийг идэвхжүүлснээр.

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

Та mysql дээр "sa" гэсэн өгөгдлийн санг "нууц үг" гэсэн нууц үгээр "sa" хэрэглэгчтэй үүсгэх хэрэгтэй (хангалттай зүйлээр солино уу).

report_safe - энэ нь захидлын оронд спам имэйлийн тайланг илгээх болно.
use_bayes нь spamassassin машин сургалтын тохиргоо юм.

Үлдсэн spamassassin тохиргоог өгүүллийн өмнө ашигласан.

Ерөнхий тохиргоо "спамассасин".
Шинэ спам имэйлийг IMAP "Спам" хавтас руу зөөх тухай.
Dovecot + SpamAssassin-ийн энгийн хослолын тухай.
Би imap хавтас дахь үсгийг зөөхдөө спамассасин сурах онолыг уншихыг зөвлөж байна (мөн үүнийг ашиглахыг зөвлөдөггүй).

============= Олон нийтэд уриалах =============

Мөн дамжуулж буй захидлын аюулгүй байдлын түвшинг хэрхэн нэмэгдүүлэх талаар олон нийтэд санал бодлоо илэрхийлэхийг хүсч байна. Би шуудангийн сэдэвт маш гүнзгий орсон болохоор.

Ингэснээр хэрэглэгч өөрийн үйлчлүүлэгч дээрээ хос түлхүүр үүсгэх боломжтой (хөтөч, thunderbird, хөтөч залгаас, ...). Төрийн болон хувийн. Нийтийн - DNS руу илгээх. Хувийн - үйлчлүүлэгчид хадгална. Захидлын серверүүд тодорхой хүлээн авагч руу илгээхийн тулд нийтийн түлхүүрийг ашиглах боломжтой болно.

Ийм захидал бүхий спамаас хамгаалахын тулд (тиймээ, шуудангийн сервер контентыг үзэх боломжгүй) - та 3 дүрмийг нэвтрүүлэх шаардлагатай болно.

  1. Заавал жинхэнэ DKIM гарын үсэг, заавал SPF, заавал rDNS.
  2. Спамаас хамгаалах сургалтын сэдвээр мэдрэлийн сүлжээ + үйлчлүүлэгчийн тал дээр түүнд зориулсан мэдээллийн сан.
  3. Шифрлэлтийн алгоритм нь илгээгч тал нь хүлээн авагч талаас шифрлэлтэд CPU-ийн хүчийг 100 дахин их зарцуулдаг байх ёстой.

Нийтийн захидлуудаас гадна "аюулгүй захидал харилцааг эхлүүлэх" стандарт саналын захидлыг боловсруул. Хэрэглэгчдийн нэг нь (шуудангийн хайрцаг) өөр шуудангийн хайрцаг руу хавсралт бүхий захидал илгээдэг. Захидал нь захидал харилцааны аюулгүй суваг, шуудангийн хайрцгийн эзэмшигчийн нийтийн түлхүүрийг (үйлчлүүлэгч тал дээр хувийн түлхүүртэй) эхлүүлэх текстийн саналыг агуулдаг.

Та захидал бүрд тусгайлан хэд хэдэн түлхүүр хийж болно. Хүлээн авагч хэрэглэгч энэ саналыг хүлээн авч, нийтийн түлхүүрээ илгээх боломжтой (мөн энэ захидал харилцаанд зориулж тусгайлан хийсэн). Дараа нь эхний хэрэглэгч үйлчилгээний хяналтын захидал илгээдэг (хоёр дахь хэрэглэгчийн нийтийн түлхүүрээр шифрлэгдсэн) - үүнийг хүлээн авсны дараа хоёр дахь хэрэглэгч үүссэн харилцааны сувгийг найдвартай гэж үзэж болно. Дараа нь хоёр дахь хэрэглэгч хяналтын захидал илгээдэг бөгөөд дараа нь эхний хэрэглэгч үүссэн сувгийг аюулгүй гэж үзэж болно.

Зам дээрх түлхүүрүүдийг саатуулахтай тэмцэхийн тулд протокол нь флаш диск ашиглан дор хаяж нэг нийтийн түлхүүрийг дамжуулах боломжийг хангах ёстой.

Хамгийн гол нь бүх зүйл ажилладаг ("хэн төлөх вэ?" Гэсэн асуулт):
10 жилийн хугацаатай 3 доллараас эхлэн шуудангийн гэрчилгээг оруулна уу. Энэ нь илгээгчийг DNS-д "миний нийтийн түлхүүрүүд тэнд байна" гэж зааж өгөх боломжийг олгоно. Мөн тэд танд найдвартай холболтыг эхлүүлэх боломжийг олгоно. Үүний зэрэгцээ ийм холболтыг хүлээн авах нь үнэ төлбөргүй байдаг.
gmail эцэст нь хэрэглэгчиддээ мөнгө олж байна. 10 жилд 3 доллараар - аюулгүй захидал харилцааны суваг үүсгэх эрх.

============= Дүгнэлт =============

Нийтлэлийг бүхэлд нь шалгахын тулд би тусгай серверийг нэг сарын турш түрээсэлж, SSL сертификаттай домэйн худалдаж авах гэж байсан.

Гэвч амьдралын нөхцөл байдал үүссэн тул энэ асуудал 2 сар үргэлжилсэн.
Ингээд дахин зав гарвал нийтлэлээ дахиад нэг жил сунжруулах эрсдэлд орохын оронд нийтлэлээ байгаагаар нь нийтлэхээр шийдлээ.

Хэрэв "гэхдээ үүнийг хангалттай нарийвчлан тайлбарлаагүй" гэх мэт маш олон асуулт байгаа бол шинэ домэйн, шинэ SSL сертификат бүхий тусгай серверийг авч, үүнийг илүү нарийвчлан тайлбарлах хүч чадал байх болно. Хамгийн гол нь дутуу бүх чухал мэдээллийг олж тогтоох.

Мөн шуудангийн гэрчилгээний талаархи санал хүсэлтийн талаар санал авахыг хүсч байна. Хэрэв танд энэ санаа таалагдаж байвал би rfc-д зориулж ноорог бичих хүчийг олохыг хичээх болно.

Нийтлэлийн том хэсгийг хуулахдаа энэ нийтлэлийн холбоосыг оруулна уу.
Бусад хэл рүү орчуулахдаа энэ нийтлэлийн холбоосыг оруулна уу.
Би өөрөө англи хэл рүү орчуулахыг хичээж, хөндлөнгийн лавлагаа үлдээх болно.


Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх