serverapps:nginx:mailproxy
差分
このページの2つのバージョン間の差分を表示します。
両方とも前のリビジョン前のリビジョン次のリビジョン | 前のリビジョン | ||
serverapps:nginx:mailproxy [2017/07/14 07:01] – [認証:auth.php] hayashi | serverapps:nginx:mailproxy [2023/08/07 04:14] (現在) – [このページについて] hayashi | ||
---|---|---|---|
行 1: | 行 1: | ||
+ | ====== mail_moduleによるMail Proxy ====== | ||
+ | ===== このページについて ===== | ||
+ | |||
+ | Nginxのsmtp proxyは送信用としては利用可能ですが、**自ドメイン宛のメール受信には利用できません**。((つか、してはならない)) | ||
+ | |||
+ | 詳しくはQiitaに書いてみました[[http:// | ||
+ | ===== install ===== | ||
+ | |||
+ | [[serverapps: | ||
+ | |||
+ | なお、以下のオプションをONにしています。 | ||
+ | |||
+ | * MAIL_IMAP | ||
+ | * MAIL_POP3 | ||
+ | * MAIL_SMTP | ||
+ | |||
+ | |||
+ | ===== / | ||
+ | |||
+ | < | ||
+ | mail { | ||
+ | auth_http | ||
+ | proxy on; | ||
+ | proxy_pass_error_message on; | ||
+ | |||
+ | # | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | |||
+ | smtp_capabilities PIPELINING 8BITMIME "SIZE 20480000" | ||
+ | # | ||
+ | # | ||
+ | smtp_auth plain login; | ||
+ | |||
+ | # SMTP | ||
+ | server { | ||
+ | listen | ||
+ | protocol | ||
+ | xclient | ||
+ | auth_http_header PORT 25; | ||
+ | |||
+ | error_log | ||
+ | |||
+ | } | ||
+ | |||
+ | } | ||
+ | </ | ||
+ | |||
+ | ===== 認証:auth.php ===== | ||
+ | <code php> | ||
+ | <?php | ||
+ | |||
+ | // set $env from nginx | ||
+ | $env[' | ||
+ | $env[' | ||
+ | $env[' | ||
+ | $env[' | ||
+ | $env[' | ||
+ | $env[' | ||
+ | $env[' | ||
+ | $env[' | ||
+ | $env[' | ||
+ | // proxy port map | ||
+ | $portmap = array( | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | ); | ||
+ | // protocol map | ||
+ | $protomap = array( | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | ); | ||
+ | // MySQL DB | ||
+ | $dbhost = " | ||
+ | $dbname = " | ||
+ | $dbuser = " | ||
+ | $dbpass = " | ||
+ | $dsn = " | ||
+ | |||
+ | $user = rtrim($env[' | ||
+ | $passwd = rtrim($env[' | ||
+ | $proxyhost = getenv(' | ||
+ | $myaddr = getenv(' | ||
+ | $proxyport = $portmap[$env[' | ||
+ | |||
+ | // DB Access | ||
+ | try { | ||
+ | $pdo = new PDO($DSN, $dbuser, $dbpass, | ||
+ | } catch (PDOException $e) { | ||
+ | $log = ' | ||
+ | openlog(" | ||
+ | syslog(LOG_INFO," | ||
+ | closelog(); | ||
+ | exit($log); | ||
+ | } | ||
+ | |||
+ | $sql=" | ||
+ | $stmt = $pdo-> | ||
+ | $row = $stmt -> fetch(); | ||
+ | $hashpass = $row[" | ||
+ | |||
+ | $cmd = "/ | ||
+ | $result = rtrim(shell_exec($cmd)); | ||
+ | |||
+ | $log = sprintf(' | ||
+ | |||
+ | if ( $result === ' | ||
+ | $log = sprintf(' | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | } else { | ||
+ | $log = sprintf(' | ||
+ | | ||
+ | | ||
+ | } | ||
+ | |||
+ | // write syslog | ||
+ | openlog(" | ||
+ | syslog(LOG_INFO," | ||
+ | closelog(); | ||
+ | |||
+ | ?> | ||
+ | </ | ||
+ | |||
+ | やっていることはシンプルで、Nginxから引き渡されたユーザ名やPasswordを使用してDBのPassと照合、マッチしていれば' | ||
+ | ここでは、DBですがLDAPなどでも流れは一緒です。 | ||
+ | |||
+ | |||
+ | ===== メールの受信 ===== | ||
+ | |||
+ | メールの送信はできましたので、ここで受信側を考えます。\\ | ||
+ | 当然ほかのメールサーバはログインのための情報を持っていませんので、別ポートで認証なしで受信できるよう設定します。\\ | ||
+ | 通常の場合Postfixは認証を経ていなくても、自ドメイン宛のメールについては受け入れるという設定がされています。\\ | ||
+ | しかしながら、今回のケースではNginx経由での接続が**適切な認証を経たものかをPostfix側で知ることはできません**。 | ||
+ | |||
+ | よって、前段で書いた通りPostfixはこの別ポートからの接続を**認証を経たものとして無条件に受け入れます**。\\ | ||
+ | 受信用ポートを通して接続された場合、Postfixは認証を経たものとして無条件に受け入れるため、結果として自ドメイン以外宛のメールであっても受け入れてしまいます。 | ||
+ | |||
+ | **オープンリレー**の出来上がりです。orz\\ | ||
+ | |||
+ | |||
+ | ===== 参考 ===== | ||
+ | |||
+ | [[https:// | ||
+ | |||
+ | [[http:// | ||
+ | |||
+ | [[http:// | ||