FreeBSD 11로 자신 만의 메일 서버 만들기

자신의 이메일 서버를 운영하는 것은 매우 보람이있을 수 있습니다. 귀하는 귀하의 데이터를 담당합니다. 또한 배송 옵션을보다 유연하게 사용할 수 있습니다. 그러나 몇 가지 과제가 있습니다. 서버가 취약성에 노출 될 위험이 있으며 서버가 스패머가 사용할 수있는 잠재적 인 릴레이가 될 수도 있습니다.

그 방법으로 우리 자신의 메일 서버를 실행 해 봅시다.

개요

FreeBSD 기본 시스템에 포함되어 있지 않은 세 가지 필수 소프트웨어가 설치됩니다.

  • OpenSMTPd
  • 비둘기장
  • 스팸

OpenSMTPd는 MTA (Mail Transfer Agent) 및 MDA (Mail Delivery Agent)입니다. 즉, SMTP프로토콜을 통해 다른 메일 서버와 통신 할 수 있으며 개별 사용자의 사서함으로 메일 배달을 처리합니다. OpenSMTPd를 설정하여 외부 서버와 통신하고 (spamd를 통해 필터링 함) 로컬 사용자에게 메일을 전달할뿐만 아니라 로컬 메일을 사용자에게 전달할 수 있습니다.

Dovecot은 로컬 사서함을 읽고 IMAP 또는 POP3를 통해 사용자에게 제공하는 MDA입니다. 이 콘텐츠를 제공하기 위해 로컬 사용자의 사서함을 사용합니다.

Spamd는 메일 필터링 서비스입니다. spamd를 통해 메일을 전달할 수 있으며 다양한 블랙리스트, 화이트리스트 및 그레이리스트를 기반으로 메일을 필터링합니다.

이 메일 서버에 대한 일반적인 아이디어에는 몇 가지 경로가 필요합니다.

Outside world -> Firewall -> spamd -> OpenSMTPD -> User mail boxes
Outside world -> Firewall (spamd-whitelist) -> OpenSMTPD -> User mailboxes
Outside world -> Firewall (IMAP/POP3) -> Dovecot
Outside world -> Firewall (SMTPD submission)

이 튜토리얼에서는 방화벽에 FreeBSD 버전의 OpenBSD PF를 사용합니다. ipfw구성이 매우 유사한을 사용할 수도 있습니다 .

참고 : Vultr은 기본적으로 포트 25를 차단합니다. 포트 25는 모든 곳에서 SMTP 서버가 사용합니다. 모든 기능을 갖춘 전자 메일 서버를 실행하려면 해당 포트를 열어야합니다.

초기 설정

먼저 필요한 프로그램을 설치해야합니다.

sudo 액세스가 설정된 사용자로 실행 중이라고 가정하면 다음 명령을 실행할 수 있습니다. 포트를 사용하는지 또는 패키지를 사용하는지에 따라 다릅니다.

패키지 (권장)

이러한 유틸리티에 특정 기능이 내장되어 있지 않으면 패키지를 통해 설치하는 것이 좋습니다. 더 쉽고 서버 시간과 리소스를 덜 사용하며 직관적이고 사용자 친화적 인 인터페이스를 제공합니다.

sudo pkg install opensmtpd dovecot spamd

다음 make명령은 많은 컴파일 옵션을 제공하며 기본값은 정상적으로 작동합니다. 자신이하고있는 일을 정확히 알지 않는 한 변경하지 마십시오.

sudo portsnap fetch update   # or run portsnap fetch extract if using ports for the first time
cd /usr/ports/mail/opensmtpd  
make install  # Installs openSMTPd
make clean
cd /usr/ports/mail/dovecot
make install  # Installs dovecot
make clean
cd /usr/ports/mail/spamd
make install  # Installs spamd
make clean

다음 줄을 추가해야합니다 /etc/rc.conf.

pf_enable="YES"
pf_rules="/usr/local/etc/pf.conf"
pflog_enable="YES"
pflog_logfile="/var/log/pflog"

obspamd_enable="YES"
obspamd_flags="-v"
obspamlogd_enable="YES"

dovecot_enable="YES"

방화벽 설정

PF를 구성하기 위해 다음을 만들 수 있습니다 /usr/local/etc/pf.conf.

## Set public interface ##
ext_if="vtnet0"

## set and drop IP ranges on the public interface ##
martians = "{ 127.0.0.0/8, 192.168.0.0/16, 172.16.0.0/12, \
          10.0.0.0/8, 169.254.0.0/16, 192.0.2.0/24, \
          0.0.0.0/8, 240.0.0.0/4 }"

table <spamd> persist
table <spamd-white> persist

# Whitelisted webmail services
table <webmail> persist file "/usr/local/etc/pf.webmail.ip.conf"

## Skip loop back interface - Skip all PF processing on interface ##
set skip on lo

## Sets the interface for which PF should gather statistics such as bytes in/out and packets passed/blocked ##
set loginterface $ext_if

# Deal with attacks based on incorrect handling of packet fragments 
scrub in all


# Pass spamd whitelist
pass quick log on $ext_if inet proto tcp from <spamd-white> to $ext_if port smtp \
    -> 127.0.0.1 port 25
# Pass webmail servers
rdr pass quick log on $ext_if inet proto tcp from <gmail> to $ext_if port smtp \
    -> 127.0.0.1 port 25
# pass submission messages.
pass quick log on $ext_if inet proto tcp from any to $ext_if port submission modulate state
# Pass unknown mail to spamd
rdr pass log on $ext_if inet proto tcp from {!<spamd-white> <spamd>} to $ext_if port smtp \
    -> 127.0.0.1 port 8025 

## Blocking spoofed packets
antispoof quick for $ext_if

## Set default policy ##
block return in log all
block out all

# Drop all Non-Routable Addresses 
block drop in quick on $ext_if from $martians to any
block drop out quick on $ext_if from any to $martians

pass in inet proto tcp to $ext_if port ssh

# Allow Ping-Pong stuff. Be a good sysadmin 
pass inet proto icmp icmp-type echoreq

# Open up imap/pop3 support
pass quick on $ext_if proto tcp from any to any port {imap, imaps, pop3, pop3s} modulate state


# Allow outgoing traffic
pass out on $ext_if proto tcp from any to any modulate state
pass out on $ext_if proto udp from any to any keep state

작동중인 PF 구성입니다. 비교적 간단하지만 설명해야 할 몇 가지 단점이 있습니다.

첫째, 우리 는 나중에 장치가 사용할 $ext_if변수를 정의 vtnet0합니다. 또한 외부 인터페이스에서 삭제해야하는 잘못된 IP 주소를 정의합니다.

우리는 또한 두 개의 테이블을 정의 spamd하고 spamd-white-이 두 테이블은 그것의 기본 구성에 spamd에 의해 만들어집니다. 또한 webmail일부 주요 웹 메일 제공 업체를 허용하는 데 사용할 테이블을 정의합니다 .

테이블을 보려면 명령 pfctl -t tablename -T show을 사용하여 테이블의 요소를 나열 할 수 있습니다 .

몇 가지 PF 규칙을 설정했습니다. 로컬 인터페이스에서 처리를 건너 뛰고 외부 인터페이스에서 통계를 활성화하고 들어오는 패킷을 제거합니다.

다음은 트래픽을 spamd 또는 OpenSMTPd로 보내는 것을 관리하는 중요한 부분 중 하나입니다.

첫번째로 리디렉션 규칙 (여기 구문을주의하고, 11 사용 이전 스타일 PF 구문을 (FreeBSD의 구문이 이상하게 보일 수 있도록 4.6) - 오픈 BSD 사전. 우리가에 나열된 호스트에서 SMTP에 아무것도를받은 경우 spamd테이블이나에없는 spamd-white테이블, 우리는 다음 세 가지 규칙이 통과 규칙은 우리가 실제로 메일을 수신 할 수있는 이러한 연결 다룬다. 다음 spamd 데몬을 통해 연결을 리디렉션합니다. 우리는에 나열된 IP의 메시지를 통과 spamd-white하고 webmail까지 직선 테이블 OpenSMTPd 또한 제출 포트 ( 587) 에서 메시지를 수락합니다 .

그런 다음 기본 정책을 설정하고 SSH 및 ICMP 메시지를 수락하는 몇 가지 하우스 키핑 규칙이 있습니다.

그런 다음 Dovecot에 액세스하기 위해 외부 인터페이스에서 IMAP 및 POP3를 전달합니다.

마지막으로 모든 발신 트래픽을 허용합니다. 보안을 강화하려는 경우 전달하는 포트를 제한 할 수 있지만 일회용 서버의 경우 모든 것을 전달하는 데 문제가 없습니다.

PF 시작 :

sudo service pf start

방화벽 설정이 완료되었으므로 메일 서버 구성으로 넘어갈 수 있습니다.

OpenSMTPd

OpenSMTPd는 매우 간단하고 읽기 쉬운 구성 구문을 가지고 있습니다. 아래에서 볼 수 있듯이 전체 작업 구성은 14 줄에 맞을 수 있습니다.

#This is the smtpd server system-wide configuration file.
# See smtpd.conf(5) for more information.

ext_if=vtnet0

# If you edit the file, you have to run "smtpctl update table aliases"
table aliases   file:/etc/mail/aliases
table domains   file:/etc/mail/domains

# Keys
pki mail.example.com key "/usr/local/etc/letsencrypt/live/mail.example.com/privkey.pem"
pki mail.example.com certificate "/usr/local/etc/letsencrypt/live/mail.example.com/fullchain.pem"
# If you want to listen on multiple subdomains (e.g. mail.davidlenfesty) you have to add more lines
# of keys, and more lines of listeners

# Listen for local SMTP connections
listen on localhost hostname mail.example.com

# listen for filtered spamd connections
listen on lo0 port 10026

# Listen for submissions
listen on $ext_if port 587 tls-require auth pki mail.example.com tag SUBMITTED

# Accept mail from external sources.
accept from any for domain <domains> alias <aliases> deliver to maildir "~/mail"

accept for local alias <aliases> deliver to maildir "~/mail"
accept from local for any relay tls
accept tagged SUBMITTED for any relay tls

먼저 외부 인터페이스와 몇 가지 테이블, 별칭 및 도메인을 다시 정의합니다. 그런 다음 메일을 처리하려는 모든 도메인의 SSL 키 및 인증서로 이동합니다.

다음 섹션에서는 수신하고자하는 인터페이스와 포트를 정의합니다. 먼저, mail.example.com도메인과 로컬 연결에 대한 localhost를 수신 합니다. 그런 다음 외부 인터페이스에서 스팸으로 필터링 된 메시지와 제출 된 메시지를 수신합니다. 마지막으로, 우리는 제출을 듣고 있으며, 이는 포트에서 발생 587하며 보안상의 이유로 인증을 요구합니다.

마지막으로 accept설정입니다. 우리는 domains표에서 별칭으로 표에 정의 된 모든 도메인에 대한 메시지를 형식으로 aliases홈 디렉토리에 전달하기 위해 모든 메시지를 승인 maildir합니다. 그런 다음 로컬 사서함에 대한 모든 로컬 연결을 수락하고 메시지를 릴레이하므로 이메일을 보낼 수 있습니다. 마지막으로 제출 된 메시지를 전달합니다. 제출 포트에 대한 인증이 필요하지 않은 경우 큰 보안 위험이 있습니다. 이를 통해 누구나 서버를 스팸 릴레이로 사용할 수 있습니다.

별명

FreeBSD /etc/mail/aliases는 다음 형식 의 기본 별칭 파일과 함께 제공 됩니다.

vuser1:  user1
vuser2:  user1
vuser3:  user1
vuser4:  user2

이것은 서로 다른 메일 박스와 이러한 정의 된 메일 박스로 전송 된 메시지를 전달할 위치를 정의합니다. 사용자를 로컬 시스템 사용자 또는 전달할 외부 사서함으로 정의 할 수 있습니다. 기본 FreeBSD 파일은 설명이 풍부하므로 참조 할 수 있습니다.

도메인

FreeBSD는 기본 도메인 파일을 제공하지 않지만 매우 간단합니다.

# Domains
example.com
mail.example.com
smtp.example.com

이것은 새 줄에서 듣고 자하는 각 도메인이있는 일반 텍스트 파일입니다. #기호를 사용하여 주석을 달 수 있습니다 . 이 파일은 구성 줄을 더 적게 사용할 수 있도록 존재합니다.

SSL 인증서

자체 서명 및 서명 된 인증서와 같은 메일 서버와의 통신을 보호 할 수있는 두 가지 방법이 있습니다. 인증서를 자체 서명 할 수는 있지만 Let 's Encrypt와 같은 서비스는 무료로 사용하기 쉬운 서명을 제공합니다.

먼저 certbot 프로그램을 설치해야합니다.

sudo pkg install py-certbot

또는 포트와 함께 설치할 수 있습니다.

cd /usr/ports/security/py-certbot
make install
make clean

그런 다음 인증서를 얻으 80려면 외부 인터페이스에서 포트 를 열 었는지 확인해야합니다 . 필터링 규칙 어딘가에 다음 행을 추가하십시오 /usr/local/etc/pf.conf.

pass quick on $ext_if from any to any port http

그런 다음 실행 pfctl -f /usr/local/etc/pf.conf하여 규칙 세트를 다시로드하십시오.

그런 다음 인증서를 받으려는 모든 도메인에 대해 명령을 실행할 수 있습니다.

certbot certonly --standalone -d mail.example.com

certbot renew인증서가 만료되지 않도록 6 개월마다 한 번씩 실행되도록 crontab 항목을 설정하는 것이 좋습니다 .

그런 다음 모든 관련 도메인에 대해 올바른 키 파일을 가리 키도록 행을 수정할 수 있습니다.

pki mail.example.com key "/usr/local/etc/letsencrypt/live/mail.example.com/privkey.pem"
pki mail.example.com certificate "/usr/local/etc/letsencrypt/live/mail.example.com/fullchain.pem"

증권을 편집하십시오.

sudo chmod 700 /usr/local/etc/letsencrypt/archive/mail.example.com/*

참고 : 각 원본 키 파일에 대해이 작업을 수행해야합니다. 그렇지 않으면 OpenSMTPd에서 열 수 없습니다.

이제 서비스를 시작할 수 있습니다 :

sudo service smtpd start

spamd 구성

여기서는 인터넷에서받는 스팸의 양을 줄이기 위해 OpenBSD의 spamd 데몬을 사용하고 있습니다. 기본적으로이 기능은 다양한 스팸 소스에서 불량으로 알려진 IP의 메시지와 "기본적으로"수신 연결을 "그레이리스트"로 필터링합니다. Spamd는 또한 블랙리스트 및 그레이리스트 연결을 "말더듬"하여 스패머의 시간을 낭비하려고 시도합니다. 즉, 몇 초 동안 응답이 확산되어 클라이언트가 평소보다 더 오랫동안 열린 상태를 유지하게됩니다.

차단 목록 또는 허용 목록에없는 새 IP 주소가 연결되면 연결을 그레이 리스팅합니다. 새 주소가 연결되면 spamd는 오류 메시지와 함께 메시지를 삭제 한 다음 임시 목록에 추가합니다. 스패머는 배달 된 메시지에 대한 대가를 받기 때문에 오류가 발생하면 다시 시도하지 않지만 합법적 인 서비스는 비교적 빨리 다시 시도합니다.

마운트하려면 다음을 실행해야합니다 fdescfs.

mount -t fdescfs null /dev/fd

그런 다음이 줄을 /etc/fstab다음 에 추가해야합니다 .

fdescfs     /dev/fd     fdescfs rw      0       0

기본 구성 파일 (에 있음 /usr/local/etc/spamd/spamd.conf.sample)이 제대로 작동합니다. 새 소스를 추가하거나 사용하는 소스를 변경하기 위해 편집 할 수 있습니다.

sudo cp /usr/local/etc/spamd/spamd.conf.sample /usr/local/etc/spamd/spamd.conf

다음과 같이 서비스를 시작할 수 있습니다.

sudo service obspamd start

이 시점에서 spamd가 설정되었습니다.

웹 메일 서비스 활성화

그레이 리스팅 접근 방식의 한 가지 문제점은 대용량 메일 서비스가 종종 여러 다른 스풀 중 하나를 통해 메일을 발송하므로 매번 동일한 서버가 메시지를 전송하도록 보장 할 수 없다는 것입니다. 이에 대한 한 가지 해결책은 다양한 웹 메일 서비스에서 사용하는 IP 범위를 허용하는 것입니다. PF 구성에서 웹 메일 테이블이 사용됩니다. 이 전략은 스패머가 사용하는 IP 주소를 포함하는 경우 역효과를 낼 수 있지만, 표에 어떤 범위를 입력해야하는지에 대한 한 괜찮습니다.

웹 메일 테이블에 이메일 범위를 추가하려면 다음 명령을 실행할 수 있습니다.

pfctl -t webmail -T add 192.0.2.0/24

비둘기장

사용자가 SSH를 통해 로그인하지 않고 메일에 액세스하도록하려면 IMAP 및 / 또는 POP3을 지원하는 MDA가 필요합니다. 매우 인기있는 프로그램은 Dovecot이며 매우 간단한 구성과 강력한 기능을 갖추고 있습니다.

기본 구성을 복사 할 수 있습니다.

cd /usr/local/etc/dovecot
cp -R example-config/* ./

구성은 몇 가지 다른 파일로 구성됩니다. 구성과 비둘기장 기본값의 차이점을 보려면 아래 명령을 실행하십시오.

sudo doveconf -n

다음은 간단한 작동 구성입니다.

# 2.3.2.1 (0719df592): /usr/local/etc/dovecot/dovecot.conf
# OS: FreeBSD 11.2-RELEASE amd64  
# Hostname: mail.example.com
hostname = mail.example.com
mail_location = maildir:~/mail
namespace inbox {
  inbox = yes
  location = 
  mailbox Archive {
    auto = create
    special_use = \Archive
  }
  mailbox Archives {
    auto = create
    special_use = \Archive
  }
  mailbox Drafts {
    auto = subscribe
    special_use = \Drafts
  }
  mailbox Junk {
    auto = create
    autoexpunge = 60 days
    special_use = \Junk
  }
  mailbox Sent {
    auto = subscribe
    special_use = \Sent
  }
  mailbox "Sent Mail" {
    auto = no
    special_use = \Sent
  }
  mailbox "Sent Messages" {
    auto = no
    special_use = \Sent
  }
  mailbox Spam {
    auto = no
    special_use = \Junk
  }
  mailbox Trash {
    auto = no
    autoexpunge = 90 days
    special_use = \Trash
  }
  prefix = 
  separator = /
}
passdb {
  args = imap
  driver = pam
}
ssl = required
ssl_cert = </usr/local/etc/letsencrypt/live/mail.example.com/fullchain.pem
ssl_dh = </usr/local/etc/dovecot/dh.pem
ssl_key = </usr/local/etc/letsencrypt/live/mail.example.com/privkey.pem
userdb {
  driver = passwd
}

대부분의 구성 파일은 conf.d

중요한 사람은 10-auth.conf, 10-mail.conf하고 10-ssl.conf.

에서 사용하는 다른 사서함을 구성 할 수 있습니다 15-mailboxes.conf. 위의 내용은 많은 시스템에 적합한 구성이지만 마일리지는 다를 수 있습니다. 당신이 할 수있는 한 많은 다른 클라이언트들과 함께이 문제를 해결하는 것이 좋습니다.

입증

대부분의 기본 설정이 정확합니다. 시스템 사용자를 사용하여 인증하려면을 편집해야합니다 10-auth.conf.

다음 줄의 주석을 해제하십시오.

! auth-system.conf.ext 포함

암호화

Diffie-Hellman 매개 변수를 생성해야합니다.

sudo nohup openssl dhparam -out /usr/local/etc/dovecot/dh.pem

참고 : 실행하는 데 시간이 오래 걸립니다. 예상보다 훨씬 길다.

이제 Dovecot을 시작할 수 있습니다 :

sudo service dovecot start

결론

현재 기능적이고 안전하며 스팸이없는 메일 서버가 있습니다.

여기서 좀 더 살펴 봐야 할 것은 스팸 어 ass 신을 사용하여 스팸을 제거하고 신뢰하는 소스에 의해 더 많은 스팸 차단 목록을 찾는 것입니다.


Tags: #BSD #Email

Leave a Comment

AI가 랜섬웨어 공격의 증가와 싸울 수 있습니까?

AI가 랜섬웨어 공격의 증가와 싸울 수 있습니까?

랜섬웨어 공격이 증가하고 있지만 AI가 최신 컴퓨터 바이러스를 처리하는 데 도움이 될 수 있습니까? AI가 답인가? AI boone 또는 bane인지 여기에서 읽으십시오.

ReactOS: 이것이 Windows의 미래입니까?

ReactOS: 이것이 Windows의 미래입니까?

오픈 소스이자 무료 운영 체제인 ReactOS가 최신 버전과 함께 제공됩니다. 현대 Windows 사용자의 요구 사항을 충족하고 Microsoft를 무너뜨릴 수 있습니까? 이 구식이지만 더 새로운 OS 환경에 대해 자세히 알아보겠습니다.

WhatsApp 데스크톱 앱 24*7을 통해 연결 유지

WhatsApp 데스크톱 앱 24*7을 통해 연결 유지

Whatsapp은 마침내 Mac 및 Windows 사용자용 데스크톱 앱을 출시했습니다. 이제 Windows 또는 Mac에서 Whatsapp에 쉽게 액세스할 수 있습니다. Windows 8 이상 및 Mac OS 10.9 이상에서 사용 가능

AI는 어떻게 프로세스 자동화를 다음 단계로 끌어올릴 수 있습니까?

AI는 어떻게 프로세스 자동화를 다음 단계로 끌어올릴 수 있습니까?

인공 지능이 소규모 회사에서 어떻게 인기를 얻고 있으며 어떻게 인공 지능이 성장할 가능성을 높이고 경쟁자가 우위를 점할 수 있는지 알아보려면 이 기사를 읽으십시오.

macOS Catalina 10.15.4 추가 업데이트로 인해 해결보다 더 많은 문제가 발생함

macOS Catalina 10.15.4 추가 업데이트로 인해 해결보다 더 많은 문제가 발생함

최근 Apple은 문제를 해결하기 위해 macOS Catalina 10.15.4 추가 업데이트를 출시했지만 이 업데이트로 인해 Mac 컴퓨터의 브릭킹으로 이어지는 더 많은 문제가 발생하는 것 같습니다. 자세히 알아보려면 이 기사를 읽어보세요.

빅데이터의 13가지 상용 데이터 추출 도구

빅데이터의 13가지 상용 데이터 추출 도구

빅데이터의 13가지 상용 데이터 추출 도구

저널링 파일 시스템이란 무엇이며 어떻게 작동합니까?

저널링 파일 시스템이란 무엇이며 어떻게 작동합니까?

우리 컴퓨터는 모든 데이터를 저널링 파일 시스템이라고 하는 체계적인 방식으로 저장합니다. 검색을 누르는 즉시 컴퓨터에서 파일을 검색하고 표시할 수 있는 효율적인 방법입니다.https://wethegeek.com/?p=94116&preview=true

기술적 특이점: 인류 문명의 먼 미래?

기술적 특이점: 인류 문명의 먼 미래?

과학이 빠른 속도로 발전하고 우리의 많은 노력을 인수함에 따라 설명할 수 없는 특이점에 처할 위험도 높아집니다. 특이점이 우리에게 무엇을 의미할 수 있는지 읽어보십시오.

26가지 빅 데이터 분석 기법에 대한 통찰: 1부

26가지 빅 데이터 분석 기법에 대한 통찰: 1부

26가지 빅 데이터 분석 기법에 대한 통찰: 1부

2021년 의료 분야에서 인공 지능의 영향

2021년 의료 분야에서 인공 지능의 영향

의료 분야의 AI는 지난 수십 년 동안 큰 도약을 했습니다. 따라서 의료 분야에서 AI의 미래는 여전히 나날이 성장하고 있습니다.