Linux Kullanımdaki Açık Portları Bulma Komutları
4 min read

Linux Kullanımdaki Açık Portları Bulma Komutları

Linux açık portları bulmak için netstat, ss ve lsof komutlarının nasıl kullanılacağını örneklerle birlikte gösteriyoruz.
Linux Kullanımdaki Açık Portları Bulma Komutları
Photo by Jordan Harrison / Unsplash

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.