Ana içeriğe geç
Kategoriye Dön

Port Erişim Sorunu: Firewall ve Servis Kontrolü

Port erişim sorunlarını teşhis etmek için netstat, ss, iptables, ufw ve servis dinleme kontrolü rehberi.

Okuma süresi: 13 dk Sorun Giderme
portfirewallnetstatssiptablesufwservis

İçindekiler

Giriş

Sunucunuzda çalışan bir servise dışarıdan erişememeniz genellikle port erişim sorunlarından kaynaklanır. Bu rehberde, port erişim sorunlarını sistematik olarak teşhis etmek ve çözmek için kullanabileceğiniz araçları ve yöntemleri detaylı olarak anlatacağız.

Port Durumunu Kontrol Etme

ss Komutu ile Port Kontrolü

ss komutu, modern Linux sistemlerinde soket istatistiklerini görüntülemek için kullanılır:

hljs bash
# Tüm dinlenen TCP portlarını listele
ss -tlnp

# Tüm dinlenen UDP portlarını listele
ss -ulnp

# Belirli bir portu kontrol et
ss -tlnp | grep :80
ss -tlnp | grep :443
ss -tlnp | grep :3306

# Tüm bağlantıları göster (dinlenen + bağlı)
ss -tanp

# Detaylı soket bilgisi
ss -tlnp -e

ss Çıktısını Yorumlama

hljs bash
# Örnek çıktı:
State   Recv-Q  Send-Q  Local Address:Port  Peer Address:Port  Process
LISTEN  0       128     0.0.0.0:22          0.0.0.0:*          users:(("sshd",pid=1234,fd=3))
LISTEN  0       511     0.0.0.0:80          0.0.0.0:*          users:(("nginx",pid=5678,fd=6))
LISTEN  0       128     127.0.0.1:3306      0.0.0.0:*          users:(("mysqld",pid=9012,fd=22))
AlanAçıklama
State LISTENPort aktif olarak dinleniyor
0.0.0.0:portTüm arayüzlerden erişilebilir
127.0.0.1:portSadece localhost'tan erişilebilir
ProcessPortu dinleyen süreç bilgisi

Eğer servis 127.0.0.1 üzerinde dinliyorsa, dışarıdan erişilemez. Servis yapılandırmasında bind-address veya listen direktifini 0.0.0.0 olarak değiştirmeniz gerekir.

netstat Komutu (Eski Sistemler)

hljs bash
# Tüm dinlenen portları listele
netstat -tlnp

# UDP dahil tüm portlar
netstat -tulnp

# Belirli port kontrolü
netstat -tlnp | grep :8080

# Bağlantı sayılarını göster
netstat -an | grep :80 | wc -l

Firewall Kontrolü

iptables ile Kontrol

hljs bash
# Tüm kuralları listele
sudo iptables -L -n -v

# INPUT zincirini kontrol et
sudo iptables -L INPUT -n -v --line-numbers

# NAT tablosunu kontrol et
sudo iptables -t nat -L -n -v

# Belirli port için kural ara
sudo iptables -L -n -v | grep 80

iptables ile Port Açma

hljs bash
# TCP port 80 aç
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT

# TCP port 443 aç
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT

# Belirli IP'den port erişimi
sudo iptables -A INPUT -p tcp -s 192.168.1.100 --dport 3306 -j ACCEPT

# Port aralığı aç
sudo iptables -A INPUT -p tcp --dport 8000:9000 -j ACCEPT

# Kuralları kaydet
sudo iptables-save > /etc/iptables/rules.v4

# Veya netfilter-persistent ile
sudo netfilter-persistent save

UFW (Uncomplicated Firewall)

hljs bash
# UFW durumunu kontrol et
sudo ufw status verbose

# Numaralı kuralları listele
sudo ufw status numbered

# Port aç
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow 8080/tcp

# Belirli IP'den port erişimi
sudo ufw allow from 192.168.1.100 to any port 3306

# Port aralığı aç
sudo ufw allow 8000:9000/tcp

# Kural sil
sudo ufw delete allow 8080/tcp

# UFW'yi etkinleştir
sudo ufw enable

# UFW'yi yeniden yükle
sudo ufw reload

firewalld

hljs bash
# Aktif zone'u kontrol et
sudo firewall-cmd --get-active-zones

# Tüm kuralları listele
sudo firewall-cmd --list-all

# Port aç (geçici)
sudo firewall-cmd --add-port=80/tcp

# Port aç (kalıcı)
sudo firewall-cmd --permanent --add-port=80/tcp
sudo firewall-cmd --permanent --add-port=443/tcp
sudo firewall-cmd --reload

# Servis ekle
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload

Servis Dinleme Yapılandırması

Nginx

hljs nginx
# /etc/nginx/sites-available/default
server {
    listen 80;              # Tüm arayüzlerden dinle
    listen [::]:80;         # IPv6 dahil
    server_name example.com;
    
    # Belirli IP'den dinle
    # listen 192.168.1.10:80;
}

Apache

hljs apache
# /etc/apache2/ports.conf
Listen 80
Listen 443

# Belirli IP'den dinle
# Listen 192.168.1.10:80

MySQL/MariaDB

hljs ini
# /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
# Tüm arayüzlerden dinle (uzaktan erişim için)
bind-address = 0.0.0.0

# Sadece localhost (varsayılan, güvenli)
# bind-address = 127.0.0.1

port = 3306

PostgreSQL

hljs ini
# /etc/postgresql/15/main/postgresql.conf
listen_addresses = '*'    # Tüm arayüzler
# listen_addresses = 'localhost'  # Sadece localhost

port = 5432
hljs bash
# /etc/postgresql/15/main/pg_hba.conf
# Uzaktan erişim izni
host    all    all    0.0.0.0/0    md5

Redis

hljs ini
# /etc/redis/redis.conf
bind 0.0.0.0
# bind 127.0.0.1  # Varsayılan (sadece localhost)

port 6379
protected-mode yes
requirepass GÜÇLÜ_ŞİFRE

Veritabanı ve cache servislerini dışarıya açarken mutlaka güçlü şifre ve IP kısıtlaması kullanın. Aksi halde sunucunuz saldırılara açık hale gelir.

Dışarıdan Port Testi

hljs bash
# Yerel makineden uzak port testi
nc -zv SUNUCU_IP 80
nc -zv SUNUCU_IP 443
nc -zv SUNUCU_IP 3306

# nmap ile detaylı port tarama
nmap -p 80,443,3306,5432,6379 SUNUCU_IP

# Servis versiyon tespiti
nmap -sV -p 80,443 SUNUCU_IP

# curl ile HTTP port testi
curl -I http://SUNUCU_IP:80
curl -I https://SUNUCU_IP:443

# telnet ile port testi
telnet SUNUCU_IP 80

REXE Path Panel Entegrasyonu

REXE sunucularında bir IP'de hiç kural yokken tüm portlar açıktır. IP'nizde en az bir kural olduğunda ise otomatik Default Block devreye girer ve yalnızca izin verilen portlar açık kalır. Servisinize dışarıdan erişim sağlamak için Path Panel'den ilgili port için filtre kuralı oluşturmanız gerekir:

1. Path Panel'e giriş yapın (x.rexe.tr)
2. İlgili IP adresine tıklayın
3. "Yeni Kural Ekle" butonuna tıklayın
4. Protokol: TCP (veya UDP)
5. Yön: Symmetric (çift yönlü)
6. Hedef Port: Açmak istediğiniz port
7. Aksiyon: Allow
8. Kuralı kaydedin ve yayına alınmasını bekleyin

Path Panel kurallarının yayına alınması 2-5 dakika sürebilir.

Panelde kural henüz yayılmamış (güncellenmemiş) gibi görünse bile kural büyük olasılıkla 2-5 dakika içinde çoktan yayına alınmıştır. Panelin durum kontrol aralığı veya kuralın Path tarafında tüm node'lara (bizim tarafımız hariç) işlenme süreci gibi nedenlerle durum gecikmeli güncellenebilir. Bu yalnızca paneldeki görüntüsel bir gecikmedir; port aslında sistemde çoktan açılmıştır.

Sorun Giderme Akış Şeması

hljs bash
#!/bin/bash
# Port Erişim Sorun Giderme Script'i
PORT=$1
SERVER_IP=$2

if [ -z "$PORT" ] || [ -z "$SERVER_IP" ]; then
    echo "Kullanım: $0 <port> <server_ip>"
    exit 1
fi

echo "=== Port $PORT Erişim Kontrolü ==="

# 1. Servis dinliyor mu?
echo -e "\n[1] Servis Dinleme Kontrolü:"
ss -tlnp | grep ":$PORT" || echo "Port $PORT dinlenmiyor!"

# 2. Firewall kontrolü
echo -e "\n[2] Firewall Kontrolü:"
if command -v ufw &> /dev/null; then
    sudo ufw status | grep "$PORT"
elif command -v firewall-cmd &> /dev/null; then
    sudo firewall-cmd --list-ports | grep "$PORT"
else
    sudo iptables -L -n | grep "$PORT"
fi

# 3. Dışarıdan erişim testi
echo -e "\n[3] Dışarıdan Erişim Testi:"
nc -zv -w 5 $SERVER_IP $PORT 2>&1

echo -e "\n=== Kontrol Tamamlandı ==="

Yaygın Sorunlar ve Çözümleri

SorunNedenÇözüm
Port dinlenmiyorServis çalışmıyorsystemctl start servis_adı
127.0.0.1'de dinleniyorBind address localhostYapılandırmada 0.0.0.0 olarak değiştir
Firewall engelliyorPort kuralı yokiptables/ufw/firewalld ile port aç
Path Panel engelliyorFiltre kuralı yokPath Panel'den kural oluştur
Connection refusedServis portu değişmişServis yapılandırmasını kontrol et
TimeoutAğ veya firewall sorunuTraceroute ve mtr ile kontrol et

Sonuç

Port erişim sorunlarını çözmek için üç katmanlı bir kontrol yapmanız gerekir: servis dinleme durumu, sunucu firewall kuralları ve REXE Path Panel kuralları. Önce servisin doğru portta ve doğru arayüzde dinlediğinden emin olun, ardından firewall kurallarını kontrol edin ve son olarak Path Panel'den gerekli kuralları oluşturun.