Ana içeriğe geç

NİCELİĞİ ARTA ARTA GİDEN KILAVUZ: E-posta iletimini güvenilir hale getirmek için sunucunuzu ayarlama. BÖLÜM I: Güvenlik Duvarı

· 8 dakikalık okuma
Customer Care Engineer

email-server-linux-firewall-configuration-smtp-imap-setup-guide

bilgi

Güvenlik Duvarı, sunucuya hangi bağlantılara izin verileceğini ve hangilerinin engelleneceğini kontrol eden bir yazılımdır (veya donanım-yazılım aygıtıdır). Modern Linux sunucu dağıtımlarının büyük çoğunluğunda, kutudan çıktığı anda bir tür güvenlik duvarı mevcuttur.

Alıcıya güvenilir e-posta teslimi, yalnızca posta sunucusunun kendisine değil, aynı zamanda doğru DNS kayıtlarına ve güvenlik duvarı yapılandırmasına da bağlıdır. Bunlardan herhangi birinde bir sorun varsa, iletilerinizin büyük olasılıkla Spam klasörüne düşmesi veya hiç teslim edilmemesi demektir.

Bu makale, sunucunuzdan gönderilen iletilerin neredeyse %100 güvenilir bir şekilde teslim edilmesini sağlamanıza olanak tanıyacak temel adımları özetlemektedir. 1. Bölüm'de olası güvenlik duvarı ile ilgili sorunları ayrıntılı olarak inceleyeceğiz; 2. Bölüm'de ise DNS kayıtlarının yapılandırılmasına ilişkin talimatları bulacaksınız.

Bu makaledeki bilgiler yalnızca Linux dağıtımlarında çalışan posta sunucuları için geçerlidir. Örnek olarak FASTPANEL kontrol paneli ile Debian 12 ve Rocky Linux 8.10 kullanılmaktadır.

Ön Koşullar

Adım 1. Tanı araçlarını yükleyin

Kayıtları ve bağlantı noktalarını kontrol etmek için şunlara ihtiyacınız olacak:

  • dig - DNS kayıtlarını analiz etmek için

  • lsof - posta sunucusu durumunu kontrol etmek için

  • netcat - bağlantı noktası kullanılabilirliğini kontrol etmek için

  • whois - mevcut DNS sağlayıcısını kontrol etmek için

Debian/Ubuntu'da kurulum:

sudo apt update && sudo apt install -y bind9-dnsutils netcat-openbsd lsof whois

CentOS/AlmaLinux/Rocky Linux:

sudo yum install -y bind-utils nmap-ncat lsof whois

Posta bağlantı noktası kullanılabilirliği

bilgi

Bağlantı noktası, bir sunucudaki farklı hizmetlere hitap etmek için kullanılan sayısal bir tanımlayıcıdır. Her hizmet veya uygulama, ağ üzerinden veri alışverişi yapmak için kendi bağlantı noktasında dinler (örneğin, HTTP 80 numaralı bağlantı noktasını, SMTP ise 25 numaralı bağlantı noktasını kullanır).

Aşağıdaki adımların tümünü gerçekleştirmek için, kök kullanıcı kimlik bilgileriyle SSH üzerinden sunucunuza bağlanın veya örneklerde gösterildiği gibi komutları çalıştırırken sudo kullanın. SSH üzerinden bir sunucuya nasıl bağlanacağınızı SSH makalemizde öğrenebilirsiniz.

Adım 2. Posta sunucusu durumunu kontrol edin

Bağlantı noktalarının ağ üzerinden erişilebilir olup olmadığını kontrol etmeden önce, posta sunucularının çalıştığından ve doğru şekilde çalıştığından emin olun. Giden posta genellikle Exim veya Postfix tarafından, gelen posta ise Dovecot tarafından işlenir.

Çalıştıklarını kontrol etmek için komutları kullanın:

sudo lsof -i:25
sudo lsof -i:143

Hizmetler çalışıyorsa, aşağıdaki gibi bir çıktı alırsınız:

25 numaralı bağlantı noktası:

KOMUT PID KULLANICI FİDESİ TIP CİHAZ BOYUT/KAPALI DUGUM AD
exim    839 exim    4u  IPv6 778199358      0t0  TCP *:smtp (LISTEN)
exim    839 exim    5u  IPv4 778199359      0t0  TCP *:smtp (LISTEN)

Sunucunuz farklı bir SMTP sunucusu kullanıyorsa, örneğin Postfix, ilk sütunda exim yerine tam adını görürsünüz. Gerekirse, sonraki komutlarda bu adı kullanın.

143 numaralı bağlantı noktası:

KOMUT PID KULLANICI FİDESİ TIP CİHAZ BOYUT/KAPALI DUGUM AD
dovecot 859 root   39u  IPv4 778204692      0t0  TCP *:imap (LISTEN)
dovecot 859 root   40u  IPv6 778204693      0t0  TCP *:imap (LISTEN)

Bu, her şeyin yolunda olduğu ve bir sonraki adıma geçebileceğiniz anlamına gelir.

Posta hizmetleri çalışmıyorsa, boş bir çıktı alırsınız:

~ sudo lsof -i:25
~
~ sudo lsof -i:143
~

Bu durumda bir sorun var ve posta hizmetleri kullanılamıyor. Manuel olarak başlatmayı deneyebilir ve ardından durumlarını kontrol edebilirsiniz:

Debian/Ubuntu:

systemctl restart exim4 dovecot
systemctl status exim4
systemctl status dovecot

CentOS/AlmaLinux/Rocky Linux:

systemctl restart exim dovecot
systemctl status exim
systemctl status dovecot

Çalışır durumda, hizmet durumu şuna benzer olacaktır:

Exim:

● exim.service - Exim Mail Transport Agent
   Loaded: loaded (/usr/lib/systemd/system/exim.service; enabled; vendor preset: disabled)
   Active: active (running) since Sun 2025-11-02 16:38:57 UTC; 57min ago
 Main PID: 839 (exim)
    Tasks: 1
   Memory: 11.0M
   CGroup: /system.slice/exim.service
           └─839 /usr/sbin/exim -bd -q1h

Warning: Journal has been rotated since unit was started. Log output is incomplete or unavailable.

Dovecot:

● dovecot.service - Dovecot IMAP/POP3 email server
   Loaded: loaded (/usr/lib/systemd/system/dovecot.service; enabled; vendor preset: disabled)
   Active: active (running) since Sun 2025-11-02 16:38:58 UTC; 58min ago
     Docs: man:dovecot(1)
           https://doc.dovecot.org/
 Main PID: 859 (dovecot)
    Tasks: 5
   Memory: 9.5M
   CGroup: /system.slice/dovecot.service
           ├─ 859 /usr/sbin/dovecot -F
           ├─ 880 dovecot/anvil
           ├─ 881 dovecot/log
           ├─ 882 dovecot/config
           └─1729 dovecot/stats

Bu durumda her şey yolunda ve bir sonraki adıma geçebilirsiniz.

Hizmetlerde bir sorun varsa, şuna benzer bir çıktı görürsünüz:

Exim:

● exim.service - Exim Mail Transport Agent
   Loaded: loaded (/usr/lib/systemd/system/exim.service; enabled; vendor preset: disabled)
   Active: inactive (dead) since Sun 2025-11-02 17:38:44 UTC; 3s ago
  Process: 839 ExecStart=/usr/sbin/exim -bd -q${QUEUE} (code=exited, status=0/SUCCESS)
 Main PID: 839 (code=exited, status=0/SUCCESS)

Dovecot:

● dovecot.service - Dovecot IMAP/POP3 email server
   Loaded: loaded (/usr/lib/systemd/system/dovecot.service; enabled; vendor preset: disabled)
   Active: inactive (dead) since Sun 2025-11-02 17:39:32 UTC; 3s ago
     Docs: man:dovecot(1)
           https://doc.dovecot.org/
  Process: 2278 ExecStop=/usr/bin/doveadm stop (code=exited, status=0/SUCCESS)
  Process: 859 ExecStart=/usr/sbin/dovecot -F (code=exited, status=0/SUCCESS)
 Main PID: 859 (code=exited, status=0/SUCCESS)

Hizmetlerin neden kullanılamayacağına dair birçok olası neden vardır (yapılandırma dosyalarındaki hatalar, yanlışlıkla silinmiş günlük dosyaları, sunucuda boş disk alanı olmaması ve çok daha fazlası). Bu yönler bu makalenin kapsamı dışındadır.

Bu sorunla karşılaşırsanız ve kendiniz araştırmak isterseniz, sistem günlüğüyle ilgili makalemizi öneririz. Veya yardım için barındırma sağlayıcınızın destek ekibiyle iletişime geçin. kodu.cloud'da 7/24 çalışıyoruz ve taleplere birkaç dakika içinde yanıt veriyoruz.

Adım 3. Genel ağdan posta bağlantı noktalarının erişilebilirliğini kontrol etme

E-postanın doğru çalışması için aşağıdaki TCP bağlantı noktalarının ağ üzerinden erişilebilir olması gerekir:

  • 25, 465, 587 - posta göndermek için (SMTP)

  • 143, 993 - posta almak için (IMAP)

Erişilebilirliğini netcat kullanarak kontrol edebilirsiniz:

nc -vz 1.2.3.4 25

1.2.3.4 kısmını sunucunuzun gerçek IP adresiyle değiştirin.

Bağlantı noktası açıksa, aşağıdaki yanıtı alırsınız:

Debian/Ubuntu:

Connection to 1.2.3.4 25 port [tcp/smtp] succeeded!

CentOS/AlmaLinux/Rocky Linux:

Ncat: Version 7.92 ( https://nmap.org/ncat )
Ncat: Connected to 1.2.3.4:25.
Ncat: 0 bytes sent, 0 bytes received in 0.01 seconds.

Bağlantı noktası kapalıysa, yanıt aşağıdaki gibi olacaktır:

Debian/Ubuntu:

nc: connect to 1.2.3.4 port 25 (tcp) failed: Connection refused

CentOS/AlmaLinux/Rocky Linux:

Ncat: Version 7.92 ( https://nmap.org/ncat )
Ncat: Connection refused.

Bu bölümün başında listelenen tüm bağlantı noktaları için bu komutu çalıştırın. Hepsi erişilebilir durumdaysa, bu makalenin ikinci kısmına geçin. Erişilebilir değilse, sorunu çözmek için Adım 4'e gidin.

Adım 4. Erişim açma (isteğe bağlı)

Çoğu zaman, sunucular istenmeyen bağlantılara karşı korunmak için güvenlik duvarı olarak iptables veya UFW kullanır. Komutu çalıştırın:

sudo ufw status

Aşağıdaki yanıtı alırsanız:

-bash: ufw: komutu bulunamadı

iptables'in kullanıldığı anlamına gelir. Ancak, çıktı şu şekilde başlıyorsa:

Durum: aktif

UFW'nin kullanıldığı anlamına gelir.

Kullanılan güvenlik duvarına göre bu adımın ilgili alt bölümüne gidin.

warning

Linux sistem güvenlik duvarını yönetmek için başka yazılımlar da vardır (nftables, firewalld ve diğerleri). Bu makalenin boyutunu artırmamak için bunlar bu makalede ele alınmayacaktır.

Iptables

warning

Bu bölümde, tüm örnekler yalnızca IPv4 için geçerlidir. Sunucunuzda bir IPv6 adresi varsa ve posta bağlantı noktalarının IPv6 üzerinden de kullanılabilir olmasını istiyorsanız, iptables yerine ip6tables kullanarak tüm komutları ek olarak tekrarlayın.

Tüm mevcut kuralları görüntülemek için şunu çalıştırın:

sudo iptables -L -v -n --line-numbers

Sunucuda eklenen kural kümesine bağlı olarak çıktı farklılık gösterebilir. Varsayılan olarak kural yoktur, ancak barındırma yapılandırmasına veya işletim sistemine bağlı olarak bazı yapılandırmalar zaten yapılmış olabilir. Bir posta sunucusunu yapılandırırken sıkça karşılaşılan iki ana vakaya bakalım.

  1. “Yasaklanmayan her şey izinlidir” politikası (policy ACCEPT)

Bu durumda güvenlik duvarı, açıkça engelleyen bir kural oluşturulana kadar varsayılan olarak tüm trafiğe izin verir. Bu politika genellikle varsayılan olarak kullanılır.

Aşağıda, SSH ve posta bağlantı noktalarının engellendiği bir kural kümesi örneği verilmiştir:

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1       51  5637 DROP       6    --  *      *       0.0.0.0/0            0.0.0.0/0            tcp multiport dports 22
2        0     0 DROP       6    --  *      *       0.0.0.0/0            0.0.0.0/0            tcp multiport dports 25,143,993,587,465

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1        0     0 DROP       6    --  *      *       0.0.0.0/0            0.0.0.0/0            tcp multiport dports 25,143,993,587,465

Bu örnekte:

  • Política ACCEPT varsayılan davranışı tanımlar: aksi belirtilmedikçe tüm bağlantılara izin verilir.

  • Chain INPUT (gelen bağlantılar): port 22 (SSH) ve tüm standart posta bağlantı noktalarına (SMTP: 25, 465, 587; IMAP: 143; IMAPS: 993) gelen yeni bağlantılar engellenir.

  • Chain OUTPUT (giden bağlantılar): aynı bağlantı noktalarına giden paketler engellenir.

Kural numarası satırın başında gösterilir (num). Örneğin, INPUT zincirindeki posta bağlantı noktalarını engelleyen kuralı (kural numarası 2) silmeniz gerekirse, komut şöyle olacaktır:

sudo iptables -D INPUT 2

Burada:

  • -D - bir kuralı silme komutudur.

  • INPUT - kuralın silindiği zincirdir (bu durumda, gelen trafik).

  • 2 - silmek istediğiniz kuralın bulunduğu satır numarasıdır.

Benzer şekilde, bu örnekteki giden bağlantı noktası engelini kaldırmak için şunu çalıştırmanız gerekir:

sudo iptables -D OUTPUT 1
warning

iptables -L -v -n --line-numbers çıktısındaki satır numaraları, başka kurallar ekleyip sildiğinizde değişebilir. Bu nedenle, yeni kurallar eklerseniz, satır numaraları kayabilir. Hata yapmamak için, bir kuralı silmeden önce her zaman mevcut satır numaralarını kontrol edin.

Bundan sonra, her şeyin doğru olduğundan emin olmak için komutu tekrar çalıştırın:

iptables -L -v -n --line-numbers

Çıktı, posta bağlantı noktalarının çalışmasını engelleyen kurallar içermemelidir:

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1       51  5637 DROP       6    --  *      *       0.0.0.0/0            0.0.0.0/0            tcp multiport dports 22

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination

Kurallar hala mevcutsa, girdiğiniz komutların ve satır numaralarının doğruluğunu kontrol edin.

Güvenlik duvarı kurallarını değiştirdikten sonra değişiklikleri kaydettiğinizden emin olun, aksi takdirde yeniden başlatmadan sonra kaybolurlar. Mevcut iptables kurallarını kaydetmek için şunu çalıştırın:

Debian/Ubuntu:

iptables-save > /etc/iptables/rules.v4

CentOS/AlmaLinux/Rocky Linux:

iptables-save > /etc/sysconfig/iptables

Bundan sonra, 3. Adımda açıklandığı gibi posta bağlantı noktalarının kullanılabilirliğini tekrar test edin. Hala kullanılamıyorlarsa, 5. Adıma devam edin. Her şey yolundaysa, bu makalenin ikinci bölümüne gidin buradan.

2. “Açıkça izin verilmeyen her şeyi engelle” politikası (policy DROP)**

Bu tür bir yapılandırma çok daha katıdır. Tüm bağlantı noktaları ve protokoller varsayılan olarak engellenir ve yalnızca belirli bağlantı noktaları için açık izin kuralları trafiğe izin verir. Bu, sunucular için, özellikle riskleri en aza indirmek istiyorsanız, daha güvenli ve önerilen bir yaklaşımdır.

Böyle bir yapılandırma için bir kural örneği:

Chain INPUT (policy DROP 306 packets, 17962 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1       92 12474 ACCEPT     0    --  *      *       0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
2      466 32947 ACCEPT     6    --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:22

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy DROP 197 packets, 29192 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1       44 10332 ACCEPT     0    --  *      *       0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED

Bu örnekte:

  • Chain INPUT (gelen bağlantılar): politika DROP'tur, yani izin kuralları olanlar hariç tüm paketler varsayılan olarak engellenir.

Kural 1: ACCEPT state RELATED,ESTABLISHED - mevcut bağlantılarla ilgili veya onlarla ilişkili gelen paketlere izin verir. Bu, sunucunun giden bağlantılara (örneğin, SSH, posta, DNS sorguları) yanıtları doğru bir şekilde alması için önemlidir. Kural 2: ACCEPT tcp dpt:22 - 22 numaralı bağlantı noktasında (SSH) yeni gelen bağlantılara izin verir.

  • Chain OUTPUT (giden bağlantılar): politika DROP'tur, yani tüm giden paketler varsayılan olarak engellenir.

Kural 1: ACCEPT state RELATED,ESTABLISHED - mevcut bağlantılarla ilgili giden paketlere izin verir. Bu, sunucunun istemci isteklerine (örneğin, SSH, posta bağlantıları) yanıt vermesini ve kararlı bir bağlantı sürdürmesini sağlar.

Yani posta bağlantı noktaları için izin kurallarının olmadığını görüyoruz. Bunları eklemek için aşağıdaki komutları çalıştırın:

sudo iptables -A INPUT -p tcp -m multiport --dports 25,465,587,143,993 -m state --state NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp -m multiport --dports 25,465,587,143,993 -m state --state NEW,ESTABLISHED -j ACCEPT

Bundan sonra kuralları kaydedin:

Debian/Ubuntu:

iptables-save > /etc/iptables/rules.v4

CentOS/AlmaLinux/Rocky Linux:

iptables-save > /etc/sysconfig/iptables

Ardından 3. Adımda açıklandığı gibi posta bağlantı noktalarının kullanılabilirliğini tekrar test edin. Hala kullanılamıyorlarsa, 5. Adıma devam edin. Her şey yolundaysa, bu makalenin ikinci bölümüne gidin buradan.

UFW (Basitleştirilmiş Güvenlik Duvarı)

Bazı sunucularda, güvenlik duvarı yapılandırması için basitleştirilmiş bir arabirim olan iptables yerine UFW kullanılır. Temel posta sunucusu yapılandırması için uygundur ve genellikle Ubuntu ve Debian'da bulunur.

UFW'nin etkin olup olmadığını ve hangi kuralların aktif olduğunu görmek için şunu çalıştırın:

sudo ufw status verbose

Örnek çıktı:

Durum: aktif
Günlükleme: açık (düşük)
Varsayılan: reddet (gelen), izin ver (giden)
Yeni profiller: atla

Burada:

  • Varsayılan: reddet (gelen) - varsayılan olarak tüm gelen bağlantılar engellenir.

  • Varsayılan: izin ver (giden) - varsayılan olarak tüm giden bağlantılara izin verilir.

Posta sunucusunun düzgün çalışması için standart bağlantı noktalarını açmanız gerekir. Aşağıdaki komutları sırayla çalıştırın:

sudo ufw allow 25/tcp
sudo ufw allow 465/tcp
sudo ufw allow 587/tcp
sudo ufw allow 143/tcp
sudo ufw allow 993/tcp

Giden kısıtlamalarınız varsa, giden posta için SMTP bağlantı noktalarına izin vermeniz gerekir:

sudo ufw allow out 25/tcp
sudo ufw allow out 465/tcp
sudo ufw allow out 587/tcp

Kuralları ekledikten sonra tekrar kontrol edebilirsiniz:

sudo ufw status numbered

Numaralarla birlikte bir kural listesi göreceksiniz. Bir kuralı silmeniz gerekiyorsa, çıktıda yer alan numarayı kullanın:

sudo ufw delete 3

UFW'de kurallar otomatik olarak kaydedilir ve yeniden başlatmadan sonra da geçerli kalır.

Ardından, 3. Adımda açıklandığı gibi posta bağlantı noktalarının kullanılabilirliğini tekrar test edin. Hala kullanılamıyorlarsa, 5. Adıma devam edin. Her şey yolundaysa, bu makalenin ikinci bölümüne gidin buradan.

Adım 5. Güvenlik duvarı doğru yapılandırıldı, ancak posta bağlantı noktaları hala kullanılamıyor (isteğe bağlı)

Bu davranış, posta bağlantı noktalarının sunucunuz düzeyinde değil, barındırma sağlayıcınızın ekipmanında engellendiğini gösterir. Bu durumda, bir destek bileti oluşturun ve bu bağlantı noktalarını sunucunuz için açmalarını isteyin. Bu mümkün değilse, tek çözüm barındırma sağlayıcınızı değiştirmek olacaktır.

kodu.cloud'da posta bağlantı noktalarının çalışmasını hiçbir şekilde kısıtlamıyoruz. Kurallarımız toplu posta gönderimini yasaklar, ancak iyi niyetli müşteriler için e-posta tam olarak kullanılabilir. Bir e-posta sunucusu yapılandırmanıza bile gerek yok, çünkü tüm müşterilerimize genişletilmiş lisanslı FASTPANEL kontrol paneline ücretsiz erişim sağlanmaktadır. Kontrol paneliyle birlikte bir sunucu sipariş edin ve yalnızca birkaç dakika içinde kendi alan adınızda posta kullanmaya başlayın.

Düzgün DNS kaydı yapılandırması için sonraki adımlar bu makalenin ikinci bölümünde ele alınacaktır buradan.