さくらの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提供パケットフィルタを無効に
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 の設定でこれほど困ったのは初めて
コメント