Debian + Postfix + Dovecot + มัลติโดเมน + SSL + IPv6 + OpenVPN + มัลติอินเทอร์เฟซ + SpamAssassin-learn + Bind

บทความนี้เกี่ยวกับวิธีตั้งค่าเมลเซิร์ฟเวอร์สมัยใหม่
Postfix + โดฟคอต SPF + DKIM + rDNS ด้วย IPv6
ด้วยการเข้ารหัส TSL ด้วยการรองรับหลายโดเมน - ส่วนที่มีใบรับรอง SSL จริง
ด้วยการป้องกันสแปมและระดับการป้องกันสแปมสูงจากเซิร์ฟเวอร์เมลอื่น ๆ
รองรับอินเทอร์เฟซทางกายภาพหลายแบบ
ด้วย OpenVPN การเชื่อมต่อผ่าน IPv4 และที่ให้ IPv6

หากคุณไม่ต้องการเรียนรู้เทคโนโลยีเหล่านี้ทั้งหมด แต่ต้องการตั้งค่าเซิร์ฟเวอร์ดังกล่าว บทความนี้เหมาะสำหรับคุณ

บทความนี้ไม่ได้พยายามอธิบายทุกรายละเอียด คำอธิบายครอบคลุมถึงสิ่งที่ไม่ได้กำหนดค่าให้เป็นมาตรฐานหรือมีความสำคัญจากมุมมองของผู้บริโภค

แรงจูงใจในการตั้งค่าเมลเซิร์ฟเวอร์เป็นความฝันของฉันมายาวนาน นี่อาจฟังดูงี่เง่า แต่ IMHO ดีกว่าการฝันถึงรถใหม่จากแบรนด์ที่คุณชื่นชอบมาก

มีสองแรงจูงใจในการตั้งค่า IPv6 ผู้เชี่ยวชาญด้านไอทีจำเป็นต้องเรียนรู้เทคโนโลยีใหม่ๆ อย่างต่อเนื่องเพื่อความอยู่รอด ฉันอยากจะมีส่วนร่วมเพียงเล็กน้อยในการต่อสู้กับการเซ็นเซอร์

แรงจูงใจในการตั้งค่า OpenVPN คือเพียงเพื่อให้ IPv6 ทำงานบนเครื่องท้องถิ่น
แรงจูงใจในการตั้งค่าอินเทอร์เฟซทางกายภาพหลายรายการคือบนเซิร์ฟเวอร์ของฉัน ฉันมีอินเทอร์เฟซหนึ่ง "ช้าแต่ไม่จำกัด" และอีกอินเทอร์เฟซหนึ่ง "เร็วแต่มีค่าใช้จ่ายสูง"

แรงจูงใจในการตั้งค่าการตั้งค่า Bind คือ ISP ของฉันมีเซิร์ฟเวอร์ DNS ที่ไม่เสถียร และบางครั้ง Google ก็ล้มเหลวเช่นกัน ฉันต้องการเซิร์ฟเวอร์ DNS ที่เสถียรสำหรับการใช้งานส่วนตัว

แรงจูงใจในการเขียนบทความ - ฉันเขียนร่างเมื่อ 10 เดือนที่แล้วและฉันได้ดูมาแล้วสองครั้ง แม้ว่าผู้เขียนจะต้องการมันเป็นประจำ แต่ก็มีความเป็นไปได้สูงที่คนอื่นจะต้องการมันเช่นกัน

ไม่มีโซลูชันสากลสำหรับเมลเซิร์ฟเวอร์ แต่ฉันจะพยายามเขียนประมาณว่า “ทำสิ่งนี้แล้ว เมื่อทุกอย่างทำงานได้ตามที่ควรจะเป็น ก็โยนสิ่งที่พิเศษออกไป”

บริษัท tech.ru มีเซิร์ฟเวอร์ Colocation สามารถเปรียบเทียบกับ OVH, Hetzner, AWS ได้ เพื่อแก้ไขปัญหานี้ ความร่วมมือกับ tech.ru จะมีประสิทธิภาพมากขึ้น

ติดตั้ง Debian 9 บนเซิร์ฟเวอร์แล้ว

เซิร์ฟเวอร์มี 2 อินเทอร์เฟซ `eno1` และ `eno2` อันแรกไม่จำกัด และอันที่สองเร็วตามลำดับ

มีที่อยู่ IP แบบคงที่ 3 รายการ ได้แก่ XX.XX.XX.X0 และ XX.XX.XX.X1 และ XX.XX.XX.X2 บนอินเทอร์เฟซ `eno1` และ XX.XX.XX.X5 บนอินเทอร์เฟซ `eno2` .

ว่าง XXXX:XXXX:XXXX:XXXX::/64 กลุ่มที่อยู่ IPv6 ที่กำหนดให้กับอินเทอร์เฟซ `eno1` และจากนั้น XXXX:XXXX:XXXX:XXXX:1:2::/96 ถูกกำหนดให้กับ `eno2` ตามคำขอของฉัน

มี 3 โดเมนคือ `domain1.com`, `domain2.com`, `domain3.com` มีใบรับรอง SSL สำหรับ `domain1.com` และ `domain3.com`

ฉันมีบัญชี Google ที่ต้องการเชื่อมโยงกับกล่องจดหมายของฉัน[ป้องกันอีเมล]` (รับเมลและส่งเมลโดยตรงจากอินเทอร์เฟซ Gmail)
จะต้องมีกล่องจดหมาย'[ป้องกันอีเมล]` ซึ่งเป็นสำเนาของอีเมลที่ฉันต้องการดูใน Gmail ของฉัน และเป็นเรื่องยากที่จะส่งบางสิ่งในนามของ ` ได้[ป้องกันอีเมล]` ผ่านทางเว็บอินเตอร์เฟส

จะต้องมีกล่องจดหมาย'[ป้องกันอีเมล]` ซึ่ง Ivanov จะใช้จาก iPhone ของเขา

อีเมลที่ส่งจะต้องเป็นไปตามข้อกำหนดการป้องกันสแปมสมัยใหม่ทั้งหมด
จะต้องมีการเข้ารหัสระดับสูงสุดในเครือข่ายสาธารณะ
ควรมีการสนับสนุน IPv6 สำหรับทั้งการส่งและรับจดหมาย
ควรมี SpamAssassin ที่จะไม่มีวันลบอีเมล และมันจะเด้งหรือข้ามหรือส่งไปที่โฟลเดอร์ "สแปม" ของ IMAP
ต้องกำหนดค่าการเรียนรู้อัตโนมัติของ SpamAssassin: ถ้าฉันย้ายจดหมายไปที่โฟลเดอร์สแปม มันจะเรียนรู้จากสิ่งนี้ ถ้าฉันย้ายจดหมายจากโฟลเดอร์สแปม มันจะเรียนรู้จากสิ่งนี้ ผลลัพธ์ของการฝึกอบรม SpamAssassin ควรส่งผลต่อว่าจดหมายจะไปอยู่ในโฟลเดอร์สแปมหรือไม่
สคริปต์ PHP จะต้องสามารถส่งอีเมลในนามของโดเมนใดๆ บนเซิร์ฟเวอร์ที่กำหนดได้
ควรมีบริการ openvpn ที่สามารถใช้ IPv6 บนไคลเอนต์ที่ไม่มี IPv6

ขั้นแรก คุณต้องกำหนดค่าอินเทอร์เฟซและการกำหนดเส้นทาง รวมถึง 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 - IPv4 #1 บน eno1
XX.XX.XX.X1 - IPv4 #2 บน eno1
XX.XX.XX.X2 - IPv4 #3 บน eno1
XX.XX.XX.X5 - IPv4 #1 บน eno2
XX.XX.XX.1 - เกตเวย์ IPv4
XXXX:XXXX:XXXX:XXXX::/64 - IPv6 สำหรับทั้งเซิร์ฟเวอร์
XXXX:XXXX:XXXX:XXXX:1:2::/96 - IPv6 สำหรับ eno2 ทุกอย่างจากภายนอกจะเข้าสู่ eno1
XXXX:XXXX:XXXX:XXXX::1 — เกตเวย์ IPv6 (ควรสังเกตว่าสิ่งนี้สามารถ/ควรทำแตกต่างออกไป ระบุสวิตช์ IPv6)
dns-nameservers - ระบุ 127.0.0.1 (เนื่องจากมีการติดตั้งการผูกในเครื่อง) และ 213.248.1.6 (มาจาก tech.ru)

“table eno1t” และ “table 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

บล็อกนี้ระบุ IPv4 ที่สองสำหรับอินเทอร์เฟซ eno1

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

ด้วยคำสั่งนี้ เราจะตั้งค่าเส้นทางจากไคลเอนต์ OpenVPN ไปยัง IPv4 ในเครื่อง ยกเว้น XX.XX.XX.X0
ฉันยังไม่เข้าใจว่าเหตุใดคำสั่งนี้จึงเพียงพอสำหรับ 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 มิฉะนั้นจะไม่สามารถกำหนดค่าเกตเวย์ IPv6 สำหรับไคลเอนต์ OpenVPN ได้
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

============= เปิด VPN =============

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 ที่อยู่ IPv4 สำหรับไคลเอนต์ openvpn
ความสอดคล้องของกฎเป็นสิ่งสำคัญ

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

นี่เป็นข้อจำกัดเพื่อให้มีเพียงฉันเท่านั้นที่สามารถใช้ OpenVPN จาก 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

หากต้องการส่งต่อแพ็กเก็ต IPv4 ระหว่างไคลเอนต์ OpenVPN และอินเทอร์เน็ต คุณต้องลงทะเบียนหนึ่งในคำสั่งเหล่านี้

ในบางกรณี ตัวเลือกใดตัวเลือกหนึ่งไม่เหมาะสม
คำสั่งทั้งสองเหมาะสำหรับกรณีของฉัน
หลังจากอ่านเอกสารแล้ว ฉันเลือกตัวเลือกแรกเนื่องจากใช้ 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" จะต้องไม่มีความคิดเห็น
และใส่ “key-direction 1” ไว้หน้าแท็ก “tls-auth” ด้วย

มากำหนดค่าเซิร์ฟเวอร์ 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

ฉันพบว่ามันยากที่จะจำได้ว่าทำไมจึงเขียนเช่นนี้

ตอนนี้ netmask = 112 ดูแปลก ๆ (ควรเป็น 96 ตรงนั้น)
และคำนำหน้าก็แปลกไม่ตรงกับเครือข่าย tun0
แต่โอเค ฉันจะปล่อยมันไว้เหมือนเดิม

cipher DES-EDE3-CBC

นี่ไม่ใช่สำหรับทุกคน - ฉันเลือกวิธีการเข้ารหัสการเชื่อมต่อนี้

เรียนรู้เพิ่มเติมเกี่ยวกับการตั้งค่า OpenVPN IPv4

เรียนรู้เพิ่มเติมเกี่ยวกับการตั้งค่า OpenVPN IPv6

============= โพสต์แก้ไข =============

การติดตั้งแพ็คเกจหลัก:

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

ตามที่ชาว Khabrovsk กล่าวว่าบล็อกนี้มี "ข้อมูลที่ผิดและวิทยานิพนธ์ที่ไม่ถูกต้อง"หลังจากเริ่มต้นอาชีพเพียง 8 ปี ฉันก็เริ่มเข้าใจวิธีการทำงานของ SSL

ดังนั้น ฉันจะใช้เสรีภาพในการอธิบายวิธีใช้ SSL (โดยไม่ต้องตอบคำถาม "มันทำงานอย่างไร" และ "เหตุใดจึงทำงาน")

พื้นฐานของการเข้ารหัสสมัยใหม่คือการสร้างคู่คีย์ (อักขระสองสายที่ยาวมาก)

“คีย์” หนึ่งอันเป็นแบบส่วนตัว ส่วนอีกคีย์หนึ่งคือ “สาธารณะ” เราเก็บรหัสส่วนตัวไว้เป็นความลับอย่างระมัดระวัง เราแจกจ่ายกุญแจสาธารณะให้กับทุกคน

เมื่อใช้คีย์สาธารณะ คุณสามารถเข้ารหัสสตริงข้อความเพื่อให้เฉพาะเจ้าของคีย์ส่วนตัวเท่านั้นที่สามารถถอดรหัสได้
นั่นคือพื้นฐานทั้งหมดของเทคโนโลยี

ขั้นตอนที่ #1 - เว็บไซต์ https
เมื่อเข้าถึงไซต์ เบราว์เซอร์จะเรียนรู้จากเว็บเซิร์ฟเวอร์ว่าไซต์นั้นเป็น https และดังนั้นจึงขอรหัสสาธารณะ
เว็บเซิร์ฟเวอร์ให้รหัสสาธารณะ เบราว์เซอร์ใช้กุญแจสาธารณะเพื่อเข้ารหัสคำขอ http และส่ง
เนื้อหาของคำขอ http สามารถอ่านได้โดยผู้ที่มีคีย์ส่วนตัวเท่านั้น กล่าวคือ เฉพาะเซิร์ฟเวอร์ที่ส่งคำขอเท่านั้น
คำขอ Http มี URI เป็นอย่างน้อย ดังนั้น หากประเทศใดพยายามจำกัดการเข้าถึงไม่ใช่ทั้งเว็บไซต์ แต่จำกัดการเข้าถึงเฉพาะบางหน้า การกระทำนี้จะไม่สามารถทำได้สำหรับเว็บไซต์ https

ขั้นตอนที่ # 2 - การตอบสนองที่เข้ารหัส
เว็บเซิร์ฟเวอร์ให้คำตอบที่สามารถอ่านได้ง่ายบนท้องถนน
วิธีแก้ปัญหานั้นง่ายมาก - เบราว์เซอร์จะสร้างคู่คีย์ส่วนตัว-สาธารณะเดียวกันในเครื่องสำหรับแต่ละไซต์ https
และนอกเหนือจากการร้องขอรหัสสาธารณะของไซต์แล้ว ทางเว็บไซต์จะส่งรหัสสาธารณะในเครื่องด้วย
เว็บเซิร์ฟเวอร์จะจดจำข้อมูลดังกล่าว และเมื่อส่งการตอบสนองแบบ http จะเข้ารหัสด้วยรหัสสาธารณะของไคลเอ็นต์เฉพาะ
ขณะนี้ การตอบสนอง http สามารถถอดรหัสได้โดยเจ้าของคีย์ส่วนตัวของเบราว์เซอร์ไคลเอ็นต์เท่านั้น (นั่นคือ ตัวไคลเอ็นต์เอง)

ขั้นตอนที่ 3 - สร้างการเชื่อมต่อที่ปลอดภัยผ่านช่องทางสาธารณะ
มีช่องโหว่ในตัวอย่างที่ 2 - ไม่มีสิ่งใดป้องกันผู้ปรารถนาดีจากการสกัดกั้นคำขอ http และแก้ไขข้อมูลเกี่ยวกับรหัสสาธารณะ
ดังนั้นคนกลางจะเห็นเนื้อหาข้อความที่ส่งและรับทั้งหมดอย่างชัดเจนจนกว่าช่องทางการสื่อสารจะเปลี่ยนไป
การจัดการกับสิ่งนี้ทำได้ง่ายมาก เพียงส่งรหัสสาธารณะของเบราว์เซอร์เป็นข้อความที่เข้ารหัสด้วยรหัสสาธารณะของเว็บเซิร์ฟเวอร์
จากนั้นเว็บเซิร์ฟเวอร์จะส่งคำตอบเช่น “รหัสสาธารณะของคุณเป็นแบบนี้” และเข้ารหัสข้อความนี้ด้วยรหัสสาธารณะเดียวกัน
เบราว์เซอร์จะดูการตอบสนอง - หากได้รับข้อความ "รหัสสาธารณะของคุณเป็นแบบนี้" - นี่เป็นการรับประกัน 100% ว่าช่องทางการสื่อสารนี้มีความปลอดภัย
ปลอดภัยแค่ไหน?
การสร้างช่องทางการสื่อสารที่ปลอดภัยนั้นเกิดขึ้นที่ความเร็ว ping*2 เช่น 20ms
ผู้โจมตีจะต้องมีรหัสส่วนตัวของฝ่ายใดฝ่ายหนึ่งล่วงหน้า หรือค้นหาคีย์ส่วนตัวภายในเวลาไม่กี่วินาที
การแฮ็กคีย์ส่วนตัวสมัยใหม่จะใช้เวลาหลายทศวรรษในซูเปอร์คอมพิวเตอร์

ขั้นตอนที่ # 4 - ฐานข้อมูลสาธารณะของกุญแจสาธารณะ
เห็นได้ชัดว่าในเรื่องราวทั้งหมดนี้มีโอกาสสำหรับผู้โจมตีที่จะนั่งบนช่องทางการสื่อสารระหว่างไคลเอนต์และเซิร์ฟเวอร์
ลูกค้าสามารถแกล้งทำเป็นเซิร์ฟเวอร์ และเซิร์ฟเวอร์สามารถแกล้งทำเป็นลูกค้าได้ และจำลองคีย์คู่หนึ่งทั้งสองทิศทาง
จากนั้นผู้โจมตีจะเห็นการรับส่งข้อมูลทั้งหมดและสามารถ "แก้ไข" การรับส่งข้อมูลได้
ตัวอย่างเช่น เปลี่ยนที่อยู่ที่จะส่งเงินหรือคัดลอกรหัสผ่านจากธนาคารออนไลน์หรือบล็อกเนื้อหาที่ "น่ารังเกียจ"
เพื่อต่อสู้กับผู้โจมตี พวกเขาจึงสร้างฐานข้อมูลสาธารณะพร้อมกุญแจสาธารณะสำหรับไซต์ https แต่ละแห่ง
เบราว์เซอร์แต่ละตัว “รู้” เกี่ยวกับการมีอยู่ของฐานข้อมูลดังกล่าวประมาณ 200 รายการ สิ่งนี้มีการติดตั้งไว้ล่วงหน้าในทุกเบราว์เซอร์
“ความรู้” ได้รับการสนับสนุนจากคีย์สาธารณะจากใบรับรองแต่ละใบ นั่นคือการเชื่อมต่อกับผู้ออกใบรับรองแต่ละรายไม่สามารถปลอมแปลงได้

ตอนนี้มีความเข้าใจง่ายๆ เกี่ยวกับวิธีใช้ SSL สำหรับ https แล้ว
หากคุณใช้สมอง คุณจะชัดเจนว่าบริการพิเศษสามารถแฮ็กบางสิ่งในโครงสร้างนี้ได้อย่างไร แต่มันจะทำให้พวกเขาต้องสูญเสียความพยายามอันมหาศาล
และองค์กรที่มีขนาดเล็กกว่า NSA หรือ CIA แทบจะเป็นไปไม่ได้เลยที่จะแฮ็กระดับการป้องกันที่มีอยู่ แม้แต่กับ VIP ก็ตาม

ฉันจะเพิ่มเกี่ยวกับการเชื่อมต่อ ssh ด้วย ที่นั่นไม่มีกุญแจสาธารณะ แล้วคุณจะทำอย่างไร? ปัญหาได้รับการแก้ไขในสองวิธี
ตัวเลือก ssh-by-password:
ในระหว่างการเชื่อมต่อครั้งแรก ไคลเอนต์ ssh ควรเตือนว่าเรามีรหัสสาธารณะใหม่จากเซิร์ฟเวอร์ ssh
และในระหว่างการเชื่อมต่อเพิ่มเติม หากคำเตือน “รหัสสาธารณะใหม่จากเซิร์ฟเวอร์ ssh” ปรากฏขึ้น นั่นหมายความว่าพวกเขากำลังพยายามแอบฟังคุณ
หรือคุณถูกดักฟังในการเชื่อมต่อครั้งแรก แต่ตอนนี้คุณสื่อสารกับเซิร์ฟเวอร์โดยไม่มีคนกลาง
ที่จริงแล้ว เนื่องจากข้อเท็จจริงที่ว่าการดักฟังโทรศัพท์นั้นเปิดเผยได้ง่าย รวดเร็ว และง่ายดาย การโจมตีนี้จึงใช้ในกรณีพิเศษสำหรับลูกค้าเฉพาะรายเท่านั้น

ตัวเลือก ssh-by-key:
เราใช้แฟลชไดรฟ์เขียนคีย์ส่วนตัวสำหรับเซิร์ฟเวอร์ 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 เป็นปีแห่งการสร้างสรรค์ครั้งสำคัญ
chained - การระบุว่ามีกุญแจสาธารณะเป็นลูกโซ่ (อันแรกคือกุญแจสาธารณะของเราและที่เหลือคือสิ่งที่มาจาก บริษัท ที่ออกกุญแจสาธารณะ)
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

ที่นี่เราระบุว่าเมลขาเข้าทั้งหมดไปที่ dovecot
และกฎสำหรับโดเมน กล่องจดหมาย นามแฝง - ดูในฐานข้อมูล

/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 รู้แล้วว่าสามารถรับจดหมายเพื่อส่งต่อไปได้หลังจากได้รับอนุญาตจาก dovecot เท่านั้น

ฉันไม่เข้าใจจริงๆ ว่าทำไมสิ่งนี้ถึงซ้ำกันที่นี่ เราได้ระบุทุกสิ่งที่จำเป็นใน “virtual_transport” แล้ว

แต่ระบบ 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 ตามป้ายกำกับ - จะคำนึงถึงบรรทัดการกำหนดค่าเพิ่มเติมสองสามบรรทัดสำหรับตัวอักษรเฉพาะ

วิธีการกำหนดค่า postfix ใหม่สำหรับตัวอักษรเฉพาะจะระบุไว้ใน “master.cf”

เส้นที่ 4, 5, 6 เป็นเส้นหลัก ในนามของโดเมนที่เราจะส่งจดหมาย เราได้ติดป้ายกำกับนี้
แต่ฟิลด์ "จาก" ไม่ได้ระบุไว้ในสคริปต์ PHP ในโค้ดเก่าเสมอไป จากนั้นชื่อผู้ใช้ก็เข้ามาช่วยเหลือ

บทความนี้มีเนื้อหาครอบคลุมอยู่แล้ว - ฉันไม่อยากถูกรบกวนด้วยการตั้งค่า nginx+fpm

โดยสรุป สำหรับแต่ละไซต์ เราได้ตั้งค่าเจ้าของผู้ใช้ linux ของตนเอง และตาม fpm-pool ของคุณ

Fpm-pool ใช้ php เวอร์ชันใดก็ได้ (จะดีมากเมื่ออยู่บนเซิร์ฟเวอร์เดียวกัน คุณสามารถใช้ php เวอร์ชันต่างกันและแม้แต่ php.ini ที่แตกต่างกันสำหรับไซต์ใกล้เคียงได้โดยไม่มีปัญหา)

ดังนั้น ผู้ใช้ linux ที่ระบุ “www-domain2” จึงมีเว็บไซต์ domain2.com ไซต์นี้มีรหัสสำหรับส่งอีเมลโดยไม่ระบุช่องจาก

ดังนั้นแม้ในกรณีนี้ จดหมายจะถูกส่งอย่างถูกต้องและจะไม่กลายเป็นสแปมอีกต่อไป

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

นี่คือการตั้งค่าที่เกี่ยวข้องกับสแปมซาซิน ซึ่งจะอธิบายเพิ่มเติมในภายหลัง

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 ไม่ตรงกับโดเมนอีเมลในนามของผู้ส่งจดหมาย จะมีการให้คะแนนสแปม

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 {
  }
}

นี่คือไฟล์การกำหนดค่า dovecot หลัก
ที่นี่เราปิดการใช้งานการเชื่อมต่อที่ไม่ปลอดภัย
และเปิดใช้งานการเชื่อมต่อที่ปลอดภัย

ไฟล์ "/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
และใบรับรองนั้นเอง และรายละเอียดที่สำคัญคือคำสั่ง "ท้องถิ่น" ระบุว่าใบรับรอง SSL ใดที่จะใช้เมื่อเชื่อมต่อกับ IPv4 ในเครื่องใด

อย่างไรก็ตาม 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
}

สิ่งนี้จำเป็นสำหรับนักฆ่าสแปมในอนาคต

ไฟล์ "/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

คุณต้องสร้างฐานข้อมูล “sa” ใน mysql ด้วยผู้ใช้ “sa” ด้วยรหัสผ่าน “รหัสผ่าน” (แทนที่ด้วยข้อมูลที่เหมาะสม)

report_safe - จะส่งรายงานอีเมลขยะแทนจดหมาย
use_bayes คือการตั้งค่าแมชชีนเลิร์นนิงของ Spamassassin

การตั้งค่านักฆ่าสแปมที่เหลือถูกนำมาใช้ก่อนหน้านี้ในบทความ

การตั้งค่าทั่วไป "spassassin".
เกี่ยวกับการย้ายอีเมลสแปมใหม่ไปยังโฟลเดอร์ "สแปม" ของ IMAP.
เกี่ยวกับการผสมผสานอย่างง่ายของ Dovecot + SpamAssassin.
ฉันแนะนำให้อ่านทฤษฎีการเรียนรู้สแปมซาซินเมื่อย้ายตัวอักษรในโฟลเดอร์ Imap (และฉันไม่แนะนำให้ใช้).

============= อุทธรณ์ต่อชุมชน =============

ฉันอยากจะนำเสนอแนวคิดให้กับชุมชนเกี่ยวกับวิธีเพิ่มระดับความปลอดภัยของจดหมายที่ส่งต่อ เนื่องจากฉันหมกมุ่นอยู่กับหัวข้อจดหมายอย่างลึกซึ้ง

เพื่อให้ผู้ใช้สามารถสร้างคีย์คู่หนึ่งบนไคลเอนต์ของเขาได้ (outlook, ธันเดอร์เบิร์ด, ปลั๊กอินเบราว์เซอร์, ... ) ภาครัฐและเอกชน สาธารณะ - ส่งไปที่ DNS ส่วนตัว - บันทึกบนไคลเอนต์ เมลเซิร์ฟเวอร์จะสามารถใช้รหัสสาธารณะเพื่อส่งไปยังผู้รับที่ระบุได้

และเพื่อป้องกันสแปมด้วยตัวอักษรดังกล่าว (ใช่ เมลเซิร์ฟเวอร์จะไม่สามารถดูเนื้อหาได้) - คุณจะต้องแนะนำกฎ 3 ข้อ:

  1. ลายเซ็น DKIM จริงที่บังคับ, SPF บังคับ, rDNS บังคับ
  2. โครงข่ายประสาทเทียมในเรื่องของการฝึกอบรมการป้องกันสแปม + ฐานข้อมูลสำหรับฝั่งไคลเอ็นต์
  3. อัลกอริธึมการเข้ารหัสจะต้องเป็นเช่นนั้นฝั่งผู้ส่งจะต้องใช้พลังงาน CPU ในการเข้ารหัสมากกว่าฝั่งรับถึง 100 เท่า

นอกเหนือจากจดหมายสาธารณะแล้ว ให้จัดทำจดหมายข้อเสนอมาตรฐาน “เพื่อเริ่มการติดต่อสื่อสารอย่างปลอดภัย” ผู้ใช้รายหนึ่ง (กล่องจดหมาย) ส่งจดหมายพร้อมไฟล์แนบไปยังกล่องจดหมายอื่น จดหมายประกอบด้วยข้อเสนอข้อความเพื่อเริ่มช่องทางการสื่อสารที่ปลอดภัยสำหรับการติดต่อสื่อสารและรหัสสาธารณะของเจ้าของกล่องจดหมาย (พร้อมรหัสส่วนตัวบนฝั่งไคลเอ็นต์)

คุณสามารถสร้างคีย์สองสามปุ่มสำหรับการติดต่อแต่ละครั้งโดยเฉพาะได้ ผู้ใช้ผู้รับสามารถยอมรับข้อเสนอนี้และส่งรหัสสาธารณะของเขา (ทำขึ้นเป็นพิเศษสำหรับการติดต่อนี้ด้วย) จากนั้นผู้ใช้รายแรกจะส่งจดหมายควบคุมการบริการ (เข้ารหัสด้วยรหัสสาธารณะของผู้ใช้คนที่สอง) - เมื่อได้รับซึ่งผู้ใช้คนที่สองสามารถพิจารณาว่าช่องทางการสื่อสารที่เกิดขึ้นนั้นเชื่อถือได้ ถัดไป ผู้ใช้คนที่สองส่งจดหมายควบคุม - จากนั้นผู้ใช้รายแรกยังสามารถพิจารณาว่าช่องสัญญาณที่สร้างขึ้นมีความปลอดภัยหรือไม่

เพื่อต่อสู้กับการสกัดกั้นกุญแจบนท้องถนน โปรโตคอลจะต้องจัดให้มีความเป็นไปได้ในการส่งกุญแจสาธารณะอย่างน้อยหนึ่งอันโดยใช้แฟลชไดรฟ์

และสิ่งที่สำคัญที่สุดคือมันใช้งานได้ทั้งหมด (คำถามคือ “ใครจะจ่ายเงินให้?”):
ป้อนใบรับรองไปรษณีย์เริ่มต้นที่ $10 เป็นเวลา 3 ปี ซึ่งจะช่วยให้ผู้ส่งระบุใน DNS ว่า "กุญแจสาธารณะของฉันอยู่ที่นั่น" และพวกเขาจะให้โอกาสคุณในการเริ่มต้นการเชื่อมต่อที่ปลอดภัย ในขณะเดียวกัน การยอมรับการเชื่อมต่อดังกล่าวนั้นฟรี
ในที่สุด Gmail ก็สร้างรายได้จากผู้ใช้แล้ว ในราคา 10 ดอลลาร์ต่อ 3 ปี - สิทธิ์ในการสร้างช่องทางการติดต่อที่ปลอดภัย

============= สรุป =============

เพื่อทดสอบบทความทั้งหมด ฉันจะเช่าเซิร์ฟเวอร์เฉพาะเป็นเวลาหนึ่งเดือนและซื้อโดเมนที่มีใบรับรอง SSL

แต่สถานการณ์ในชีวิตก็พัฒนาไป ประเด็นนี้จึงยืดเยื้อยาวนานถึง 2 เดือน
เมื่อผมมีเวลาว่างอีกครั้ง ผมจึงตัดสินใจตีพิมพ์บทความเหมือนเดิม แทนที่จะเสี่ยงว่าสิ่งพิมพ์จะลากยาวไปอีกปี

หากมีคำถามมากมายเช่น "แต่ไม่ได้อธิบายอย่างละเอียดเพียงพอ" ก็อาจมีจุดแข็งที่จะนำเซิร์ฟเวอร์เฉพาะที่มีโดเมนใหม่และใบรับรอง SSL ใหม่มาอธิบายโดยละเอียดยิ่งขึ้นและส่วนใหญ่ ที่สำคัญระบุรายละเอียดสำคัญที่ขาดหายไปทั้งหมด

ฉันต้องการรับคำติชมเกี่ยวกับแนวคิดเกี่ยวกับใบรับรองไปรษณียบัตรด้วย ถ้าคุณชอบแนวคิดนี้ ฉันจะพยายามหาจุดแข็งในการเขียนร่างสำหรับ rfc

เมื่อคัดลอกบทความส่วนใหญ่ ให้ระบุลิงก์ไปยังบทความนี้
เมื่อแปลเป็นภาษาอื่น โปรดระบุลิงก์ไปยังบทความนี้
ฉันจะพยายามแปลเป็นภาษาอังกฤษด้วยตัวเองและทิ้งการอ้างอิงโยงไว้


ที่มา: will.com

เพิ่มความคิดเห็น