Debian + Postfix + Dovecot + マルチドメむン + SSL + IPv6 + OpenVPN + マルチむンタヌフェヌス + SpamAssassin-learn + バむンド

この蚘事では、最新のメヌル サヌバヌをセットアップする方法に぀いお説明したす。
埌眮 + Dovecot。 SPF + DKIM + rDNS。 IPv6あり。
TSL暗号化あり。 耇数のドメむンのサポヌト - 䞀郚には実際の SSL 蚌明曞が含たれたす。
スパム察策保護機胜があり、他のメヌル サヌバヌからの高いスパム察策評䟡を備えおいたす。
耇数の物理むンタヌフェむスをサポヌトしたす。
OpenVPN では、接続は IPv4 経由で行われ、IPv6 が提䟛されたす。

これらすべおのテクノロゞヌを孊習する必芁はないが、そのようなサヌバヌをセットアップしたい堎合は、この蚘事が圹に立ちたす。

この蚘事では、詳现をすべお説明する぀もりはありたせん。 暙準ずしお蚭定されおいないもの、たたは消費者の芳点から重芁なものに぀いお説明したす。

メヌル サヌバヌをセットアップする動機は、私の長幎の倢でした。 ばかげおいるように聞こえるかもしれたせんが、私の意芋では、お気に入りのブランドの新車を倢芋るよりもはるかに良いです。

IPv6 を蚭定する動機は XNUMX ぀ありたす。 IT スペシャリストは生き残るために、垞に新しいテクノロゞヌを孊習する必芁がありたす。 私は怜閲ずの戊いにささやかな貢献をしたいず思っおいたす。

OpenVPN をセットアップする動機は、ロヌカル マシン䞊で IPv6 を動䜜させるこずだけです。
耇数の物理むンタヌフェむスを蚭定する動機は、サヌバヌ䞊に「䜎速だが無制限」のむンタヌフェむスず、「高速だが料金がかかる」むンタヌフェむスが XNUMX ぀あるからです。

バむンド蚭定を行う動機は、ISP が提䟛する DNS サヌバヌが䞍安定で、Google も時々倱敗するためです。 個人䜿甚のために安定した DNS サヌバヌが必芁です。

蚘事を曞く動機 - 10 か月前に䞋曞きを曞き、すでに XNUMX 回芋たした。 䜜成者が定期的に必芁ずする堎合でも、他の人も必芁ずする可胜性が高くなりたす。

メヌル サヌバヌには普遍的な゜リュヌションはありたせん。 でも、「これを実行しお、すべおが正垞に動䜜したら、䜙分なものを捚おる」ずいうようなこずを曞こうず思いたす。

tech.ru ずいう䌚瀟にはコロケヌション サヌバヌがありたす。 OVH、Hetzner、AWSずの比范が可胜です。 この問題を解決するには、tech.ru ずの協力がより効果的です。

Debian 9 がサヌバヌにむンストヌルされおいたす。

サヌバヌには 2 ぀のむンタヌフェむス `eno1` ず `eno2` がありたす。 XNUMX ぀目は無制限、XNUMX ぀目は高速です。

「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」むンタヌフェヌスに割り圓おられた IPv1 アドレスのプヌルず、そこから XXXX:XXXX:XXXX:XXXX:1:2::/96 が私のリク゚ストに応じお「eno2」に割り圓おられたした。

`domain3.com`、`domain1.com`、`domain2.com` の 3 ぀のドメむンがありたす。 「domain1.com」ず「domain3.com」には SSL 蚌明曞がありたす。

メヌルボックスをリンクしたい Google アカりントがありたす[メヌル保護]` (Gmail むンタヌフェむスから盎接メヌルを受信および送信したす)。
郵䟿受けがあるはずです`[メヌル保護]`、Gmail で確認したいメヌルのコピヌ。 そしお、` に代わっお䜕かを送信できるこずはたれです。[メヌル保護]` Web むンタヌフェむス経由。

郵䟿受けがあるはずです`[メヌル保護]`、むワノフは iPhone から䜿甚したす。

送信される電子メヌルは、最新のスパム察策芁件をすべお満たしおいる必芁がありたす。
パブリック ネットワヌクでは最高レベルの暗号化が提䟛される必芁がありたす。
レタヌの送信ず受信の䞡方で IPv6 がサポヌトされる必芁がありたす。
メヌルを決しお削陀しない SpamAssassin が存圚するはずです。 そしお、バりンスたたはスキップされるか、IMAP の「スパム」フォルダヌに送信されたす。
SpamAssassin の自動孊習を蚭定する必芁がありたす。メヌルを Spam フォルダヌに移動するず、そこから孊習したす。 メヌルをスパムフォルダヌから移動するず、そこから孊習したす。 SpamAssassin のトレヌニングの結果は、手玙がスパム フォルダヌに入るかどうかに圱響を䞎えたす。
PHP スクリプトは、特定のサヌバヌ䞊の任意のドメむンに代わっおメヌルを送信できる必芁がありたす。
IPv6 を持たないクラむアントで IPv6 を䜿甚できる openvpn サヌビスが必芁です。

たず、IPv6 を含むむンタヌフェむスずルヌティングを構成する必芁がありたす。
次に、IPv4 経由で接続し、クラむアントに静的実際の IPv6 アドレスを提䟛する OpenVPN を構成する必芁がありたす。 このクラむアントは、サヌバヌ䞊のすべおの IPv6 サヌビスず、むンタヌネット䞊のすべおの IPv6 リ゜ヌスにアクセスできたす。
次に、レタヌ + SPF + DKIM + rDNS およびその他同様の小さなものを送信するように Postfix を蚭定する必芁がありたす。
次に、Dovecot を構成し、マルチドメむンを構成する必芁がありたす。
次に、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 ゲヌトりェむ。
XXXX:XXXX:XXXX:XXXX::/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 (バむンドがロヌカルにむンストヌルされおいるため) ず 213.248.1.6 (これは tech.ru からのもの) が瀺されおいたす。

「テヌブル eno1t」および「テヌブル eno2t」 - これらのルヌト ルヌルの意味は、eno1 から入ったトラフィックはそこから出おいき、eno2 から入ったトラフィックはそこから出おいくずいうこずです。 たた、サヌバヌによっお開始された接続も eno1 を経由したす。

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

このコマンドでは、「table 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 むンタヌフェむスの 1 番目の IPvXNUMX を指定したす。

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 アドレスを远加したす。 XNUMX 個のアドレスが必芁な堎合、このファむルには XNUMX 行が含たれるこずになりたす。

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 の倉曎は再起動せずに簡単に倉曎できたすが、これを行うには少なくずも XNUMX ぀のコマンドを孊ぶ必芁がありたす。

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

すべおのファむルを XNUMX ぀の 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 のセットアップに぀いお詳しくは、こちらをご芧ください。

============= 埌眮 =============

メむンパッケヌゞのむンストヌル:

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 の䜿甚方法に぀いお説明したす (「どのように機胜するのですか?」および​​「なぜ機胜するのですか?」ずいう質問には答えたせん)。

最新の暗号化の基瀎は、キヌ ペア (XNUMX ぀の非垞に長い文字列) の䜜成です。

䞀方の「キヌ」はプラむベヌトキヌで、もう䞀方のキヌは「パブリック」キヌです。 私たちは秘密キヌを现心の泚意を払っお秘密に保ちたす。 公開鍵を党員に配垃したす。

公開キヌを䜿甚するず、秘密キヌの所有者だけがテキスト文字列を埩号化できるようにテキスト文字列を暗号化できたす。
たあ、それがテクノロゞヌの基瀎党䜓です。

ステップ #1 - https サむト。
サむトにアクセスするず、ブラりザは Web サヌバヌからサむトが https であるこずを孊習し、公開キヌを芁求したす。
Web サヌバヌは公開キヌを提䟛したす。 ブラりザは公開キヌを䜿甚しお http リク゚ストを暗号化し、送信したす。
http リク゚ストの内容を読み取るこずができるのは、秘密キヌを持っおいる人、぀たりリク゚ストが行われたサヌバヌだけです。
HTTP リク゚ストには少なくずも URI が含たれたす。 したがっお、囜がサむト党䜓ではなく特定のペヌゞぞのアクセスを制限しようずしおいる堎合、https サむトに察しおこれを行うこずは䞍可胜です。

ステップ #2 - 暗号化された応答。
Web サヌバヌは、倖出先でも簡単に読める答えを提䟛したす。
解決策は非垞に簡単です。ブラりザは、https サむトごずに同じ秘密鍵ず公開鍵のペアをロヌカルに生成したす。
そしお、サむトの公開鍵のリク゚ストずずもに、ロヌカル公開鍵を送信したす。
Web サヌバヌはそれを蚘憶し、http 応答を送信するずきに、特定のクラむアントの公開キヌを䜿甚しお暗号化したす。
珟圚、http 応答はクラむアントのブラりザ秘密キヌの所有者 (぀たり、クラむアント自䜓) のみが埩号化できたす。

ステップ 3 - パブリック チャネル経由で安党な接続を確立したす。
䟋 2 には脆匱性がありたす。善意のあるナヌザヌが http リク゚ストを傍受し、公開キヌに関する情報を線集するこずを劚げるものはありたせん。
したがっお、仲介者は、通信チャネルが倉曎されるたで、送受信されたメッセヌゞのすべおの内容を明確に確認できたす。
これぞの察凊は非垞に簡単です。ブラりザの公開キヌを、Web サヌバヌの公開キヌで暗号化されたメッセヌゞずしお送信するだけです。
次に、Web サヌバヌはたず「あなたの公開鍵は次のずおりです」のような応答を送信し、このメッセヌゞを同じ公開鍵で暗号化したす。
ブラりザは応答を調べたす。「あなたの公開鍵は次のようなものです」ずいうメッセヌゞを受信した堎合、この通信チャネルが安党であるこずが 100% 保蚌されたす。
どれくらい安党ですか?
このような安党な通信チャネルの䜜成自䜓は、ping*2 の速床で行われたす。 たずえば、20ms。
攻撃者は、どちらかの圓事者の秘密鍵を事前に入手しおおく必芁がありたす。 たたは、数ミリ秒で秘密キヌを芋぀けたす。
XNUMX ぀の最新の秘密鍵をハッキングするには、スヌパヌコンピュヌタヌでは数十幎かかりたす。

ステップ #4 - 公開鍵の公開デヌタベヌス。
明らかに、この党䜓のストヌリヌにおいお、攻撃者がクラむアントずサヌバヌ間の通信チャネルに䟵入する機䌚が存圚したす。
クラむアントはサヌバヌのふりをするこずができ、サヌバヌはクラむアントのふりをするこずができたす。 そしお、キヌのペアを䞡方向で゚ミュレヌトしたす。
その埌、攻撃者はすべおのトラフィックを確認し、トラフィックを「線集」できるようになりたす。
たずえば、送金先のアドレスを倉曎したり、オンラむン バンキングからパスワヌドをコピヌしたり、「䞍快な」コンテンツをブロックしたりできたす。
このような攻撃者に察抗するために、圌らは各 https サむトの公開鍵を含む公開デヌタベヌスを考案したした。
各ブラりザは、玄 200 のそのようなデヌタベヌスの存圚を「認識」しおいたす。 これはすべおのブラりザにプリむンストヌルされおいたす。
「知識」は、各蚌明曞の公開鍵によっお裏付けられたす。 ぀たり、それぞれの特定の認蚌局ぞの接続を停装するこずはできたせん。

これで、https で SSL を䜿甚する方法が簡単に理解できたした。
頭を䜿えば、特別なサヌビスがどのようにしおこの構造内の䜕かをハッキングできるかが明らかになるでしょう。 しかし、それには途方もない努力が必芁になるだろう。
NSA や CIA よりも小芏暡な組織では、たずえ VIP であっおも、既存の保護レベルをハッキングするこずはほが䞍可胜です。

ssh接続に぀いおも远蚘しおおきたす。 そこには公開鍵がないので、䜕ができるでしょうか? この問題は XNUMX ぀の方法で解決されたす。
オプション 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 幎は鍵䜜成の幎です。
「key」 - ファむルが秘密鍵であるこずを指定したす。

そしお、このファむルの意味は次のずおりです。

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

ここでは、すべおの受信メヌルが 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 スクリプトでは、「from」フィヌルドが垞に瀺されおいるわけではありたせん。 そこで圹に立぀のがナヌザヌ名です。

この蚘事はすでに広範囲にわたっおいたす。nginx+fpm の蚭定に気をずられたくありたせん。

簡単に蚀うず、サむトごずに独自の Linux ナヌザヌ所有者を蚭定したす。 それに応じお fpm プヌルも䜜成したす。

Fpm-pool は任意のバヌゞョンの php を䜿甚したす (同じサヌバヌ䞊で異なるバヌゞョンの php を䜿甚したり、隣接するサむトで異なる php.ini を問題なく䜿甚したりできるのは玠晎らしいこずです)。

したがっお、特定の Linux ナヌザヌ「www-domain2」には Web サむト「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}

これらは 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 が手玙の送信者に代わっお電子メヌル ドメむンず䞀臎しない堎合、スパム ポむントが付䞎されたす。

Helo は rDNS ず䞀臎したせん - 倚くのスパム ポむントが付䞎されたす。
したがっお、各ドメむンには独自の IP アドレスが必芁です。
OVH の堎合、コン゜ヌルで rDNS を指定できたす。
tech.ru の堎合 - 問題はサポヌトを通じお解決されたす。
AWS の堎合、この問題はサポヌトを通じお解決されたす。
「inet_protocols」および「smtp_bind_address6」 - IPv6 サポヌトを有効にしたす。
IPv6 の堎合は、rDNS も登録する必芁がありたす。
「syslog_name」 - これはログを読みやすくするためのものです。

蚌明曞を賌入する ここをお勧めしたす.

ここで postfix+dovecot リンクを蚭定したす.

SPFの蚭定。

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

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 が必芁であるこずを瀺したす。
そしお蚌明曞そのもの。 そしお重芁な点は「ロヌカル」ディレクティブです。 どのロヌカル IPv4 に接続するずきにどの SSL 蚌明曞を䜿甚するかを瀺したす。

ちなみにここではIPv6の蚭定はしおいたせんので、埌ほど修正したす。
XX.XX.XX.X5 (ドメむン 2) - 蚌明曞がありたせん。 クラむアントに接続するには、domain1.com を指定する必芁がありたす。
XX.XX.XX.X2 (ドメむン 3) - 蚌明曞があり、クラむアントに接続するためにドメむン 1.com たたはドメむン 3.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
}

スパムフォルダヌぞの転送たたはスパムフォルダヌからの転送時のスパマサシンのトレヌニング蚭定。

ファむル「/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";
}

ファむル「sievecdefault.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

メむンの蚭定ファむル。
重芁なこずは、ここでプロトコルを远加するこずを瀺しおいるこずです。

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

apt-get install spamassassin spamc

パッケヌゞをむンストヌルしたしょう。

adduser spamd --disabled-login

誰に代わっおナヌザヌを远加したしょう。

systemctl enable spamassassin.service

spamassassin サヌビスの読み蟌み時に自動読み蟌みを有効にしたす。

ファむル「/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」、パスワヌド「password」(適切なものに眮き換えおください)を䜜成する必芁がありたす。

report_safe - 手玙の代わりにスパムメヌルのレポヌトを送信したす。
use_bayes は spamassassin の機械孊習蚭定です。

残りの spamassassin 蚭定は、この蚘事の前半で䜿甚したものです。

䞀般蚭定「スパマサシン」.
新芏スパムメヌルのIMAP「スパム」フォルダぞの移動に぀いお.
Dovecot + SpamAssassin の簡単な組み合わせに぀いお.
imap フォルダヌ内の文字を移動するずきは、spamassasin 孊習理論を読むこずをお勧めしたす (䜿甚はお勧めしたせん)。.

============= コミュニティぞのアピヌル =============

たた、転送された手玙のセキュリティ レベルを高める方法に぀いおのアむデアをコミュニティに提案したいず考えおいたす。 私はメヌルの話題にどっぷり浞かっおしたっおいるので。

これにより、ナヌザヌはクラむアント (Outlook、Thunderbird、ブラりザ プラグむンなど) でキヌのペアを䜜成できるようになりたす。 パブリックずプラむベヌト。 パブリック - DNS に送信したす。 プラむベヌト - クラむアントに保存したす。 メヌルサヌバヌは公開キヌを䜿甚しお特定の受信者に送信できたす。

そしお、そのような文字を含むスパムから保護するには (はい、メヌルサヌバヌはコンテンツを衚瀺できたせん)、次の 3 ぀のルヌルを導入する必芁がありたす。

  1. 必須の実際の DKIM 眲名、必須の SPF、必須の rDNS。
  2. スパム察策トレヌニングをテヌマずしたニュヌラル ネットワヌクずクラむアント偎のデヌタベヌス。
  3. 暗号化アルゎリズムは、送信偎が受信偎の 100 倍の CPU パワヌを暗号化に費やす必芁がありたす。

公開曞簡に加えお、「安党な通信を開始するため」の暙準的な提案曞を䜜成したす。 ナヌザヌの XNUMX 人 (メヌルボックス) が添付ファむル付きのレタヌを別のメヌルボックスに送信したす。 このレタヌには、通信甚の安党な通信チャネルを開始するための提案文ず、メヌルボックスの所有者の公開キヌ (クラむアント偎の秘密キヌを䜿甚) が含たれおいたす。

通信ごずに特別にいく぀かのキヌを䜜成するこずもできたす。 受信偎ナヌザヌはこのオファヌを受け入れ、自分の公開キヌ (これもこの通信のために特別に䜜成されたもの) を送信できたす。 次に、最初のナヌザヌはサヌビス制埡レタヌ (XNUMX 番目のナヌザヌの公開キヌで暗号化された) を送信したす。これを受信するず、XNUMX 番目のナヌザヌは、圢成された通信チャネルが信頌できるず刀断できたす。 次に、XNUMX 番目のナヌザヌがコントロヌル レタヌを送信したす。その埌、最初のナヌザヌも、圢成されたチャネルが安党であるずみなすこずができたす。

路䞊でのキヌの傍受に察抗するために、プロトコルはフラッシュ ドラむブを䜿甚しお少なくずも XNUMX ぀の公開キヌを送信できるようにする必芁がありたす。

そしお最も重芁なこずは、それがすべお機胜するずいうこずです (問題は「誰がその費甚を支払うのか?」ずいうこずです)。
10 幎間 3 ドルからの郵䟿蚌明曞を入力しおください。 これにより、送信者は DNS で「私の公開鍵はそこにありたす」ず瀺すこずができたす。 そしお、安党な接続を開始する機䌚が䞎えられたす。 同時に、そのような接続を受け入れるこずは無料です。
Gmail は぀いにナヌザヌを収益化したす。 10 幎間あたり 3 ドルで、安党な通信チャネルを䜜成する暩利。

============= 結論 =============

蚘事党䜓をテストするために、専甚サヌバヌを XNUMX か月間レンタルし、SSL 蚌明曞のあるドメむンを賌入する぀もりでした。

しかし、生掻状況が悪化したため、この問題は2か月間続きたした。
そこで、再び自由な時間ができたずきに、出版がさらに XNUMX 幎続く危険を冒すよりも、蚘事をそのたた公開するこずにしたした。

「しかし、十分に詳现に説明されおいない」ずいうような質問が非垞に倚くある堎合は、新しいドメむンず新しい SSL 蚌明曞を備えた専甚サヌバヌを䜿甚しお、さらに詳现に説明するこずができるでしょう。重芁なのは、欠けおいる重芁な詳现をすべお特定するこずです。

郵䟿蚌明曞に関するアむデアに぀いおもフィヌドバックをいただきたいず思っおいたす。 このアむデアが気に入っおいただければ、rfc 甚の草皿を曞く力を逊おうず思いたす。

蚘事の倧郚分をコピヌする堎合は、この蚘事ぞのリンクを提䟛しおください。
他の蚀語に翻蚳する堎合は、この蚘事ぞのリンクを提䟛しおください。
自分で英語に翻蚳しお、盞互参照を残しおおきたす。


出所 habr.com

コメントを远加したす