MySQLデータベースにあるユーザーのメールを受信し、POP3を介してそれらのメッセージをダウンロードできるメールサーバーがあります。これはすべて正常に機能しています。私のPostFixバージョンはUbuntuServer10.04の2.7.0です。
問題はメールの送信です。いくつかの問題があります:
1.
サーバーはポート25でリッスンしますが、ISPは25をブロックするため、リッスンポートを追加する必要があります。これは465または587である必要がありますか?または両方?安全なSMTP用にポートを追加するにはどうすればよいですか?
認証なしで25のすべての接続を受け入れる必要がありますが、システム上の有効な受信者/ドメインのメールのみを受け入れ、リレーをブロックします。これは現在機能しています。
ポート587または465は、任意のアドレス/ドメインへのリレーを許可する必要がありますが、認証を行う有効なユーザーに対してのみ許可されます。
私のmaster.cfファイルの先頭は次のとおりです。
smtp inet n - - - - smtpd
#submission inet n - - - - smtpd
# -o smtpd_tls_security_level=encrypt
# -o smtpd_sasl_auth_enable=yes
# -o smtpd_client_restrictions=permit_sasl_authenticated,reject
# -o milter_macro_daemon_name=ORIGINATING
#smtps inet n - - - - smtpd
# -o smtpd_tls_wrappermode=yes
# -o smtpd_sasl_auth_enable=yes
# -o smtpd_client_restrictions=permit_sasl_authenticated,reject
# -o milter_macro_daemon_name=ORIGINATING
これらの行の1つをコメント解除できると思いますが、どの行またはどのオプションのコメントを解除するかわかりません。
また、SMTPに拒否制限がないのはなぜですか?ポート25で常にすべてを受け入れ、後でそれらを保持するかどうかを決定するためですか?ポート25に着信するが、ここに有効なドメインがないメッセージはどこに送信されますか?私たちがサービスを提供しているドメインのキャッチオールがあります。彼らは彼らを跳ね返らせるだろうか?バウンスはスパマーのように見える可能性があるため、バウンスが悪かったと読みました。
2.
私のユーザーはすでに受信メール用のMySQLデータベースにあり、送信メッセージを許可するためにこれと同じデータベースを使用したいと思います。
main.cfは次のようになります。
smtpd_banner = $myhostname ESMTP $mail_name
biff = no
append_dot_mydomain = no
readme_directory = no
# TLS parameters
smtpd_sasl_auth_enable = yes
broken_sasl_auth_clients = yes
smtpd_sasl_authenticated_header = yes
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
smtpd_use_tls = yes
smtpd_tls_cert_file = /etc/ssl/certs/mail.crt
smtpd_tls_key_file = /etc/ssl/private/mail.key.insecure
myhostname = mysite.com
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
mydestination =
relayhost =
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
virtual_alias_domains =
virtual_alias_maps = proxy:mysql:/etc/postfix/mysql-forwards.cf, mysql:/etc/postfix/mysql-email.cf
virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql-domains.cf
virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql-mailboxes.cf
virtual_mailbox_base = /home/vmail
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000
proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_can$
既存のユーザーデータベースから送信者を認証するようにするにはどうすればよいですか?
3.
現在、PHPのmail()コマンドによって作成されたこのサーバーからのメールは、有効なユーザーのmysqlデータベースにあるユーザーにのみ配信されています。どこのユーザーにもメールを送信できるようにするには、PHPが必要です。SMTPで認証できるようにPHPを設定する必要がありますか?
更新:
Master.cfを次のように変更し、ファイアウォールで587を開きました。
smtp inet n - - - - smtpd
submission inet n - - - - smtpd
-o smtpd_tls_security_level=encrypt
-o smtpd_sasl_auth_enable=yes
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
今、私は587でtelnetできません:
telnet xxx.xxx.xxx.xx 587
Trying xxx.xxx.xxx.xx...
Connected to xxx.xxx.xxx.xx.
Escape character is '^]'.
220 mydomain.com ESMTP Postfix
EHLO you
250-mydomain.com
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-STARTTLS
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
MAIL FROM: <[email protected]>
530 5.7.0 Must issue a STARTTLS command first
STARTTLS
220 2.0.0 Ready to start TLS
OK、それで私は良いTLSを使わなければなりません、しかしTLSが実行されたらさらにテストする方法がわかりませんか?
ポート25でEHLOを実行すると、次のようになります。
250-STARTTLS
250-AUTH LOGIN PLAIN
250-AUTH=LOGIN PLAIN
ユーザーがクリアテキストのパスワードを送信できないようにしたいのですが、プレーンログインを無効にできますか?
更新2:
私の元の/etc/postfix/sasl/smtpd.conf:
pwcheck_method: saslauthd
allow_plaintext: true
auxprop_plugin: mysql
sql_hostnames: 127.0.0.1
sql_user: mailusr
sql_passwd: secret
sql_database: mail
sql_select: select password from users where email = '%u'
上記は、認証を試みるときにこれを行います。
Feb 27 09:40:00 MyHOSTNAME postfix/smtpd[27274]: < c-65-34-234-133.hsd1.fl.comcast.net[65.34.xxx.xxx]: dGVzdEBhcsEZ2Vdci1jb20=
Feb 27 09:40:00 MyHOSTNAME postfix/smtpd[27274]: xsasl_cyrus_server_next: decoded response: [email protected]
Feb 27 09:40:00 MyHOSTNAME postfix/smtpd[27274]: xsasl_cyrus_server_auth_response: uncoded server challenge: Password:
Feb 27 09:40:00 MyHOSTNAME postfix/smtpd[27274]: > c-65-34-234-133.hsd1.fl.comcast.net[65.34.xxx.xxx]: 334 UGFzc3dvcmQ6
Feb 27 09:40:20 MyHOSTNAME postfix/smtpd[27274]: < c-65-34-234-133.hsd1.fl.comcast.net[65.34.xxx.xxx]: dGVzdGluZw==
Feb 27 09:40:20 MyHOSTNAME postfix/smtpd[27274]: xsasl_cyrus_server_next: decoded response: testing
Feb 27 09:40:20 MyHOSTNAME postfix/smtpd[27274]: warning: c-65-34-234-133.hsd1.fl.comcast.net[65.34.xxx.xxx]: SASL LOGIN authentication failed: authentication failure
Feb 27 09:40:20 MyHOSTNAME postfix/smtpd[27274]: > c-65-34-234-133.hsd1.fl.comcast.net[65.34.xxx.xxx]: 535 5.7.8 Error: authentication failed: authentication failure
また、提案された this チュートリアルに基づいて、ファイルを次のように変更してみました。
pwcheck_method: authdaemond
mech_list: PLAIN LOGIN
authdaemond_path: courier-authdaemon-socket
しかし、ガイドの最後のステップでハードリンクを作成できませんでした。
ln /var/run/courier/authdaemon/socket courier-authdaemon-socket
/ var/runは別のパーティションにあるためです。代わりにソフトリンクを作成しましたが、それでも認証に失敗しました。 MySQLの最初の例の方が正しいように思われます。
1)
smtpdを代替ポートでリッスンさせるには、master.cfを変更して既存のsmtpdエントリをコピーし、最初のフィールドをsmtp
から587
またはリッスンしたいポートに変更します。オン。ポート465を使用する場合は、smtps
エントリのコメントを解除します。このポートで暗号化されていないsmtpを使用すると、メールクライアントで混乱や問題が発生する可能性があるためお勧めしません(465はsslポートとして指定されているため)。
認証を有効にするために探しているオプションは、smtpd_sasl_auth_enable=yes
とsmtpd_recipient_restrictions=permit_sasl_authenticated
です(すでに持っているので、構成する必要があります)。 main.cfにこれらの設定があるため、すべてのポートで有効になっています。 25以外のポートでのみ許可する理由はありません。メールが認証されていない状態で送信された場合、ローカル配信でのみ受け入れられます。認証されたものであれば、どこにでも行くことができます。
「SMTPに拒否制限がないのはなぜですか?」とはどういう意味かわかりません。
2)
認証にはSASLを使用する必要があります。したがって、認証は、postfixが通信する外部サービスによって提供されます。既存のMySQLデータベースを引き続き使用できます。使用するには、SASLサービスを構成する必要があります。 CyrusSASLはpostfixのデフォルトプロバイダーです。詳細は読むことができます ここ 。
3)
すでにsmtpd_recipient_restrictions = permit_mynetworks
とmynetworks = 127.0.0.0/8
があるので、PHPを含め、localhostからのすべてが受け入れられます。
[〜#〜]注[〜#〜]smtpd_recipient_restrictions
で使用可能なすべてのオプションを確認することをお勧めします。これをここで提供される値に設定するだけで、他に何も望ましくない動作を引き起こす可能性があります。私が言及したすべての設定で postconf man page を読んで、実装する前にそれらが何をしているのかを理解できるようにします。