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.
İç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:
# 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
# Ö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))
| Alan | Açıklama |
|---|---|
| State LISTEN | Port aktif olarak dinleniyor |
| 0.0.0.0:port | Tüm arayüzlerden erişilebilir |
| 127.0.0.1:port | Sadece localhost'tan erişilebilir |
| Process | Portu 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)
# 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
# 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
# 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)
# 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
# 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
# /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
# /etc/apache2/ports.conf
Listen 80
Listen 443
# Belirli IP'den dinle
# Listen 192.168.1.10:80
MySQL/MariaDB
# /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
# /etc/postgresql/15/main/postgresql.conf
listen_addresses = '*' # Tüm arayüzler
# listen_addresses = 'localhost' # Sadece localhost
port = 5432
# /etc/postgresql/15/main/pg_hba.conf
# Uzaktan erişim izni
host all all 0.0.0.0/0 md5
Redis
# /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
# 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ı
#!/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
| Sorun | Neden | Çözüm |
|---|---|---|
| Port dinlenmiyor | Servis çalışmıyor | systemctl start servis_adı |
| 127.0.0.1'de dinleniyor | Bind address localhost | Yapılandırmada 0.0.0.0 olarak değiştir |
| Firewall engelliyor | Port kuralı yok | iptables/ufw/firewalld ile port aç |
| Path Panel engelliyor | Filtre kuralı yok | Path Panel'den kural oluştur |
| Connection refused | Servis portu değişmiş | Servis yapılandırmasını kontrol et |
| Timeout | Ağ veya firewall sorunu | Traceroute 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.
İlgili Makaleler
SSH Bağlantı Sorunu: Sunucuya Bağlanamıyorum
SSH bağlantı sorunlarını çözme rehberi: Path.net firewall kuralları, Default Block, SSH portu için filtre kuralı oluşturma ve sorun giderme adımları.
RDP Bağlantı Sorunu: Windows Sunucuya Erişilemiyor
RDP bağlantı sorunlarını çözme rehberi: Path.net firewall kuralları, Default Block, RDP portu için filtre kuralı oluşturma ve sorun giderme adımları.
MTR Testi Nasıl Yapılır ve Destek Ekibine Gönderilir
WinMTR ve Linux MTR ile ağ testi yapma, ICMP filtre kuralı oluşturma ve sonuçları destek ekibine gönderme rehberi. Paket kaybı ve gecikme analizi.