CentOS8で構築する自宅サーバ:mailサーバの構築 その2 postfixのインストールと設定

postfixのインストール

メールサーバとして、postfixをインストールします。

[root@ace zeke]# dnf install postfix
メタデータの期限切れの最終確認: 0:01:06 時間前の 2020年04月10日 00時38分36秒 に 実施しました。
依存関係が解決しました。
================================================================================
 パッケージ       Arch            バージョン              リポジトリー    サイズ
================================================================================
インストール:
 postfix          x86_64          2:3.3.1-9.el8           BaseOS          1.5 M
依存関係のインストール:
 libicu           x86_64          60.3-2.el8_1            BaseOS          8.8 M

トランザクションの概要
================================================================================
インストール  2 パッケージ

ダウンロードサイズの合計: 10 M
インストール済みのサイズ: 38 M
これでよろしいですか? [y/N]: y
パッケージのダウンロード:
(1/2): postfix-3.3.1-9.el8.x86_64.rpm           5.5 MB/s | 1.5 MB     00:00
(2/2): libicu-60.3-2.el8_1.x86_64.rpm            16 MB/s | 8.8 MB     00:00
--------------------------------------------------------------------------------
合計                                            7.9 MB/s |  10 MB     00:01
トランザクションの確認を実行中
トランザクションの確認に成功しました。
トランザクションのテストを実行中
トランザクションのテストに成功しました。
トランザクションを実行中
  準備             :                                                        1/1
  インストール中   : libicu-60.3-2.el8_1.x86_64                             1/2
  scriptletの実行中: libicu-60.3-2.el8_1.x86_64                             1/2
  scriptletの実行中: postfix-2:3.3.1-9.el8.x86_64                           2/2
  インストール中   : postfix-2:3.3.1-9.el8.x86_64                           2/2
  scriptletの実行中: postfix-2:3.3.1-9.el8.x86_64                           2/2
  検証             : libicu-60.3-2.el8_1.x86_64                             1/2
  検証             : postfix-2:3.3.1-9.el8.x86_64                           2/2

インストール済み:
  postfix-2:3.3.1-9.el8.x86_64            libicu-60.3-2.el8_1.x86_64

完了しました!
[root@ace zeke]#

お手軽パッケージインストール完了です。

main.cfの編集

[root@ace zeke]# diff /etc/postfix/main.cf /etc/postfix/main.cf.orig
96d95
< myhostname = mail.zeke.ne.jp
104d102
< mydomain = zeke.ne.jp
134c132
< inet_interfaces = all
---
> #inet_interfaces = all
137c135
< #inet_interfaces = localhost
---
> inet_interfaces = localhost
185c183
< #mydestination = $myhostname, localhost.$mydomain, localhost
---
> mydestination = $myhostname, localhost.$mydomain, localhost
189,192d186
< mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain,
<       ns.zeke.ne.jp, joeker.zeke.ne.jp, myhome.zeke.ne.jp, ace.zeke.ne.jp,
<       zeke.jp, mail.zeke.jp, ns.zeke.jp, joeker.zeke.jp,
<       *その他のドメイン*.com
434c428
< recipient_delimiter = +
---
> #recipient_delimiter = +
445d438
< home_mailbox = Maildir/
475d467
< mailbox_command = /usr/libexec/dovecot/dovecot-lda -f "$SENDER" -a "$RECIPIENT"
601d592
< smtpd_banner = $myhostname ESMTP $mail_name
718c709
< smtpd_tls_cert_file = /etc/letsencrypt/live/zeke.ne.jp/fullchain.pem
---
> smtpd_tls_cert_file = /etc/pki/tls/certs/postfix.pem
724c715
< smtpd_tls_key_file = /etc/letsencrypt/live/zeke.ne.jp/privkey.pem
---
> smtpd_tls_key_file = /etc/pki/tls/private/postfix.key
748,779d738
<
< smtpd_tls_loglevel = 1
< smtpd_tls_received_header = yes
<
< # SASL parameters
< smtpd_sasl_auth_enable = no
< smtpd_sasl_type = dovecot
< smtpd_sasl_path = private/auth
< smtpd_sasl_security_options = noanonymous
< smtpd_sasl_local_domain = $myhostname
<
< smtpd_recipient_restrictions =
<       permit_mynetworks,
<       reject_unauth_destination,
<       reject_rbl_client bl.spamcop.net,
<       reject_rbl_client zen.spamhaus.org
<
< # Performance and Regulation
< disable_vrfy_command = yes
< smtpd_peername_lookup = no
< message_size_limit = 10485760
< mailbox_size_limit = 0
< default_process_limit = 50
< default_destination_concurrency_limit = 10
< initial_destination_concurrency = 3
<
< anvil_rate_time_unit = 60s
< smtpd_client_message_rate_limit = 120
< smtpd_client_recipient_rate_limit = 120
< smtpd_client_connection_rate_limit = 120
< smtpd_client_connection_count_limit = 25
<
[root@ace zeke]#

設定ファイルについては

この方針と

こちらのページを参考にさせていただきました!

475d467
< mailbox_command = /usr/libexec/dovecot/dovecot-lda -f "$SENDER" -a "$RECIPIENT"

ローカルの配送はdovecotのコマンドを使います。

718c709
< smtpd_tls_cert_file = /etc/letsencrypt/live/zeke.ne.jp/fullchain.pem
---
> smtpd_tls_cert_file = /etc/pki/tls/certs/postfix.pem
724c715
< smtpd_tls_key_file = /etc/letsencrypt/live/zeke.ne.jp/privkey.pem
---
> smtpd_tls_key_file = /etc/pki/tls/private/postfix.key

今回の証明書は現行のサーバからコピーしたものを使います。移行したあとは、Let’s Encryptからとてきたものを使います。

< # SASL parameters
< smtpd_sasl_auth_enable = no
< smtpd_sasl_type = dovecot
< smtpd_sasl_path = private/auth
< smtpd_sasl_security_options = noanonymous
< smtpd_sasl_local_domain = $myhostname

認証の設定では、「smtpd_sasl_auth_enable = no」とし、smtp(25番ポート)では認証なしにしておきます。

また、認証自体はdovecotのものをそのまま使います。

< smtpd_recipient_restrictions =
<       permit_mynetworks,
<       reject_unauth_destination,
<       reject_rbl_client bl.spamcop.net,
<       reject_rbl_client zen.spamhaus.org

smtpd_recipient_restrictionsの設定では、bl.spamcop.net及びzen.spamhaus.orgのブラックリストに載っているサーバからの接続を拒否します。

< # Performance and Regulation
< disable_vrfy_command = yes
< smtpd_peername_lookup = no
< message_size_limit = 10485760
< mailbox_size_limit = 0
< default_process_limit = 50
< default_destination_concurrency_limit = 10
< initial_destination_concurrency = 3

パフォーマンス関係の設定では、disable_vrfy_command = yesとして、ユーザを知られないようにしておきます。

また、かつては、ホスト名をもとに接続制限をかけていましたが、今は無駄なので、smtpd_peername_lookup = noとし、ホスト名の逆引きはしません。

< anvil_rate_time_unit = 60s
< smtpd_client_message_rate_limit = 120
< smtpd_client_recipient_rate_limit = 120
< smtpd_client_connection_rate_limit = 120
< smtpd_client_connection_count_limit = 25

1分間に送信できるメールの数も制限しておきます。これは、不正利用されたときに備えるもので、通常運用時より十分余裕を持った値にしています。

master.cfの編集

[root@ace zeke]# vi /etc/postfix/master.cf
[root@ace zeke]# diff /etc/postfix/master.cf /etc/postfix/master.cf.orig
17,20c17,20
< submission inet n       -       n       -       -       smtpd
<   -o syslog_name=postfix/submission
<   -o smtpd_tls_security_level=encrypt
<   -o smtpd_sasl_auth_enable=yes
---
> #submission inet n       -       n       -       -       smtpd
> #  -o syslog_name=postfix/submission
> #  -o smtpd_tls_security_level=encrypt
> #  -o smtpd_sasl_auth_enable=yes
27c27
<   -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
---
> #  -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
29,32c29,32
< smtps     inet  n       -       n       -       -       smtpd
<   -o syslog_name=postfix/smtps
<   -o smtpd_tls_wrappermode=yes
<   -o smtpd_sasl_auth_enable=yes
---
> #smtps     inet  n       -       n       -       -       smtpd
> #  -o syslog_name=postfix/smtps
> #  -o smtpd_tls_wrappermode=yes
> #  -o smtpd_sasl_auth_enable=yes
38c38
<   -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
---
> #  -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
[root@ace zeke]#

submisshon(587番ポート)及びsmtps(465番ポート)を設定します。こちらはともに認証ありにしておきます。

デーモンの起動

[root@ace zeke]# systemctl status postfix
● postfix.service - Postfix Mail Transport Agent
   Loaded: loaded (/usr/lib/systemd/system/postfix.service; disabled; vendor pr>
   Active: inactive (dead)
[root@ace zeke]# systemctl start postfix
[root@ace zeke]# systemctl status postfix
● postfix.service - Postfix Mail Transport Agent
   Loaded: loaded (/usr/lib/systemd/system/postfix.service; enabled; vendor pre>
   Active: active (running) since Sat 2020-05-09 21:01:32 JST; 7s ago
  Process: 14689 ExecStop=/usr/sbin/postfix stop (code=exited, status=0/SUCCESS)
  Process: 14709 ExecStart=/usr/sbin/postfix start (code=exited, status=0/SUCCE>
  Process: 14707 ExecStartPre=/usr/libexec/postfix/chroot-update (code=exited, >
  Process: 14703 ExecStartPre=/usr/libexec/postfix/aliasesdb (code=exited, stat>
 Main PID: 14776 (master)
    Tasks: 3 (limit: 12535)
   Memory: 5.1M
   CGroup: /system.slice/postfix.service
           tq14776 /usr/libexec/postfix/master -w
           tq14777 pickup -l -t unix -u
           mq14778 qmgr -l -t unix -u

 5月 09 21:01:32 ace.lo.zeke.ne.jp systemd[1]: Starting Postfix Mail Transport >
 5月 09 21:01:32 ace.lo.zeke.ne.jp postfix/master[14776]: daemon started -- ver>
 5月 09 21:01:32 ace.lo.zeke.ne.jp systemd[1]: Started Postfix Mail Transport A>
[root@ace zeke]#
[root@ace zeke]# systemctl enable postfix
Created symlink /etc/systemd/system/multi-user.target.wants/postfix.service → /usr/lib/systemd/system/postfix.service.
[root@ace zeke]#

とりあえず、デーモンを起動。システム起動時に自動起動もできるようにしておきます。

ステータスをチェックで、エラーも出ていないようですね。

[root@ace zeke]# ss -natup | grep master
tcp     LISTEN    0          50                                0.0.0.0:587                                                        0.0.0.0:*                      users:(("master",pid=14426,fd=21))
tcp     LISTEN    0          50                                0.0.0.0:465                                                        0.0.0.0:*                      users:(("master",pid=14426,fd=25))
tcp     LISTEN    0          50                                0.0.0.0:25                                                         0.0.0.0:*                      users:(("master",pid=14426,fd=16))
tcp     LISTEN    0          50                                   [::]:587                                                           [::]:*                      users:(("master",pid=14426,fd=22))
tcp     LISTEN    0          50                                   [::]:465                                                           [::]:*                      users:(("master",pid=14426,fd=26))
tcp     LISTEN    0          50                                   [::]:25                                                            [::]:*                      users:(("master",pid=14426,fd=17))
[root@ace zeke]#
[root@ace zeke]#

まだ、dovecotが入っていないので、メールの確認ができません。ポートの待受ができていることを確認して、今のところは、良しとします。

DNSサーバの設定追加

こちらのページに解説していますが、DNSサーバのゾーンファイルにMXレコードを入れなくてはいけません。

        IN      A       192.168.1.1
        IN      AAAA    2001:2c0:cd03:ca00::ace
        IN      MX      10      mail.zeke.ne.jp.
;
ns      IN      A       192.168.1.1
        IN      AAAA    2001:2c0:cd03:ca00::ace
        IN      MX      10      mail.zeke.ne.jp.
;
joeker  IN      A       192.168.1.1
        IN      AAAA    2001:2c0:cd03:ca00::ace
        IN      MX      10      mail.zeke.ne.jp.
;
mail    IN      A       192.168.1.1
        IN      AAAA    2001:2c0:cd03:ca00::ace
        IN      MX      10      mail.zeke.ne.jp.
;
www     IN      CNAME   ns
irc     IN      CNAME   ns
ftp     IN      CNAME   ns
redh    IN      CNAME   ns
shoot   IN      CNAME   ns
blog    IN      CNAME   ns
matomo  IN      CNAME   ns
info    IN      CNAME   ns
*.info  IN      CNAME   ns
;
myhome  IN      A       192.168.1.4
        IN      AAAA    2001:2c0:cd03:ca00::4
        IN      MX      10      mail.zeke.ne.jp.
;
ace     IN      A       192.168.1.1
        IN      AAAA    2001:2c0:cd03:ca00::ace
        IN      MX      10      mail.zeke.ne.jp.

Aレコードを持つドメインやホストにMXレコードを入れています。main.cfmydestinationには、こちらのホスト名を列挙しています。

また、メールサーバの動作確認を行うために、dnsサーバ及びメールサーバのIPアドレスを新しいサーバのものに変更しました。

Firewallの設定

以下のようにポートを開きます。

[root@ace zeke]# firewall-cmd --list-all-zones
:
省略
:
japan (active)
  target: default
  icmp-block-inversion: no
  interfaces:
  sources: ::/0 ipset:JAPAN
  services: dns ftp irc ssh
  ports: 5500-5501/tcp
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:


public (active)
  target: default
  icmp-block-inversion: no
  interfaces: enp0s3
  sources:
  services: dns ftp irc
  ports: 5500-5501/tcp
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:


trusted (active)
  target: ACCEPT
  icmp-block-inversion: no
  interfaces:
  sources: 192.168.1.0/24 2001:2c0:cd03:ca00::/64 fe80::/10
  services:
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:
:
省略
:
[root@ace zeke]#
[root@ace zeke]# firewall-cmd --add-service=smtp --zone=public --permanent
success
[root@ace zeke]# firewall-cmd --add-service=smtp --zone=japan --permanent
success
[root@ace zeke]# firewall-cmd --add-service=smtp-submission --zone=japan --permanent
success
[root@ace zeke]# firewall-cmd --add-service=smtps --zone=japan --permanent
success
[root@ace zeke]#
[root@ace zeke]# firewall-cmd --reload
接続断…

あらあら、firewall設定中にsshの通信が切れてしまいました。CentOS7では問題なかったのだけど、まだ不安定みたいですね。

その後、firewall-cmd --reloadコマンドを実行すると、

ERROR:dbus.proxies:Introspect error on :1.8:/org/fedoraproject/FirewallD1: dbus.exceptions.DBusException: org.freedesktop.DBus.Error.NoReply: Did not receive a reply. Possible causes include: the remote application did not send a reply, the message bus security policy blocked the reply, the reply timeout expired, or the network connection was broken.

のようなエラーメッセージが出るようになりました。想像するにipsetのリストが大きいので、再起動に時間がかかりすぎタイムアウトを起こしているのではないかな?

今後、Firewallの設定を変更するときはsystemctl restart firewalldを使うのがいいかもしれません。

しばらく待っていたら、つながるようになったので、確認します。

[root@ace zeke]# firewall-cmd --list-all-zones
:
省略
:
japan (active)
  target: default
  icmp-block-inversion: no
  interfaces:
  sources: ::/0 ipset:JAPAN
  services: dns ftp irc smtp smtp-submission smtps ssh
  ports: 5500-5501/tcp
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:


public (active)
  target: default
  icmp-block-inversion: no
  interfaces: enp0s3
  sources:
  services: dns ftp irc smtp
  ports: 5500-5501/tcp
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:


trusted (active)
  target: ACCEPT
  icmp-block-inversion: no
  interfaces:
  sources: 192.168.1.0/24 2001:2c0:cd03:ca00::/64 fe80::/10
  services:
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:
:
省略
:
[root@ace zeke]#

ポイントは認証が必要なsmtp-submissionとsmtpsを、日本国内からしかつなげないようにしたことです。

220 mail.zeke.ne.jp ESMTP.Postfix

EHLO ADMIN

250-mail.zeke.ne.jp
250-PIPELINING
250-SIZE 10485760
250-ETRN
250-STARTTLS
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN

AUTH LOGIN

530 5.7.0 Must issue a STARTTLS command first

QUIT

現行のメールサーバでsmtp-submissionポートを制限せずに開いていたときの通信内容です。

赤文字が不審者のコマンド、青文字がサーバからの応答です。

明らかに、パスワードをクラックしようとしてますね。STARTTLS必須にしているので、実害はありませんでしたが、このような接続が毎日数千ありました。

認証が必要な人はどこにいるのか特定できるので、範囲を絞って制限をかけることにしました。

ちなみに、smtpポートでも以下のようなログイン試行があります。

220 mail.zeke.ne.jp ESMTP Postfix

EHLO TouL1R

250-mail.zeke.ne.jp
250-PIPELINING
250-SIZE.10485760
250-ETRN
250-STARTTLS
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN

AUTH LOGIN

503 5.5.1 Error: authentication not enabled

smtpポートは認証を許してないので、問題ありません。

Kindle Unlimited入会で無料で読めます!

コメント