Linux Kullanımdaki Açık Portları Bulma Komutları
Ağ bağlantısı veya uygulamaya özel sorunları giderirken, kontrol edilecek ilk şeylerden biri, sisteminizde gerçekte hangi bağlantı noktalarının (port) kullanımda olduğu ve hangi uygulamanın belirli bir bağlantı noktasında dinlediği olmalıdır.
Bu makale, hangi servislerin hangi portları dinlediğini öğrenmek için netstat
, ss
ve lsof
komutlarının nasıl kullanılacağını açıklayacak. Anlatılan talimatlar, macOS gibi tüm Linux ve Unix tabanlı işletim sistemleri için geçerlidir.
1. Açık Port Nedir?
Ağ bağlantı noktası (port), numarası, ilişkili IP adresi ve TCP veya UDP gibi iletişim protokolünün türü ile tanımlanır.
Listening veya dinleyen veya açık port, bir uygulamanın veya işlemin dinlediği ve bir iletişim uç noktası görevi gören bir ağ bağlantı noktasıdır.
Her açık port, bir güvenlik duvarı kullanılarak açılabilir veya kapatılabilir (filtrelenebilir). Genel anlamda, açık bir port, uzak konumlardan gelen paketleri kabul eden bir ağ bağlantı noktasıdır.
Aynı IP adresinde aynı portu dinleyen iki hizmetiniz olamaz.
Örneğin, 80 ve 443 numaralı bağlantı noktalarını dinleyen bir Apache web sunucusu çalıştırıyorsanız ve Nginx'i yüklemeye çalışırsanız, HTTP ve HTTPS bağlantı noktaları zaten kullanımda olduğu için Nginx'i başlatma başarısız olacaktır.
2. netstat Komutuyla Açık Portları Bulmak
netstat
, ağ bağlantıları hakkında bilgi sağlayabilen bir komut satırı aracıdır.
Bağlantı noktalarını ve socket kullanan hizmetler de dahil olmak üzere, açık tüm TCP veya UDP portlarını listelemek için aşağıdaki komutu kullanın:
sudo netstat -tunlp
Bu komutta kullanılan seçenekler şu anlama gelir:
-t
→ TCP bağlantı noktalarını gösterir.-u
→ UDP bağlantı noktalarını gösterir.-n
→ Host'ları çözmek yerine sadece sayısal adresleri gösterir.-l
→ Yalnızca açık portları gösterir.-p
→ Dinleyici işleminin PID'sini ve adını gösterir. Bu bilgi yalnızca komutu root veya sudo kullanıcısı olarak çalıştırırsanız gösterilir.
Komutun çıktısı şöyle gözükür:
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 445/sshd
tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN 929/master
tcp6 0 0 :::3306 :::* LISTEN 534/mysqld
tcp6 0 0 :::80 :::* LISTEN 515/apache2
tcp6 0 0 :::22 :::* LISTEN 445/sshd
tcp6 0 0 :::25 :::* LISTEN 929/master
tcp6 0 0 :::33060 :::* LISTEN 534/mysqld
udp 0 0 0.0.0.0:68 0.0.0.0:* 966/dhclient
Bizim senaryomuzda önemli sütunlar şunlardır:
Proto
→ Socket tarafından kullanılan protokol.Local Address
→ İşlemin dinlediği IP Adresi ve port numarası.PID/Program name
→ PID ve işlemin adı.
Sonuçları filtrelemek istiyorsanız grep
komutunu kullanın. Örneğin, 22 numaralı TCP bağlantı noktasında hangi işlemin dinlediğini bulmak için şunu yazmanız gerekir:
sudo netstat -tnlp | grep :22
Çıktı, bu makinede 22 numaralı portun SSH sunucusu tarafından kullanıldığını gösterir:
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 445/sshd
tcp6 0 0 :::22 :::* LISTEN 445/sshd
Çıktı boşsa, portu hiçbir şeyin dinlemediği anlamına gelir.
Ayrıca listeyi PID, protokol, status vb. gibi kriterlere göre de filtreleyebilirsiniz.
netstat
komutu eskidir ve ss
ve ip
komutları ile değiştirilebilir. Ancak yine de ağ bağlantılarını kontrol etmek için en çok kullanılan komutlardan biridir.
3. ss Komutuyla Açık Portları Bulmak
ss
komutu netstat
yerine kullanılan yeni bir komuttur. Bazı netstat
özelliklerinden yoksundur, ancak daha fazla TCP durumu ortaya çıkarır ve biraz daha hızlıdır. Komut seçenekleri çoğunlukla aynıdır, bu nedenle netstat'tan ss'ye geçiş zor değildir.
ss
ile tüm açık portların bir listesini almak için şunu yazın:
sudo ss -tunlp
Çıktı, netstat tarafından kullanılan çıktıyla neredeyse aynıdır:
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=445,fd=3))
LISTEN 0 100 0.0.0.0:25 0.0.0.0:* users:(("master",pid=929,fd=13))
LISTEN 0 128 *:3306 *:* users:(("mysqld",pid=534,fd=30))
LISTEN 0 128 *:80 *:* users:(("apache2",pid=765,fd=4),("apache2",pid=764,fd=4),("apache2",pid=515,fd=4))
LISTEN 0 128 [::]:22 [::]:* users:(("sshd",pid=445,fd=4))
LISTEN 0 100 [::]:25 [::]:* users:(("master",pid=929,fd=14))
LISTEN 0 70 *:33060 *:* users:(("mysqld",pid=534,fd=33))
4. lsof Komutuyla Açık Portları Bulmak
lsof
, process'ler tarafından açılan dosyalar hakkında bilgi sağlayan güçlü bir komut satırı yardımcı programıdır.
Linux'ta her şey bir dosyadır. Soket bilgileride dosylarada tutulur.
lsof ile tüm açık TCP bağlantı noktalarının bir listesini almak için şu komutu kullanabiliriz:
sudo lsof -nP -iTCP -sTCP:LISTEN
Kullanılan seçenekler aşağıdaki gibidir:
-n
→ port numaralarını port isimlerine dönüştürme.-p
→ Host adlarını çözme, sayısal adresleri göster.-iTCP -sTCP:LISTEN
→ Yalnızca TCP ve durumu LISTEN olan ağ dosyalarını göster.
Çıktımız şu şekilde olacaktır:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 445 root 3u IPv4 16434 0t0 TCP *:22 (LISTEN)
sshd 445 root 4u IPv6 16445 0t0 TCP *:22 (LISTEN)
apache2 515 root 4u IPv6 16590 0t0 TCP *:80 (LISTEN)
mysqld 534 mysql 30u IPv6 17636 0t0 TCP *:3306 (LISTEN)
mysqld 534 mysql 33u IPv6 19973 0t0 TCP *:33060 (LISTEN)
apache2 764 www-data 4u IPv6 16590 0t0 TCP *:80 (LISTEN)
apache2 765 www-data 4u IPv6 16590 0t0 TCP *:80 (LISTEN)
master 929 root 13u IPv4 19637 0t0 TCP *:25 (LISTEN)
master 929 root 14u IPv6 19638 0t0 TCP *:25 (LISTEN)
Çıktı sütunlarının adlarının çoğu açıklayıcıdır fakat yine de bakalım:
COMMAND
,PID
,USER
→ Bağlantı noktasıyla ilişkili adı, pid ve programı çalıştıran kullanıcı.NAME
→ port numarası.
Belirli bir portu hangi işlemin dinlediğini de bulabilirsiniz Örneğin 3306 numaralı portunu gösterelim:
sudo lsof -nP -iTCP:3306 -sTCP:LISTEN
Çıktı, MySQL sunucusunun 3306
numaralı bağlantı noktasını kullandığını gösterir:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
mysqld 534 mysql 30u IPv6 17636 0t0 TCP *:3306 (LISTEN)
Daha fazla bilgi için lsof man sayfasını ziyaret edin ve bu aracın diğer tüm güçlü seçeneklerini okuyun.