検証やローカル環境で送信メールサーバーを構築するのは結構めんどくさい作業となります。
DockerではPostfixのコンテナを簡単に実施することができ、動かすことができるので手順をメモしておきます。
事前にDockerのインストールは必要となるので以下のページを参照してください。
今回の環境は以下となります。
[root@mail ~]# cat /etc/redhat-release CentOS Linux release 8.3.2011
「Docker」Postfix(catatnight/postfix)コンテナ起動~動作確認まで
今回構築するPostfixのコンテナは、Docker公式ページの「catatnight/postfix」を利用します。
参照先URL:
「docker hub」catatnight/postfix
手順は簡単で、イメージをダウンロードして、コンテナを起動するだけでPostfixが動作します。
私は構築までに1分もかからなかったです。
「catatnight/postfix」イメージをダウンロード
「docker pull」コマンドで「catatnight/postfix」をダウンロードします。
[root@mail ~]# docker pull catatnight/postfix
以下コマンドで「catatnight/postfix」がダウンロードされていることが確認できます。
[root@mail ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE catatnight/postfix latest d7c7642e8ae7 6 years ago 257MB
「catatnight/postfix」コンテナ起動
コンテナ起動は公式ページの記述そのままで実行してみます。
[root@mail ~]# sudo docker run -p 25:25 -e maildomain=mail.example.com -e smtp_user=user:pwd --name postfix -d catatnight/postfix
ローカル、検証環境に合わせて以下を変更してください。
以下は例として、公式の設定そのままで記述しています。
- ドメイン名:mail.example.com
- ユーザー名:user
- パスワード:pwd
正常にコンテナが起動すると以下のコマンドで確認ができます。
「STATUS」がUPになっていることが確認できます。
[root@mail ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6b998d88b8c2 catatnight/postfix "/bin/sh -c '/opt/in…" 24 hours ago Up 20 hours 0.0.0.0:25->25/tcp postfix
「Postfix」SMTPの動作確認で「Relay access denied」のエラーが発生する
正常に起動したらtelnetコマンドを用いて動作確認を実施します。
以下ではコンテナを立ち上げたばかりの状態で「SMTP」のテストを行ったときのログですが、宛先メールアドレスを指名した際に「Relay access denied」のエラーが発生し、正常に動作しません。
[root@mail ~]# telnet localhost smtp Trying ::1... telnet: connect to address ::1: Connection refused Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. 220 mail.example.com ESMTP Postfix (Ubuntu) mail from:test@gmail.com 250 2.1.0 Ok rcpt to:test1@test.co.jp 454 4.7.1 <test1@test.co.jp>: Relay access denied quit 221 2.0.0 Bye Connection closed
「Relay access denied」のエラー解消方法:原因はコンテナ内の通信でIPアドレスを許可してないため
「Relay access denied」のエラーが発生する原因は、Postfixに問合せするIPアドレスが許可されていないからです。
エラー確認のため、コンテナへアクセスします。
[root@mail ~]# docker exec -it postfix /bin/bash root@6b998d88b8c2:/#
メールログを確認し、エラーの内容を確認します。
172.17.0.1のアドレスから問い合わせが来ているようですが、Postfixでは知らないIPアドレスから来ているので拒否しているようです。
root@6b998d88b8c2:/# tail -100 /var/log/mail.log Mar 1 08:34:54 6b998d88b8c2 postfix/smtpd[87]: connect from unknown[172.17.0.1] Mar 1 08:35:13 6b998d88b8c2 postfix/smtpd[87]: NOQUEUE: reject: RCPT from unknown[172.17.0.1]: 454 4.7.1 <test1@test.co.jp>: Relay access denied; from=<test@gmail.com> to=<test1@test.co.jp> proto=SMTP Mar 1 08:35:23 6b998d88b8c2 postfix/smtpd[87]: disconnect from unknown[172.17.0.1] Mar 1 08:37:41 6b998d88b8c2 postfix/master[72]: reload -- version 2.11.0, configuration /etc/postfix Mar 1 08:37:41 6b998d88b8c2 postfix/anvil[89]: statistics: max connection rate 1/60s for (smtp:172.17.0.1) at Mar 1 08:31:29 Mar 1 08:37:41 6b998d88b8c2 postfix/anvil[89]: statistics: max connection count 1 for (smtp:172.17.0.1) at Mar 1 08:31:29 Mar 1 08:37:41 6b998d88b8c2 postfix/anvil[89]: statistics: max cache size 1 at Mar 1 08:31:29 Mar 1 08:37:47 6b998d88b8c2 postfix/smtpd[146]: connect from unknown[172.17.0.1]
コンテナ内でルートを確認するとデフォルトGWのIPアドレスが「172.17.0.1」となっていました。
CentOS8環境下でlocalhostを指定してSMTPの問い合わせをすることで、コンテナ内のPostfixへIPアドレス172.17.0.1へ返還されて問い合わせをしているようです。
- CentOS8セグメント:192.168.0.1
- コンテナGW:172.17.0.1
- コンテナPostfix:172.17.0.1
PostfixのIPアドレス(172.17.0.2)
root@6b998d88b8c2:/# ip addr show 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever 5: eth0@if6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0 valid_lft forever preferred_lft forever
PostfixのデフォルトGW(172.17.0.1)
root@6b998d88b8c2:/# route Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface default 172.17.0.1 0.0.0.0 UG 0 0 0 eth0 172.17.0.0 * 255.255.0.0 U 0 0 0 eth0
実際にコンテナのPostfixへのアクセスは以下の流れになるようです。
localhost(192.168.0.1)
↓
172.17.0.1(コンテナGW)※NAT
↓
172.17.0.2(Postfix)
Postfixへの問い合わせは「172.17.0.1」からくるので、このIPアドレスのアクセスを許可させます。
PostfixへアクセスするIPアドレスを許可
PostfixへアクセスするIPアドレスの許可は「main.cf」で実施します。
「mynetworks」へ許可するIPアドレス、「smtpd_recipient_restrictions」へ「permit_mynetworks」を追加します。
root@6b998d88b8c2:/# vi /etc/postfix/main.cf # 172.17.0.1を追加 mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128, 172.17.0.1 # 「permit_mynetworks」を追加 smtpd_recipient_restrictions = permit_mynetworks,permit_sasl_authenticated,reject_unauth_destination
上記設定後、サービスを再起動します。
root@6b998d88b8c2:/# service postfix reload * Reloading Postfix configuration... [ OK ]
Postfix「main.cf」編集後に再度SMTP確認
上記で設定、サービス再起動後、コンテナから抜け再度SMTPの動作確認をします。
[root@mail ~]# telnet localhost smtp Trying ::1... telnet: connect to address ::1: Connection refused Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. 220 mail.example.com ESMTP Postfix (Ubuntu) mail from:test@gmail.com 250 2.1.0 Ok rcpt to:test1@test.co.jp 250 2.1.5 Ok data 354 End data with <CR><LF>.<CR><LF> mail test docker-postfix . 250 2.0.0 Ok: queued as 3177340A98D7 quit 221 2.0.0 Bye Connection closed by foreign host.
SMTPの動作確認が問題なく動いたことが確認できました。
Docker(Postfix)は簡単に構築できるのでぜひ参考にしてください。
Dockerを構築するならVPSがおすすめです。
エンジニアのオンライン学習
ITエンジニアにおすすめの教材、オンラインスクールです。
無料からエンジニアの学習ができる教材などまとめているので参考にしてください。
おすすめオンライン教材 | |
自宅で学習ができるオンラインスクール | |
ITエンジニアの開発・検証・学習としてインターネット上で専用のサーバ(VPS)を利用しましょう!
実務経験はVPSで学べます。
コメントを残す