postfix 被當作垃圾郵件中轉站


磁盤 io 總是滿的狀態 

 該服務器只有監控和郵件elk在上面。

發現郵件日志 瘋狂的輸出

tail -f /var/log/maillog

大致都是來自於 yahoo.com.tw的東西

清空了 /var/spool/postfix/incoming active bounce defer deferred    看情況而定

 類似於這種格式

Jun 19 19:16:37  postfix/error[39976]: 12A9BD00AFD: to=<b9081135@yahoo.com.tw>, relay=none, delay=9.5, delays=8.3/0.01/0/1.3, dsn=4.4.2, status=deferred (delivery temporarily suspended: lost connection with mx-tw.mail.gm0.yahoodns.net[27.123.206.55] while sending RCPT TO)
Jun 19 19:16:37 postfix/error[39976]: 12A9BD00AFD: to=<baller0819@yahoo.com.tw>, relay=none, delay=9.6, delays=8.3/0.01/0/1.3, dsn=4.4.2, status=deferred (delivery temporarily suspended: lost connection with mx-tw.mail.gm0.yahoodns.net[27.123.206.55] while sending RCPT TO)
Jun 19 19:16:37  postfix/error[39976]: 12A9BD00AFD: to=<belonguandme@yahoo.com.tw>, relay=none, delay=9.6, delays=8.3/0.01/0/1.3, dsn=4.4.2, status=deferred (delivery temporarily suspended: lost connection with mx-tw.mail.gm0.yahoodns.net[27.123.206.55] while sending RCPT TO)
Jun 19 19:16:41  postfix/cleanup[40133]: 8CDDCD00AFF: message-id=<HMVJLNPHPPGQZMQGTTADBOUMA@163.com>
Jun 19 19:16:41 jxq-c2-16-2 postfix/qmgr[24909]: 8CDDCD00AFF: from=<qqnvuolu@163.com>, size=2830, nrcpt=30 (queue active)
Jun 19 19:16:41  postfix/error[39978]: 8CDDCD00AFF: to=<0930264825@yahoo.com.tw>, relay=none, delay=9.1, delays=9.1/0.01/0/0.02, dsn=4.4.2, status=deferred (delivery temporarily suspended: lost connection with mx-tw.mail.gm0.yahoodns.net[27.123.206.55] while sending RCPT TO)

 

最后在 postfix的main.cf 修改並添加了一些東西,修改的為:

第一個需要修改的參數是myhostname,指向真正的域名,例如:

myhostname = mail.example.com
mydomain參數指向根域:

mydomain = example.com
myorigin和mydestination都可以指向mydomain:

myorigin = $mydomain
mydestination = $mydomain
Postfix默認只監聽本地地址,如果要與外界通信,就需要監聽網卡的所有IP:

inet_interfaces = all
Postfix默認將子網內的機器設置為可信任機器,如果只信任本機,就設置為host:

mynetworks_style = host
配置哪些地址的郵件能夠被Postfix轉發,當然是mydomain的才能轉發,否則其他人都可以用這台郵件服務器轉發垃圾郵件了:

relay_domains = $mydomain


現在,Postfix已經基本配置完成,我們需要對郵件的發送進行控制:

  • 對於外域到本域的郵件,必須接收,否則,收不到任何來自外部的郵件;
  • 對於本域到外域的郵件,只允許從本機發出,否則,其他人通過偽造本域地址就可以向外域發信;
  • 對於外域到外域的郵件,直接拒絕,否則我們的郵件服務器就是Open Relay,將被視為垃圾郵件服務器。

先設置發件人的規則:

smtpd_sender_restrictions = permit_mynetworks, check_sender_access hash:/etc/postfix/sender_access, permit 

以上規則先判斷是否是本域地址,如果是,允許,然后再從sender_access文件里檢查發件人是否存在,拒絕存在的發件人,最后允許其他發件人。

然后設置收件人規則:

smtpd_recipient_restrictions = permit_mynetworks, check_recipient_access hash:/etc/postfix/recipient_access, reject 

以上規則先判斷是否是本域地址,如果是,允許,然后再從recipient_access文件里檢查收件人是否存在,允許存在的收件人,最后拒絕其他收件人。

/etc/postfix/sender_access的內容:

example.com REJECT

目的是防止其他用戶從外部以xxx@example.com身份發送郵件,但登錄到本機再發送則不受影響,因為第一條規則permit_mynetworks允許本機登錄用戶發送郵件。

/etc/postfix/recipient_access的內容:

postmaster@example.com OK webmaster@example.com OK 

因此,外域只能發送給以上兩個Email地址,其他任何地址都將被拒絕。但本機到本機發送不受影響。

最后用postmap生成hash格式的文件:

# postmap sender_access # postmap recipient_access 

啟動Postfix:

# /etc/init.d/postfix start


 

參考http://www.liaoxuefeng.com/article/00137387674890099a71c0400504765b89a5fac65728976000

smtpd_sender_restrictions = permit_mynetworks, check_sender_access hash:/etc/postfix/sender_access, permit
smtpd_recipient_restrictions = permit_mynetworks, check_recipient_access hash:/etc/postfix/recipient_access, reject


non_fqdn_reject_code = 450
#unknown_local_recipient_reject_code = 550
#unknown_local_recipient_reject_code = 450
unknown_virtual_alias_reject_code = 450
unknown_virtual_mailbox_reject_code = 450
maps_rbl_reject_code = 450

定義sender和recipient_access

[root@ log]# cat /etc/postfix/sender_access
yahoo.com.tw    REJECT
yahoo.com.jp    REJECT
yahoo.co.jp     REJECT
163.com         REJECT
yandex.ru       REJECT
physiciansnews.com REJECT
keekoo.com REJECT
orifegypt.com  REJECT
sperinde.com REJECT
keylessremotewarehouse.com REJECT
[root@ log]# cat /etc/postfix/recipient_access
noreply@playyx.com  OK
yahoo.com.tw    REJECT
yahoo.com.jp    REJECT
yahoo.co.jp     REJECT
163.com         REJECT
yandex.ru       REJECT
physiciansnews.com REJECT
keekoo.com REJECT
orifegypt.com  REJECT
sperinde.com REJECT
keylessremotewarehouse.com REJECT  

然后執行 postmap

# postmap sender_access
# postmap recipient_access

重啟postfix

以上步驟做完發現日志內的這些郵件已經拒絕了,但是日志還是搜搜的打印,格式如下

Jun 20 14:18:45  postfix/smtpd[31120]: NOQUEUE: reject: RCPT from unknown[121.22.69.214]: 554 5.7.1 <eoyhscpr@163.com>: Sender address rejected: Access denied; from=<eoyhscpr@163.com> to=<thankupbig@yahoo.com.tw> proto=SMTP helo=<>
Jun 20 14:18:52  postfix/smtpd[31120]: NOQUEUE: reject: RCPT from unknown[121.22.69.214]: 554 5.7.1 <eoyhscpr@163.com>: Sender address rejected: Access denied; from=<eoyhscpr@163.com> to=<tel331699@yahoo.com.tw> proto=SMTP helo=<>
Jun 20 14:18:54 postfix/smtpd[31120]: NOQUEUE: reject: RCPT from unknown[121.22.69.214]: 554 5.7.1 <eoyhscpr@163.com>: Sender address rejected: Access denied; from=<eoyhscpr@163.com> to=<wangsir1357@yahoo.com.tw> proto=SMTP helo=<>
Jun 20 14:19:05  postfix/smtpd[31120]: NOQUEUE: reject: RCPT from unknown[121.22.69.214]: 554 5.7.1 <eoyhscpr@163.com>: Sender address rejected: Access denied; from=<eoyhscpr@163.com> to=<ttuu01@yahoo.com.tw> proto=SMTP helo=<>

於是開啟了防火牆

默認 允許所有

drop掉這些IP 參考http://blog.csdn.net/langeldep/article/details/38704291

用  gcc   -g -o dyn  dyn.c    , 編譯后生成了可執行文件   dyn

 

我的dyn可執行文件在  /root 目錄, 所以用 命令:

nohup   tail  -f   /var/log/maillog  |  /root/dyn  &

讓它自己跑吧。

過一段時間后, 我們再看maillog日志,  已經基本沒有 不認識的IP地址再連接過來發郵件了。

#include <string.h>  
#include <stdio.h>  
#include <stdlib.h>  
#define BUF_LEN   4096  
#define DATA_LEN  4096*10  
  
int  main (int argc, char** argv)  
{  
    //too many errors after RCPT from 36-224-128-99.dynamic-ip.hinet.net[36.224.128.99]  
    //too many errors after RCPT from 118-169-22-28.dynamic.hinet.net[118.169.22.28]  
    //too many errors after AUTH from unknown[79.125.161.236]  
  
        char buf[BUF_LEN] = {0};  
    const char* sep = "too many errors after";  
      
    while (1)  
    {  
        memset (buf, 0, sizeof(buf));  
        char* tp = fgets (buf, sizeof(buf)-1, stdin);  
        if (tp != NULL)  
        {  
            int buflen = strlen(tp);  
            char* p = strstr(buf, sep);  
            if (p != NULL)  
            {  
                char* p1 = p + strlen(sep) + 1;  
                char* ps = NULL;  
                char* pe = NULL;  
                while (*p1 != '\0' && *p1 != '\n')  
                {  
                    if (*p1 == '[')  
                        ps = p1+1;  
                    if (*p1 == ']')  
                        pe = p1;  
                    p1++;  
                }  
                  
                if (ps != NULL && pe != NULL)  
                {  
                    char ipbuf[64]={0};  
                    memcpy (ipbuf, ps, pe-ps);  
                    char ebuf[512] = {0};  
                    snprintf(ebuf, sizeof(ebuf)-1, "iptables -I INPUT -s %s -j DROP", ipbuf);  
                    system (ebuf);  
                    printf ("%s\n", ebuf);  
                }  
  
            }  
        }  
  
    }  
      
    return 0;  
}  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM