メール設定 · 2 min read · Sep 22, 2025

Dovecotのスパム悪用保護をIPアドレスによるメールアカウントへのアクセス制限で改善する(例:ISPConfig 3を使用)

何をするか

このハウツーでは、dovecotとMySQLを使用しているときに、単一のメールアカウントIP制限を追加する方法を示します。

これは、特定の1つのIPまたは数個のIPからのみメールアカウントにアクセスする必要がある場合や、特定のIPアドレスからのメールアカウントへのアクセスをブロックしたい場合(例:スパム悪用のため)に特に便利です。

前提条件

  • MySQLを介して仮想ユーザーを持つ動作するdovecotインストール(ISPConfig 3管理が望ましい)

ISPConfig 3を使用していない場合は、クエリ内のデータベーステーブルおよび/または列名を変更する必要があるかもしれません。

システムへの変更

まず、メールサーバー上に新しいデータベーステーブルを作成する必要があります。このハウツーでは、ISPConfigデータベースdbispconfigに追加します。

MySQLコンソールを開きます:
mysql -u root -D dbispconfig -p

ログインしたら、次のクエリで新しいIP制限テーブルを作成します:

CREATE TABLE mail_user_ip_restriction (
    restriction_id INT(11) UNSIGNED NOT NULL auto_increment,
    mailuser_id INT(11) UNSIGNED NOT NULL DEFAULT '0',
    ip VARCHAR(50) NOT NULL DEFAULT '',
    mode ENUM('w','b') NOT NULL DEFAULT 'w',
    service VARCHAR(10) NOT NULL DEFAULT '',
    PRIMARY KEY (`restriction_id`),
    KEY `ident` (`mailuser_id`, `mode`, `service`, `ip`)
) ENGINE=MyISAM;

次に、dovecotのSQL設定を変更する必要があります。ISPConfig 3のインストール(例:Debian/Ubuntu)では、/etc/dovecot/dovecot-sql.confにあります。

これらの行を変更します:

password_query = SELECT password FROM mail_user WHERE (login = '%u' OR email = '%u') AND disable%Ls = 'n'

user_query = SELECT email as user, maildir as home, CONCAT('maildir:', maildir, '/Maildir') as mail, uid, gid, CONCAT('*:storage=', quota, 'B') AS quota_rule, CONCAT(maildir, '/.sieve') as sieve FROM mail_user WHERE (login = '%u' OR email = '%u') AND `disable%Ls` = 'n'

(ISPConfig 3の最新バージョンを使用していない場合、設定内の行は若干異なる場合があります)

次のように変更します:

password_query = SELECT m.password FROM mail_user as m LEFT JOIN mail_user_ip_restriction as r ON (r.mailuser_id = m.mailuser_id AND r.mode = 'w' AND r.service IN ('', '%Ls')) LEFT JOIN mail_user_ip_restriction as rb ON (rb.mailuser_id = m.mailuser_id AND rb.ip = '%r' AND rb.mode = 'b' AND rb.service IN ('', '%Ls')) WHERE (m.login = '%u' OR m.email = '%u') AND m.disable%Ls = 'n' AND (r.ip IS NULL OR r.ip = '%r') AND rb.ip IS NULL

user_query = SELECT m.email as user, m.maildir as home, CONCAT('maildir:', m.maildir, '/Maildir') as mail, m.uid, m.gid, CONCAT('*:storage=', m.quota, 'B') AS quota_rule, CONCAT(m.maildir, '/.sieve') as sieve FROM mail_user as m LEFT JOIN mail_user_ip_restriction as r ON (r.mailuser_id = m.mailuser_id AND r.mode = 'w' AND r.service IN ('', '%Ls')) LEFT JOIN mail_user_ip_restriction as rb ON (rb.mailuser_id = m.mailuser_id AND rb.ip = '%r' AND rb.mode = 'b' AND rb.service IN ('', '%Ls')) WHERE (m.login = '%u' OR m.email = '%u') AND m.disable%Ls = 'n' AND (r.ip IS NULL OR r.ip = '%r') AND rb.ip IS NULL

次に、dovecotを再起動します:
service dovecot restart(または/etc/init.d/dovecot restart、システムによって異なります)

今、メールおよび/またはシステムログに注意してください!dovecotからエラーが表示された場合、何かがうまくいかなかったので、変更を確認するか、元に戻す必要があります。
すべてが以前と同じように動作している場合は、準備が整いました。

アクセスを制限する方法

これで、メールボックスへのアクセスを制限するためのさまざまな可能性があります。MySQLコンソールでSQLクエリを使用して行う方法を示しますが、もちろんphpMyAdminを使用することもできます。

IPをブロックする

メールアカウントへのアクセスをブロックするには、モード’b’で制限テーブルに追加する必要があります:

まず、メールアカウントのmailuser_idを取得する必要があります(例:[email protected])。これは簡単なSQLクエリです:

SELECT mailuser_id FROM mail_user WHERE email = ‘ [email protected] ‘;

これにより、12345のような番号(ID)が返されます。次に、このIDの制限エントリを追加します:

INSERT INTO mail_user_ip_restriction VALUES (NULL, 12345, ‘123.234.123.234’, ‘b’, ‘’);

このエントリは、IP 123.234.123.234がメールアカウント12345のすべてのサービス(pop3、imap、smtp)にアクセスするのをブロックします。

IPがpopおよびimapにアクセスできるようにし、smtp(メール送信)を使用できないようにするには、代わりにこのエントリを追加できます:

INSERT INTO mail_user_ip_restriction VALUES (NULL, 12345, ‘123.234.123.234’, ‘b’, ‘smtp’);

このようにして、複数のサービスを追加できます。各サービスごとに1つのエントリを作成します。ただし、エントリ’’はすべてのサービスをブロックします。

特定のIPに制限する

ブロックすることができるように、メールアカウントの使用を特定のIPに制限することもできます。これは、指定されたIP以外の他のIPがアカウントにアクセスできないことを意味します。モード’w’のエントリを作成するだけです:

INSERT INTO mail_user_ip_restriction VALUES (NULL, 12345, ‘123.234.123.234’, ‘w’, ‘pop3’);
INSERT INTO mail_user_ip_restriction VALUES (NULL, 12345, ‘123.234.123.235’, ‘w’, ‘smtp’);

このエントリは次のことを行います:

  • すべてのIPがアカウント12345([email protected])のimapを使用できます
  • IP 123.234.123.234のみがこのアカウントのpop3を使用できます - 他のすべてのIPは使用できません!
  • IP 123.234.123.235のみがこのアカウントのsmtpを使用できます - 他のすべてのIPは使用できません!

もちろん、すべての機能を組み合わせて、異なるモードやサービスのために複数のIPエントリを作成できます。

使用例

さて、実際のケースです。あなたのオンラインショップがメールを送信するために使用するメールアドレスがあると想像してください。他の誰もこのアカウントからメールを送信すべきではありませんが、ショップのメールに誰かが返信するかどうかを確認したいと思います。これは、再びpop3ではなくimapによって行われるべきです。

この場合、次のエントリを作成します。10.0.0.101はショップのWebサーバーのIPで、12345はメールアカウントのmailuser_idです。

INSERT INTO mail_user_ip_restriction VALUES (NULL, 12345, ‘10.0.0.101’, ‘w’, ‘smtp’);
INSERT INTO mail_user_ip_restriction VALUES (NULL, 12345, ‘none’, ‘w’, ‘pop3’);

他のIPは10.0.0.101以外はこの特定のメールアカウントのsmtpにアクセスできず、誰もpop3にアクセスできません。imapはすべてのIPに利用可能です。

IPv6を忘れないでください!サーバーまたは指定したいクライアントにIPv4とIPv6の両方のアドレスがある場合は、両方を追加する必要があります!

Share: X/Twitter LinkedIn

新しい投稿を受信箱で受け取る

スパムはありません。いつでも購読を解除できます。