Postfix

さくらのVPSでメールサーバー構築

Postfix

さくらのVPSでメールサーバー Postfix

環境

  • さくらのVPS CPU:仮想3Core メモリ:2GB SSD:100GB CentOS Linux release 7.7.1908 (Core)
  • メール転送エージェント Postfix mail_version = 2.10.1 最初からインストールされていた
  • メール受信 Dovecot 2.2.36

インストールと設定

/etc/selinux/config

さくらのVPSではデフォルトでOFFになっていた

[root@sakura ~]# cat /etc/selinux/config
SELINUX=disabled ← さくらはデフォルトでOFF
SELINUXTYPE=targeted

Postfix

デフォルトでインストール済みであった

/etc/postfix/main.cf

[root@sakura ~]# postconf -n
alias_database = hash:/etc/aliases
alias_maps = hash:/etc/aliases
always_bcc = abc@example.com
broken_sasl_auth_clients = yes
command_directory = /usr/sbin
config_directory = /etc/postfix
daemon_directory = /usr/libexec/postfix
data_directory = /var/lib/postfix
debug_peer_level = 2
debugger_command = PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin ddd $daemon_directory/$process_name $process_id & sleep 5
header_checks = regexp:/etc/postfix/header_checks
home_mailbox = Maildir/
html_directory = no
inet_interfaces = all
inet_protocols = ipv4
mail_owner = postfix
mailbox_size_limit = 204800000
mailq_path = /usr/bin/mailq.postfix
manpage_directory = /usr/share/man
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain, example.com
mydomain = example.com
myhostname = smtp.example.com
newaliases_path = /usr/bin/newaliases.postfix
queue_directory = /var/spool/postfix
readme_directory = /usr/share/doc/postfix-2.10.1/README_FILES
sample_directory = /usr/share/doc/postfix-2.10.1/samples
sendmail_path = /usr/sbin/sendmail.postfix
setgid_group = postdrop
smtp_tls_CAfile = /etc/pki/tls/cert.pem
smtp_tls_loglevel = 1
smtp_tls_security_level = may
smtpd_banner = $myhostname ESMTP unknown
smtpd_hard_error_limit = 5
smtpd_recipient_restrictions = permit_sasl_authenticated, reject_unauth_destination
smtpd_relay_restrictions = permit_mynetworks, permit_sasl_authenticated, permit_inet_interfaces, reject_unauth_destination
smtpd_sasl_auth_enable = yes
smtpd_sender_restrictions = reject_non_fqdn_sender, check_recipient_access hash:/etc/postfix/recipient_whitelist, check_sender_access hash:/etc/postfix/redirect_sender
unknown_local_recipient_reject_code = 550

SMTP認証 saslauthd(SMTP-Auth)

[root@sakura ~]# systemctl -l status saslauthd
Unit saslauthd.service could not be found.

[root@sakura ~]# yum list installed|grep sasl
cyrus-sasl.x86_64 2.1.26-23.el7 @base
cyrus-sasl-lib.x86_64 2.1.26-23.el7 @base
cyrus-sasl-plain.x86_64 2.1.26-23.el7 @base

[root@sakura ~]# yum install cyrus-sasl
Is this ok [y/d/N]: y
Downloading packages:
cyrus-sasl-2.1.26-23.el7.x86_64.rpm | 88 kB 00:00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Installing : cyrus-sasl-2.1.26-23.el7.x86_64 1/1
Verifying : cyrus-sasl-2.1.26-23.el7.x86_64 1/1

Installed:
cyrus-sasl.x86_64 0:2.1.26-23.el7

Complete!
[root@sakura ~]# systemctl start saslauthd
[root@sakura ~]# systemctl status -l saslauthd

SMTP認証 /etc/postfix/master.cf

smtp inet n - n - - smtpd
smtpd pass - - n - - smtpd
submission inet n - n - - smtpd
-o smtpd_sasl_auth_enable=yes
-o smtpd_client_restrictions=permit_sasl_authenticated,reject

/etc/postfix/redirect_sender

送信元を判別して転送する 転送しないメールアドレスも記載

domainA         REDIRECT address1@exmaple.com     ← domainA をaddress1@exmaple.com に転送
domainB         REDIRECT address2@exmaple.com
domainC         REDIRECT address3@exmaple.com
123@domainA     OK                                ← 転送なしで宛先に届く
abc@domainB     OK

# postmap /etc/postfix/redirect_sender ← /etc/postfix/redirect_sender.db 作成 postfix 再起動不要 

/etc/postfix/recipient_whitelist

スパム判定をしないアドレス

# postmap /etc/postfix/recipient_whitelist ← /etc/postfix/recipient_whitelist.db ができる postfix 再起動不要

/etc/postfix/header_checks

前段のファイアウォール等でスパムタグ付けされたものを特定のアドレスに転送集約

/^Subject:.*Spam/ REDIRECT spamdetect@example.com 件名に「Spam」検出にて指定アドレスに転送

/etc/aliases

転送設定

address1:     address1,address@example2.com ← address1@example.com 宛を address1@example.com とaddress@example2.com にも転送
# postalias /etc/aliases ← /etc/aliases.db ができる postfix 再起動不要

Dovecot

インストール済みかどうかの確認方法
yum list installed | grep [パッケージ名]

[root@sakura ~]# yum list installed |grep dovecot 結果なし

rpm -qa | grep [パッケージ名]

[root@sakura ~]# rpm -qa|grep dovecot 結果なし

インストール

[root@sakura ~]# yum install dovecot
------------------
Installed:
dovecot.x86_64 1:2.2.36-3.el7_7.1

Dependency Installed:
clucene-core.x86_64 0:2.3.3.4-11.el7

Complete!

version 確認

[root@sakura ~]# dovecot --version
2.2.36 (1f10bfa63)

設定

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

mail_location = maildir:~/Maildir  ← 追加(メールボックス形式をMaildir形式とする)

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

disable_plaintext_auth = no ← 追加(プレインテキスト認証を許可)
※メールサーバー間通信内容暗号化(OpenSSL+Postfix+Dovecot)導入必須

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

ssl = no ← SSL接続無効
※メールサーバー間通信内容暗号化(OpenSSL+Postfix+Dovecot)導入必須

dovecot 起動

[root@sakura ~]# systemctl start dovecot
[root@sakura ~]# systemctl -l status dovecot

自動起動になっているかの確認

[root@sakura ~]# systemctl is-enabled dovecot
enabled

ファイアウォールの設定

さくらのVPS提供パケットフィルタを無効に

問題発生
さくらのVPSのコントロールパネルにてパケットフィルタ機能を有効にしてみた。
「メール関係ポート 25/110/143/465/587/993/995 メールの送受信用ポート」←ポート開放される
ところが、相手先サーバーに寄ってはお互いにメール送受信できない。
いろいろトライしたが断念。さくらのVPS提供のパケットフィルタを無効にした

CentOS 7 のファイアウォール起動

代わりに独自でファイアウォールの設定をした。試行錯誤の状況は最後に記載
ファイアウォール 起動か確認

[root@sakura postfix]# systemctl status firewalld
* firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
   Active: inactive (dead)
     Docs: man:firewalld(1)
[root@sakura postfix]# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

firewall 停止しているので起動と確認

[root@sakura postfix]# systemctl start firewalld 起動
[root@sakura postfix]# systemctl status firewalld 確認
* firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
   Active: active (running) since Tue 2020-04-07 15:06:19 JST; 10s ago
     Docs: man:firewalld(1)
 Main PID: 6526 (firewalld)
   CGroup: /system.slice/firewalld.service
           `-6526 /usr/bin/python2 -Es /usr/sbin/firewalld --nofork --nopid

Apr 07 15:06:18 sakura.vs.sakura.ne.jp systemd[1]: Starting firewalld - dynamic firewall daemon...
Apr 07 15:06:19 sakura.vs.sakura.ne.jp systemd[1]: Started firewalld - dynamic firewall daemon.

[root@sakura log]# firewall-cmd --state これでも確認できる
running

デフォルトで割り当てられるゾーンの確認

[root@sakura log]# firewall-cmd --get-default-zone
public

アクティブゾーンの確認

[root@sakura log]# firewall-cmd --get-active-zones
public
interfaces: eth0

デフォルトゾーンのFW設定確認(ssh は動作)

[root@sakura postfix]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: dhcpv6-client ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:

現在追加されているサービスの確認(ssh は動作)

[root@sakura postfix]# firewall-cmd --list-services --zone=public
dhcpv6-client ssh

■smtp サービス追加 サブミッションポート587 解放(メール送信)

[root@sakura postfix]# firewall-cmd --add-service=smtp --zone=public --permanent
success
[root@sakura postfix]# firewall-cmd --reload
success
[root@sakura postfix]# firewall-cmd --add-port=587/tcp --zone=public --permanent
success
[root@sakura postfix]# firewall-cmd --list-port --zone=public --permanent
587/tcp

firewall 再起動後デフォルトゾーンのFW設定確認(587 smtp 確認)

[root@sakura postfix]# systemctl restart firewalld
[root@sakura postfix]# firewall-cmd --list-all 
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: dhcpv6-client smtp ssh
ports: 587/tcp
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:

■pop3 サービス追加 ポート110 を開放 (メール受信)

[root@sakura postfix]# firewall-cmd --add-service=pop3 --zone=public --permanent
success
[root@sakura postfix]# firewall-cmd --add-port=110/tcp --zone=public --permanent
success

firewall 再起動後デフォルトゾーンのFW設定確認

[root@sakura postfix]# systemctl restart firewalld
[root@sakura postfix]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: dhcpv6-client pop3 smtp ssh
ports: 587/tcp 110/tcp
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:

ファイアウォール自動起動の設定

ファイアウォール設定後 即反映しない様だった。正確な時間は不正確だが1~3時間掛かったか。
メール送受信できること確認できたので firewall 自動起動の設定を実行

[root@sakura ~]# systemctl is-enabled firewalld
disabled
[root@sakura ~]# systemctl enable firewalld
Created symlink from /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service to /usr/lib/systemd/system/firewalld.service.
Created symlink from /etc/systemd/system/multi-user.target.wants/firewalld.service to /usr/lib/systemd/system/firewalld.service.
[root@sakura ~]# systemctl is-enabled firewalld
enabled

ブルートフォースアタック対策(スパム対策)

さくらのパケットフィルタを利用しない結論までの過程

さくらから送信の場合 最初のサーバー挨拶を受け取れない様なエラー

status=deferred (lost connection with 送信先ホスト名[送信先IP] while receiving the initial server greeting)

さくらからtelnet で相手先に接続してみる(telnet は未インストールなのでインストールした)
どこで失敗しているのか見当つかず

[root@sakura Maildir]# telnet 相手先メールサーバーホスト名 587
Trying xxx.xxx.xxx.xxx...
telnet: connect to address xxx.xxx.xxx.xxx: Connection timed out

さくらのサーバーからキューに溜まったメールを強制送信してみる

# postqueue -f

相手先 Fortigate でパケット調査 メールサーバーにパケットは流れている様だ。

# diagnose sniffer packet dmz 'host 相手先IPアドレス' 4 0|
interfaces=[dmz]
filters=[host 相手メールサーバーIP]
                         ↓さくら              ↓メールサーバー
3.615317 dmz -- IPアドレス.56884 -> IPアドレス.25: syn 1770169343
3.634862 dmz -- IPアドレス.56886 -> IPアドレス.25: syn 3623657490
4.615124 dmz -- IPアドレス.56884 -> IPアドレス.25: syn 1770169343
4.626097 dmz -- IPアドレス.56886 -> IPアドレス.25: syn 3623657490

実際に相手先にパケットが到達しているか相手先で確認(相手先 CentOS 6.9)
ネットワークインターフェースの調査 eth0 のパケットキャプチャー

[root@centos6.9 postfix]# tcpdump -Xvv -i eth0 src host さくらのIPアドレス
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes

結果相手先メールサーバーまでパケットは到達しているので、ファイアウォールに原因ありと結論付けた

まとめ

さくらのコントロールパネルのパケットフィルタは簡単で良いが詳細設定が欲しい
Azure のパケットフィルタはソース、宛先、許可、拒否、優先度等 使いやすい
CentOS でのファイアウォールの設定はきめ細かい設定は可能だが非常に複雑
できれば、コンパネで設定できるとありがたい Azure ConoHA ではコンパネのパケットフィルタでOK
postfix の設定でこれほど困ったのは初めて

コメント