Complete Virtual Mail Server/Postfix additions/ko

From Gentoo Wiki
Jump to: navigation, search
This page is a translated version of the page Complete Virtual Mail Server/Postfix additions and the translation is 94% complete.

Outdated translations are marked like this.
Other languages:
English • ‎русский • ‎日本語 • ‎한국어

도입부

여기서 postfix가 제대로 동작해야 하며, 사용자는 메일 클라이언트 및 웹 메일을 사용할 때 메일을 안전하게 보내고 받는데 문제가 없어야 합니다. postfix 설치를 약간 설정하면 더 우수한 성능을 낼 수 있고, 더 안전해지며, 중복성을 통해 어떤 괴로운 상황에도 직면하지 않습니다.

제출

제출 도입부

메일 보내기는 종종 메일 전송 대리자(MTA)의 25번 포트를 통해 잘못되는 경우가 있습니다. 메일은 실제로 메일 제출 대리자(MSA)의 587번 포트로 처리해야 합니다. Postfix는 MTA와 MSA를 사용합니다. 클라이언트에서 MSA로 전달한 메일을 취하는 동작은 위키피디아에서 볼 수 있는 만큼의 수많은 장점이 있습니다. 그 중에 가장 중요한 점은, 이리저리 돌아다니는 사용자가 방화벽에서 25번 포트를 차단하여도 587번 포트가 열렸을 가능성이 높으므로 이메일을 보낼 수 있습니다. 또한 허가받은 사용자만 전자메일을 보낼 때, 메시지를 내보낼때 동작하는 스팸 필터도 통과할 수 있습니다.

설정

제출 포트는 postfix의 master.cf에서 활성화합니다. 기본적으로 이 옵션을 포함하며 주석처리한 상태입니다:

파일 /etc/postfix/master.cfpostfix로 메일 제출
submission inet n       -       n       -       -       smtpd
 -o smtpd_tls_security_level=may
 -o smtpd_sasl_auth_enable=yes
 -o smtpd_client_restrictions=permit_sasl_authenticated,reject

postfix를 다시 시작한 후, 이 동작을 통해 STARTTLS 기능이 있다는 점을 클라이언트에게 알리지만, 이 기능이 꼭 필요한건 아니며(암호화를 강제하려면 smtpd_tls_security_level=encrypt 옵션을 설정하십시오), 인증한 사용자를 제외한 모든 메일을 거절합니다.

root #/etc/init.d/postfix restart
참고
원한다면 추가 옵션을 설정하고 덮어쓸 수 있습니다.

시험

메일 클라이언트로 시험을 끝낼 수 있으며 smtp 서버 포트는 587번을 사용합니다.

중복

backup-mx 도입부

중복성 기능을 위해 postfix에서 backup mx 기능을 제공합니다. mx 백업 기능은 주 메일 서버가 어떤 문제로든지 응답이 없을 경우 다른 메일 호스트에서 지정 도메인을 대상으로 전자메일을 잡아낼 수 있게 합니다. backup mx 서버는 원본 메일 서버로 메일 전송을 시도합니다. 모든 얘기가 완벽해보이긴 하지만, backup mx가 죽었네요. 스팸이 서버를 죽였습니다. 오늘날 backup mx 의 문제는 스팸 때문에저낮메일을 엉뚱한 대로 전달하고 backup mx 서버를 스팸 차단 목록에 집어넣는 방법으로 마무리합니다.이런 전자메일을 백 스캐터 메일en 이라고 합니다. 두번째 메일 서버를 설정했다면 초기 도메인에 있는 사용자가 이러한 사실을 알고 알 수 없는 사용자를 쳐낼 수 있어야 합니다. 이를 처리하는 단순한 방법은 초기 메일 서버와 두번째 메일 서버의 전체 데이터베이스를 동기화하는 방법입니다. 그러나 경고하건대, backupmx 플래그는 도메인 테이블에 있어야합니다. 두번째 전자메일 서버에서 뒤집어놓아야합니다.

backup-mx 설정

데이터베이스는 이미 백업 도메인을 알고 있습니다. 도메인에 백업 메일 서버가 있다면 backupmx 필드는 domain 테이블에 "1"로 설정합니다. postfix에서 데이터베이스에 연결할 때 연결 정보가 들어있는 파일이 필요합니다:

파일 /etc/postfix/pgsql/relay_domains.cf릴레이 도메인 설정
# relay_domains.cf
user            = postfix
password        = $password
dbname          = postfix
#hosts          = localhost
query           = SELECT description FROM domain WHERE domain='%s' AND backupmx='1' AND active='1';

이 다음 postfix를 설정해야 합니다.

파일 /etc/postfix/main.cf릴레이 도메인용 postfix 수정
# The relay_domains parameter restricts what destinations this system will
# relay mail to.  See the smtpd_recipient_restrictions description in
# postconf(5) for detailed information.
relay_domains = pgsql:/etc/postfix/pgsql/relay_domains.cf

relay_domains를 제대로 사용할 수 있게 하려면:

파일 /etc/postfix/pgsql/relay_recipient_maps.cf릴레이 수신자 설정
# relay_recipient_maps.cf
user            = postfix
password        = $password
dbname          = postfix
#hosts          = localhost
query           = SELECT goto FROM alias WHERE address='%s' AND active='1';

또한 다음 항목도 postfix에 설정해야합니다:

파일 /etc/postfix/main.cf릴레이 수신자용 postfix 수정
# REJECTING UNKNOWN RELAY USERS
#
# The relay_recipient_maps parameter specifies optional lookup tables
# with all addresses in the domains that match $relay_domains.
relay_recipient_maps = pgsql:/etc/postfix/pgsql/relay_recipient_maps.cf

postfix를 다시 시작하고 나면, 메일 서버는 승인 도메인과 승인 사용자에 대해서만 메일을 전달하는 덜 개방된 상태의 릴레이 서버가 됩니다.

경고
{{{1}}}

Quotas

도입부

Quotas는 사용자의 메일함 확인을 도와주는 도구입니다. 쉽게 남용할 수 있기에 이 기능에 의지하면 안됩니다. 이 말은 충분히 상당한 시간동안 잘 동작할 수 있으며, 사용자 개인의 사용 습관에 따라 사용자의 반응을 볼 수 있다는 이야깁니다. IMAP은 용량 제한 보고를 지원하므로 메일 클라이언트에서 사용자에게 상태를 보고할 수 있습니다. 썬더버드의 경우 확장 기능en으로 처리하며 라운드큐브에서는 이 기능이 기본으로 들어있는 것 같습니다.

설정

데이터베이스에서 메일 용량 제한을 지원하긴 하지만, postfix에서는 메일 용량 제한 지원 패치가 필요합니다. vda USE 플래그는 postfix에 대한 패치를 활성화하며 제한 용량 사용을 허용합니다.

우선 데이터베이스에서 데이터를 가져와야합니다:

파일 /etc/postfix/pgsql/virtual_mailbox_limit_maps.cf데이터베이스에 용량 제한 정보 요청
# virtual_alias_maps.cf
user            = postfix
password        = $password
dbname          = postfix
#hosts          = localhost
query           = SELECT quota FROM mailbox WHERE local_part='%u' AND domain='%d' AND active='1';

postfix에서 설정할 항목은 데이터베이스 쿼리문 다음으로 별로 없습니다. 예를 들어 휴지통의 경우, 지정 시간 이후 휴지통을 자동으로 비울 때 제한 용량 등을 계산하면 안됩니다. 이 동작은 courier-imap에서 처리할 수 있습니다.

파일 /etc/postfix/main.cfpostfix에서 용량 제한 기능 사용 설정
# Support for Postfix VDA quotas
virtual_mailbox_limit_maps = pgsql:/etc/postfix/pgsql/virtual_mailbox_limit_maps.cf
virtual_mailbox_limit_inbox = no
virtual_mailbox_limit_override = yes
virtual_maildir_extended = yes
virtual_overquota_bounce = no
# virtual_maildir_limit_message_maps = hash:/etc/postifx/limit_messages
virtual_maildir_limit_message = "Sorry, the recipients mailbox is currently full. Please try again later."
virtual_trash_count = no
virtual_trash_name = ".Trash"
virtual_maildir_filter = no
경고
postgresql 설명서에 따르면 bigint 형식(제한 용량)의 최대값은 9223372036854775807 입니다만, 9223372036854774784 까지면 충분히 활용할 수 있습니다. 그럼에도 불구 8 엑사바이트 이상 필요하다면 0 바이트로 설정하여 제한 용량을 설정하지 않는것이 좋을 수도 있습니다.

VDA 용량 제한을 함께 사용한다면, postfix 내부 메일함 크기 제한을 끄시는게 좋습니다.

파일 /etc/postfix/main.cf허용 메시지 크기 제한 바꾸기
# Disable postfix mailbox size check
mailbox_size_limit = 0

시험

Roundcube 에서는 기본 디스크 사용량을 보여주며 마우스 커서를 가져다놓으면 자세한 내용을 보여줍니다. 썬더버드에는 Display quota 확장 기능이있습니다. 두 가지 경우와 기타의 경우에 대해 실제로 동작하게 하려면 maildirsize 파일이 필요합니다. 이 파일은 postfix가 메시지를 전달하거나 courier-imap 에 변경 사항이 있을 때마다 만들고 바뀝니다. 이 파일은 각 가상 사용자 루트의 메일 디렉터리에 있으며 testuser on example.com 메일 주소를 지닐 경우 /var/vmail/example.com/testuser/maildirsize 디렉터리가 됩니다. 따라서 testuser@example.com 사용자에게 메시지를 보내면 해당 사용자의 메일 디렉터리에 이 파일을 만듭니다.

user $sendmail testuser@example.com
Subject: Testmail to create quota file.
No content!
.
참고
maildirsize 파일을 만들 때 전자메일 메시지를 직접 널리 뿌릴 필요가 없으며, postfixadmin이 만든 환영 메일을 포함하여 상당한 양의 메일이 도달해야합니다. 그럼에도 불구하고 postfixadmin은 이 목적으로 사용할 수 있지만, 메시지를 뿌릴 능력이 없습니다.

HELO 제한

해커, 스패머 등의 악의적인(또는 장난끼를 갖춘) 사용자가 메일 서버에 HELO 또는 EHLO 명령어를 보내 정보를 가져갈 수 있습니다. 스패머는 보통 HELO 인사메시지에 가짜 정보를 올려놓아 서버로의 연결을 제한하거나 끊어놓아 서버에서 그들 자신이 정당한 사용자가 될 수 있음을 입증하는 동작을 처리하지 못하도록 합니다. Postfix에서는 smtpd_helo_restrictions 변수를 제공하여 연결에 어떻게 반응할지 조절할 수 있습니다. 하지만 여기서 제약조건을 거는 조치는 상당한 고민을 해야합니다. 제약을 엄력하게 걸어놓아 서버를 폐쇄적으로 만들면 다른 서버가 허술하게 설정했을 경우 멀쩡한 메시지를 받지 않고 짤라버릴수도 있습니다. 사용 가능한 옵션의 목록은 아래와 같습니다.

smtpd_helo_restrictions 설명
reject_invalid_hostname HELO 인사 메시지가 IP의 DN이 아닐 경우 REJECT
reject_non_fqdn_hostname HELO 인사 메시지가 FQDN이 아니거나 IP일 경우 REJECT
reject_unknown_hostname HELO 호스트 DNS에 A 레코드 또는 MX 레코드가 없는 경우 REJECT
permit_naked_ip_address HELO 인사 메시지가 IP인 경우 PERMIT

다음 테이블에는 메일을 다양한 제약 조건으로 걸러내는 방법을 알려줍니다. X 는 메시지를 걸러냄을 의미하고, ? 는 도메인 DNS 레코드 설정에 따라 다름을 의미하며, O 는 정상적으로 전달함을 의미합니다.

bogus example example.com 192.0.23.58
reject_invalid_hostname X O O O
reject_non_fqdn_hostname X X O O
reject_unknown_hostname X X ? X
참고
참고로 reject_unknown_hostname는 가짜 FQDN만 걸러낼 뿐만 아니라 IP 주소도 걸러냅니다. 여기에 permit_nakid_ip_address를 붙이면 IP 주소만 허용합니다.

제대로 설정한 네트워크에서라면 다음 설정이 안성 맞춤인 상태이며 동작해야합니다:

파일 /etc/postfix/main.cfHELO 제한
# HELO Restrictions
smtpd_helo_restrictions = permit_sasl_authenticated, reject_invalid_hostname, reject_unknown_hostname, reject_non_fqdn_hostname
smtpd_helo_required = yes
경고
자체 서버 또는 자체 메일 클라이언트를 사용할 경우 유효한 호스트 이름 설정을 지니고 있지 않아 메시지 전송에 문제가 있을 수 있으니, 제대로 된 자체 DNS 서버에 자체 호스트 이름을 지정하여 올바른 호스트 이름이 되도록 해야합니다. 자체 서버 또는 클라이언트에 적당한 호스트 이름을 보유하지 않았다면, 안전한 제약 목록은 smtpd_helo_restrictions = permit_naked_ip_address, reject_invalid_hostname이 되겠습니다. 엄격한 관리가 필요하여 적당한 자체 호스트 이름을 부여할 수 없을 경우, 옵션은 mynetworkssmtpd_helo_restrictions = permit_mynetworks, reject_invalid_hostname, reject_unknown_hostname, reject_non_fqdn_hostname 제약 조건을 내걸고 mynetworks 영역을 자체 시스템 또는 자체 네트워크로 확장하는 방안이 있습니다.

로컬 사용자 이름 파밍 거절

보통 postfix나 일반 MTA는 메일함이 있는지 검증을 허용합니다. 이 명령은 예전 메일 서비스에서는 쓸모가 있었을지 모르겠지만 대용량 메일링 리스트를 관리하고 계정이 여전히 유효한지 검색하는 사용자들만 배타적으로 사용했습니다. 이 명령 또한 postfix에서 사용을 막을 수 있습니다.

파일 /etc/postfix/main.cf검증 비활성화
# Do not respond to the VRFY command
disable_vrfy_command = yes

postfix를 다시 시작한 후 port 25로 텔넷을 연결하면 더 이상 250-VRFY 메시지가 나타나지 않습니다.

SMTPD 배너

종종 이의를 제기하는 다른 기능부는 SMTP 헤더입니다. 일부 국가에서는 "NO UCE" (No Unsolicited Commercial E-mail: 원치 않는 광고 전자메일 아님) 인사 메시지를 송신자가 넣어야합니다. 또한 어떤 외부 사용자에게도 어떤 MTA를 사용하고 버전이 무엇인지 알려주지 않는 편이 좋습니다. Postfix는 SMTP 헤더를 조금 쉽게 바꿀 수 있습니다. main.cf의 smtpd_banner 섹션을 찾아보십시오:

파일 /etc/postfix/main.cfSMTPD 배너 내용 바꾸기
# SHOW SOFTWARE VERSION OR NOT
smtpd_banner = $myhostname ESMTP NO UCE
참고
NO UCE 는 기술적인 설명이며, ESMTP는 어떤 설명 전에 있어야합니다.

메시지 크기

몇년동안MTA의 기본 메시지 크기는 10MiB였습니다만, 구글은 지메일 서비스에서 이 메시지당 크기를 20MiB로 로 늘렸습니다. 대역폭이 문제가 아니라면 postfix에서 쉽게 올릴 수 있습니다.

파일 /etc/postfix/main.cf허용 메시지 크기 제한 바꾸기
# Increase maximum message size
message_size_limit = 20971520

Postfix 성능

Biff

호환성 문제 때문에 postfix 로컬 메일 알림을 기본으로 활성화했습니다. 대부분의 사용자에게는 성능이 떨어지게 만드는 기능으로 작용하기 떄문에 어쨌든 biff 명령을 사용할 사용자가 없으므로 안전하게 막을 수 있습니다.

파일 /etc/postfix/main.cfbiff 비활성화
# Disable biff notifications
biff = no

프로세스

postfix 프로그램의 동시 프로세스 수는 50개로 제한했습니다. 첫번째 절충 부하 환경은 데몬을 활성화하는 수만큼 굉장히 빠르게 늘어납니다. 설정 분량은 얼마 되지 않으며 이 설정에 대해 걱정할 필요가 없습니다.

파일 /etc/postfix/main.cfpostfix 프로세스 수 늘리기
# Increase number of allowed processes
default_process_limit = 75
경고
프로세스 양을 늘리기 전 서버에서 추가 부하를 얼마나 처리할 수 있는지 조심스레 시험해보아야 합니다. ps aux 명령과 top 명령이 상당한 도움을 줄 수 있습니다. 각 프로세스에 대한 메모리 사용 백분율은 확인해야합니다. postfix 프로세스 수를 50개로 제한한 상황에서 프로세스 하나당 메모리 사용량이 2% 근접한다면 메모리 사용 제한이 100%로 늘어나는데 메모리 증설이 필요하다는 의미가 됩니다. 결국, 2% * 50 프로세스의 메모리 사용 총합은 가용 메모리를 100% 점유합니다. 서버에서 메모리를 점유하는 다른 프로세스가 또 있다면 postfix에서 사용하는 메모리의 양을 줄여야합니다. 이 이야기는 CPU 사용에도 마찬가지입니다. CPU 가용성이 거의 70% 언저리라면 메일 배달과 postfix가 서버에서 돌아가는 서비스라는 이야기가 되므로 더 빠른 CPU와 분산 설정을 고려해야합니다. 서버에 상당한 CPU 점유 시간을 가진 다른 서비스가 돌아간다면, 해당 서비스를 사용 빈도수가 적은 서버로 다시 배치할 수 있습니다.

DNS 검색

일반적인 처리 제한 요소는 DNS 검색 사용입니다. 동작상 느려질 수 있으며 프로세스, CPU, 메모리에 문제있기 전에 문제요소로 작용할 수 있습니다. 최소한 메시지 하나마다 검색 동작이 필요하기 때문에, 서버 MX 레코드를 찾아야 합니다. 로컬 캐싱 DNS 서버는 이 시점에 엄청난 도움을 줄 수 있으므로 net-dns/dnsmasq 또는 net-dns/bind을 완벽하게 설정해합니다.

메일 저장소

postfix는 /var/spool/postfix 디렉터리에 수많은 큐 디렉터리를 관리합니다. 다양한 postfix 프로그램은 큐를 사용하여 상호간 메시지를 전달합니다. 이 디렉터리를 다른 디스크, 레이드 배열 저장소, SSD에 놓으면 전체 처리량을 엄청나게 개선할 수 있습니다. 또한 의문의 디스크 공간에 대해 noatime 옵션을 표시해두면 디스크 접근 성능에 도움을 줍니다. postfix는 타임스탬프 기반 접근 방식을 사용하지 않습니다.

다중 메일 서버

한대로 부족하다면 여러대로 부하를 분산할 수 있습니다. 여러대의 메일 서버는 중복성이 있으므로 고려할만한 가치가 있습니다. 부하를 여러 대의 메일 서버로 분산은 DNS 라운드 로빈으로 효율적으로 처리할 수 있습니다. 선택지가 두개가 있는데 다중 A 엔트리를 메일 서버 또는 클리너에 할당하는 방법이고, 다른 하나는 우선순위에 따라 다중 MX 엔트리를 부여하는 방법입니다.