วิธีการตั้งค่าให้ Postfix เป็น mail server สำรอง

เราสามารถตั้งค่า Postfix  ให้เป็น mail server สำรอง เพื่อรับอีเมลแทนในกรณีที่ mail server  หลักเกิดปัญหา และเมื่อ mail server หลักสามารถใช้งานได้  mail server สำรองก็จะส่งอีเมลไปที่ mail server  หลัก

สมมติว่าเรามี mail server  หลักชื่อ mail.diary.in.th แล้วเราต้องการเพิ่ม mail server สำรองชื่อ mail2.diary.in.th เพื่อให้รับอีเมลชั่วคราวในระหว่างที่ mail.diary.in.th มีปัญหา

ขั้นแรกต้องเพิ่มค่า MX record ที่ zone file ให้มีค่า mail2.diary.in.th เป็น mail server ที่มีค่า priority มากกว่า mail.diary.in.th

diary.in.th    86400 IN MX 10 mail.diary.in.th.
diary.in.th    86400 IN MX 20 mail2.diary.in.th.

ก่อนบันทึกไฟล์ต้องเพิ่มค่า serial แล้วทำการ reload zone file

ขั้นตอนต่อไปต้องแก้ไขไฟล์ /etc/postfix/main.cf ที่เครื่อง mail server สำรอง (mail2.diary.in.th)

แก้ไขค่า smtpd_recipient_restrictions ให้มีค่า permit_mynetworks และ reject_unauth_destination  เช่น

smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination

แก้ไขค่า relay_domains โดยเพิ่มชื่อโดเมนของเรา เช่น

relay_domains = $mydestination, diary.in.th

แก้ไขค่า relay_recipient_maps ให้เป็นค่าว่าง ๆ เช่น

relay_recipient_maps =

การแก้ไขให้เป็นค่าว่าง ๆ ก็เพื่อความสะดวก ที่เราไม่ต้องเพิ่มอีเมลทุกอีเมลแต่ละอีเมลด้วยตัวเอง  แต่หากต้องการเพิ่มอีเมลแต่ละอีเมลก็สามารถทำได้ เช่น

relay_recipient_maps = hash:/etc/postfix/relay_recipients

โดยในไฟล์ relay_recipients มีรายชื่ออีเมลเช่น

user1@diary.in.th    OK
user2@diary.in.th    OK

หลังจากนั้นใช้คำสั่ง

postmap /etc/postfix/relay_recipients

สิ่งที่ต้องระวังคือค่าเหล่านี้ต้องไม่มีชื่อโดเมน diary.in.th อยู่ด้วย

mydestination
virtual_alias_domains
virtual_mailbox_domains

หลังจากแก้ไขค่าต่าง ๆ แล้วให้ restart posfix โดยใช้คำสั่ง

# systemctl restart postfix

เราสามารถปรับแต่งค่าเพิ่มเติมเพื่อให้ mail server สำรองเก็บอีเมลไว้นานขึ้น โดยตั้งค่า maximal_queue_lifetime ให้นานขึ้น (ค่า default คือ 5 วัน)

maximal_queue_lifetime = 10d

อ่านข้อมูลเพิ่มเติมเกี่ยวกับ maximal_queue_lifetime ได้ที่ http://www.postfix.org/TUNING_README.html#hammer

อ้างอิงและข้อมูลเพิ่มเติมอื่น ๆ :
https://www.howtoforge.com/postfix_backup_mx
https://samhobbs.co.uk/2016/01/mx-backup-postfix-email-server
https://www.cyberciti.biz/faq/postfix-backup-mx-server-anti-spam/

Postfix TLS Support

คำอธิบายจาก http://www.postfix.org/TLS_README.html

“Transport Layer Security (TLS, formerly called SSL) provides certificate-based authentication and encrypted sessions. An encrypted session protects the information that is transmitted with SMTP mail or with SASL authentication.”

ผมได้ทดลองติดตั้งแล้วก็พบว่าใช้งานได้ สำหรับคนใจร้อนให้ scroll เลื่อนลงไปด้านล่างจะพบ Getting started, quick and dirty ครับ

แต่สำหรับคนที่ใช้ CentOS มีคนเขียน tutorial เจ๋งๆ ไว้ที่ http://www.howtoforge.com/perfect_setup_centos_4.4_p5

ผมทดลองดูแล้วก็ไม่มีปัญหา แต่สำหรับคนที่ใช้ คำสั่ง fixup protocal smtp 25 ของ Cisco PIX อาจจะเศร้าหน่อยเพราะทำ TLS เสร็จแล้วอาจไม่ได้ใช้ เพราะคำสั่งนี้อยู่ญาตให้ติดต่อกับ mail server ได้เฉพาะ HELO, MAIL, RCPT, DATA, RSET, NOOP, และ QUIT คำสั่งนอกจากนี้ จะได้รับ response เป็น “500 command unrecognized” ทั้งหมด (อ้างอิง http://www.ciscopress.com/articles/article.asp?p=24685&seqNum=4&rl=1 และ http://www.mnet.state.mn.us/mail/mail-setup-tls.php)

ทดสอบว่า TLS ทำงานหรือเปล่า ให้ลองทำตามนี้ครับ
[root@localhost]# telnet localhost 25
Trying 127.0.0.1…
Connected to localhost.localdomain (127.0.0.1).
Escape character is ‘^]’.
220 localhost ESMTP Postfix
ehlo hostname.com
250-localhost
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-STARTTLS
250-AUTH PLAIN LOGIN
250-AUTH=PLAIN LOGIN
250 8BITMIME
STARTTLS
220 Ready to start TLS

ตัวเข้มคือตัวที่พิมพ์เข้าไป ถ้าเห็น Ready to start TLS ก็ ok แล้วครับ 🙂

Authenticated SMTP สามารถใช้ได้ 3 port คือ 25 (SMTP), 465 (SMTPS) และ 587 (mail message submission).

เอา Postfix มาสู้กับ spammer ไทย

ผมเบื่อพวกสแปมเมลของคนไทยสุดๆ เลยครับ มาทุกวันเรื่องซ้ำๆ เดิมๆ บางที่มาบ่อยมาก เช่น UNSEENForum MGA และ Boston Network ที่จัดสัมนาเรื่องการตลาดอะไรนี่แหละ ลองดูสถิตินะครับ

ในช่วงระยะเวลาประมาณ 1 เดือนที่ผ่านมา มีจำนวนสแปมเมลของไทยที่โดนผมบล๊อกไว้ได้ทั้งหมด 1067 ฉบับ เป็นสแปมของ UNSEENForum เสีย 179 ฉบับ คิดเป็น 16.8% ของสแปมเมลทั้งหมด เป็นสแปมของ MGA เสีย 131 ฉบับ คิดเป็น 12.3% ของสแปมเมลทั้งหมด และ Boston Network อีก 99 ฉบับ คิดเป็น 9.3% ของสแปมเมลทั้งหมด แค่ของ 3 เจ้านี้รวมกันก็เกือบ 40% เข้าไปแล้ว

นอกจากสัมนาแล้วก็มีพวก ทำอย่างไรถึงจะรวย ลดน้ำหนัก และอื่นๆ ที่ลงท้ายว่า “ต้องขออภัยหากอีเมลนี้รบกวนจิตใจท่าน” ซึ่งผมคิดว่าเขาเหล่านี้คงไม่หยุดส่งเป็นแน่แท้

งั้นก็มาลองสู้กันสักตั้ง เพราะตัว Spamassassin เองก็อาจจะมีปัญหากับ spam พวกนี้ อย่ากระนั้นเลยเรากันไม่ให้สแปมพวกนี้เข้ามาตั้งแต่แรกเลยดีกว่า

ใน postfix จะมีไฟล์ main.cf ให้เพิ่มคำสั่งต่อไปนี้ ลองค้นดูก่อนอาจจะมีไว้อยู่แล้วก็ได้
body_checks = regexp:/etc/postfix/maps/body_checks

จากคำสั่งข้างต้นไฟล์ที่เราจะใส่ filter ก็คือคือ body_checks อยู่ที่ /etc/postfix/maps คำสั่ง body_checks จะทำการตรวจสอบเนื้อหาของอีเมลว่ามีคำที่เราระบุไว้หรือไม่

ในไฟล์ body_checks ของผมปัจจุบันได้ใส่ไว้ดังตัวอย่างข้างล่าง คำที่ใส่ไว้ก็คือ คำหลักที่พวกสแปมเมอร์มักจะใส่มาในอีเมล เช่น บางที่จะมี link ให้คลิ๊กไปที่เว็บของตัวเอง
ก็เอาชื่อเว็บนั่นแหละมาใส่เป็นคีย์ที่จะใช้ filter ออกไป ซึ่งตอนนี้ reject พวกสแปมเมลของไทยไปได้เดือนละประมาณ 1,000 – 1,300 ฉบับ ถ้าถามว่าเอา list พวกนี้มาจากไหน คำตอบก็คือผมเพิ่มลงไปแบบ manual นี่แหละ ค่อยๆ เพิ่มไปทีละนิดๆ บางอันอาจจะซ้ำบ้างเพราะไปดูจากหลายอีเมลมารวมกัน ถ้ามีเวลาก็คงจะเขียนเป็น database ขึ้นมา
แต่ตอนนี้อย่าไปเสียเวลากับพวกนี้มากเลย บอกตรงๆ ว่าแค่นี้ก็สะใจแล้วครับ

Continue reading เอา Postfix มาสู้กับ spammer ไทย

Postfix + SMTP AUTH + TLS

เมือคืนผมติดตั้ง TLS โดยทำตาม quick start ตามนี้ ก็ได้ผลดี
http://www.postfix.org/TLS_README.html#quick-start

แต่ที่ยังหาทางทำต่อก็คือ SMTP AUTH ทำได้แล้วแล้วจะมาบันทึกไว้ต่อครับ ขอตัวไปทำอย่างอื่นก่อน

Update: Postfix + Spamassassin + SPF + Greylist

ผม upgrade postfix ใหม่ ทีแรกนึกว่าจะยุ่งยาก แต่ก็แค่
#make
#make upgrade

ทีนี้พอลงใหม่ SPF ที่เคยติดตั้งไว้ก็อันตระธารหายไปด้วย พอดีไปเจอวิธีการติดตั้ง postfix + SpamAssassin + Procmail ที่นี่

Postfix + site-wide SpamAssassin + Procmail for individual ‘spam’ mailboxes.
(http://www.geekly.com/entries/archives/00000155.htm)
วิธีข้างล่างนี้เอามาจากเว็บข้างบนครับ ผมใส่รายละเอียดเพิ่มเติมลงไป

1. Install postfix and get it working for your domain. See http://www.postfix.org for details.

2. Install SpamAssassin. The easiest way to do this is with the command “perl -MCPAN -e ‘install Mail::SpamAssassin'”
Note:
- ต้องสั่ง #export LANG=en_US ก่อน
- ถ้ายังไม่มี CPAN ต้องสั่ง #up2date perl-CPAN

3. As root, create a file at /usr/bin/postfixfilter with the following content:

#!/bin/bash
/usr/bin/spamc | /usr/sbin/sendmail -i "$@"
exit $?

4. Run “chmod 755 /usr/bin/postfixfilter”

5. Create a user called ‘spamfilter’. Make it a complete user, with home directory and shell.

6. Run “chown spamfilter /usr/bin/postfixfilter”

7. In /etc/postfix/master.cf in the “Services” section, alter the ‘smtp’ line as follows (the ” -o con…” SHOULD be on the next line:
Note: ข้อควรระวังก็คือ ให้ระวังว่า spamfilter จะซ้ำกับ filter ที่มีแล้วหรือไม่ ถ้ามีก็ต้องเปลี่ยนเป็นชื่ออื่น เช่น spamfilter_smtp

smtp inet n - n - - smtpd
-o content_filter=spamfilter:

8. In /etc/postfix/master.cf in the “Interfaces to non-Postfix software” section add:
Note: ข้อควรระวังก็คือ ให้ระวังว่า spamfilter จะซ้ำกับ filter ที่มีแล้วหรือไม่ ถ้ามีก็ต้องเปลี่ยนเป็นชื่ออื่น เช่น spamfilter_smtp

spamfilter unix - n n - - pipe
flags=Rq user=spamfilter argv=/usr/bin/postfixfilter -f ${sender} -- ${recipient}

9. Restart postfix and make sure you can still get email. Send a fake spam through the system (from an outside address) to verify that spam is marked as spam. For information on configuring SpamAssassin, go to http://www.spamassassin.org.

10. Install ‘procmail’ if it is not already installed. To discover this try ‘which procmail’.

11. For each user who needs a ‘spam’ mailbox, follow steps 12 – 13. You can safely stop right here if you do not want any users to have their spam filtered into another mailbox.

12. Create a file in their home directory, owned by them, called ‘.procmailrc’. Enter the following into it, making sure that the locations listed are what you wish to use for mailbox location (here we are using /home/$username/mail/ as the location for mail folders:

MAILDIR=$HOME/mail
DEFAULT=$HOME/mail/Inbox
LOGFILE=$HOME/mail/proc.log

# Catch SPAM
:0
* ^X-Spam-Flag: YES
* ^X-Spam-Level: ******
spam

Explanation of the above –

MAILDIR is the location of mailbox folders
DEFAULT is the default mailbox.
“* ^X-Spam-Flag: YES” makes sure the email is marked as spam before doing anything with it.
“* ^X-Spam-Level: ******” make sure the spam received a ‘spam score’ of at least 6 before doing anything with it. This ensures that ‘borderline’ cases that are more likely to be ‘false positives’ (meaning they have been falsely marked as spam) do not go into the spam mailbox.
‘spam’ is the name of the mailbox they are going into.

13. Create a file in their home directory, owned by them, called ‘.forward’. Enter the following into it, changing ‘username’ to their username. Include the quotes and the pound (“#”) symbol!

"|IFS=' ' && exec /usr/bin/procmail || exit 75 #username"

14. As with any change made to user’s mailboxes, test!

15. Keep SpamAssassin updated with the same procedure you used to install it in #2.

หลังจากนั้นก็ติดตั้ง SPF (Sender Policy Framework) โดยอ้างอิงจากที่นี่
Filtering spam with Postfix
(http://www.freesoftwaremagazine.com/free_issues/issue_02/focus_spam_postfix/)

1. แก้ไข master.cf และเพิ่มเข้าไปดังนี้

spfpolicy unix - n n - - spawn user=nobody argv=/usr/bin/perl /usr/local/libexec/postfix/smtpd-policy.pl

2. ไฟล์ smtpd-policy.pl เอามาจากที่นี่ http://spf.pobox.com/postfix-policyd.txt

3. ลองสั่ง perl smtpd-policy.pl อาจจะได้รับข้อความ error ถ้ายังไม่ติดตั้ง SPF::Query
Note: วิธีการติดตั้ง SPF::Query
export LANG=en_US
perl -MCPAN -e 'install Mail::SPF::Query'

4. เพิ่มคำสั่งต่อไปนี้ใน smtpd_recipient_restrictions
check_policy_service unix:private/spfpolicy

5. restart postfix แล้วก็ทดสอบ spoof email address ดูว่า SPF ทำงานหรือไม่

เท่านี้ก็เป็นอันเสร็จ 🙂

ทีนี้ผมลองมาใช้ Greylist จาก Greylisting.org ช่วยสะกัด spam mail อีกชั้นหนึ่ง (http://greylisting.org/implementations/postfix.shtml)
(http://www.postfix.org/SMTPD_POLICY_README.html#greylist)

วิธีติดตั้งก็ตามข้างล่าง

1. ก๊อปปี้ไฟล์ graylist.pl ซึ่งจะมีมาพร้อมกับ source code ของ postfix อยู่แล้ว ไปไว้ที่ /usr/libexec/postfix/
cp postfix-2.2.X/examples/smtpd-policy/greylist.pl /usr/libexec/postfix/

2. แก้ไขไฟล์ greylist.pl
$database_name="/etc/postfix/mta/greylist.db";
$greylist_delay=60;

3. สร้างไดเรกทอรี /etc/postfix/mta แล้ว chown ให้เป็นของ nobody
#mkdir /etc/postfix/mta
#chown nobody.nobody /etc/postfix/mta

4. ทดสอบดูว่า greylist.pl ทำงานได้รึเปล่า โดยใช้คำสั่ง
perl greylist.pl
Note: ถ้าไม่มี DB_File.pm ก็จะต้องทำการติดตั้งก่อน
perl -MCPAN -e 'install DB_File'

5. แก้ไขไฟล์ master.cf เพิ่มคำสั่งต่อไปนี้
greypolicy unix - n n - - spawn user=nobody argv=/usr/bin/perl /usr/libexec/postfix/greylist.pl

6. แก้ไขไฟล์ main.cf เพิ่มคำสั่งต่อไปนี้ใน smtpd_recipient_restrictions
check_policy_service unix:private/greypolicy

7.restart postfix แล้วก็ทดสอบ ดูว่า greylist ทำงานหรือไม่

*ปัญหา greylist กับ gmail.com
หลังจากทดสอบ greylist ไปได้พักหนึ่งผมก็พบว่า gmail.com ใช้ rproxy.gmail.com ซึ่งมีทั้งหมดกว่า 16 IP Address และก็จะสุ่มเปลี่ยนไปเรื่อย ทำให้มีปัญหากับ greylist ที่คอยตรวจสอบ IP Address ในฐานข้อมูลผู้ส่ง ดังนั้นก็เลยต้องให้สิทธิพิเศษ gmail สักหน่อย โดยการเพิ่มคำสั่ง check_sender_access เอาไว้ก่อน greypolicy แต่ให้อยู่หลัง spfpolicy เพื่อให้ผ่าน spfpolicy ก่อน

check_policy_service unix:private/spfpolicy,
check_sender_access hash:/etc/postfix/maps/access_sender,
check_policy_service unix:private/greypolicy

ทีนี้ในไฟล์ access_sender ก็ใส่บรรทัดนี้ลงไป
gmail.com OK

เท่านี้ก็เรียบร้อย

Postfix ป่วน

อันนี้

May 2 23:00:55 edio postfix/smtp[9460]: D2E232AF9F: to=<abc @def.com>, relay=mail.def.com[xxx.xxx.xxx.xxx], delay=6, status=sent (250 Ok, message saved)

กับอันนี้

May 2 23:08:36 edio postfix/smtp[2878]: 11E6D2AF9F: to=<abc @def.com>, relay=mail.def.com[xxx.xxx.xxx.xxx], delay=4, status=sent (250 OK id=1DSdTH-0006so-AO)

ไม่เหมือนกัน เพราะอันแรก ส่งเมล์ออกไปไม่ได้ ส่วนอันที่สองส่งออกไปได้ … ทำไมหนอ?