nc (Netcat) ile Port Test ve Basit Veri Transferi

Ağ sorunlarını debug ederken ya da bir servisin gerçekten ayakta olup olmadığını test ederken elinizin altında basit ama güçlü bir araç olması hayat kurtarır. İşte nc yani netcat tam olarak bu iş için var. “Swiss Army Knife of networking” olarak da anılan netcat, port testi yapmaktan dosya transferine, basit chat uygulamasından port taramasına kadar inanılmaz geniş bir kullanım alanına sahip. Kurulum gerektirmiyor çünkü çoğu Linux dağıtımında zaten yüklü geliyor, tek satır komutla istediğiniz şeyi yapabiliyorsunuz. Bu yazıda netcat’i gerçek dünya senaryolarıyla nasıl kullanacağınızı, tuzaklarını ve pratik ipuçlarını ele alacağız.

Netcat Nedir ve Hangi Versiyonu Kullanıyorsunuz?

Netcat özünde TCP ve UDP üzerinden veri okuyup yazabilen bir araç. 1995’ten beri var, o zamandan bu yana pek çok farklı implementasyonu ortaya çıktı. Günümüzde en yaygın karşılaşılan iki versiyon var:

  • GNU Netcat: Klasik netcat, -e parametresini destekler
  • OpenBSD Netcat (ncat): Güvenlik odaklı, birçok modern dağıtımın varsayılanı, bazı parametreler farklı çalışır

Hangi versiyonu kullandığınızı anlamak önemli çünkü bazı parametreler farklı davranıyor:

nc -h 2>&1 | head -5
# veya
nc --version

Ubuntu/Debian’da genellikle OpenBSD versiyonu geliyor. CentOS/RHEL’de ise ncat adıyla Nmap projesi üzerinden gelen versiyon mevcut. Eğer sisteminizde yoksa:

# Debian/Ubuntu
sudo apt install netcat-openbsd

# CentOS/RHEL
sudo yum install nmap-ncat

# Arch Linux
sudo pacman -S openbsd-netcat

Temel Port Testi

Netcat’in en sık kullanılan özelliği port testi. Bir sunucuda belirli bir portun açık olup olmadığını, servise ulaşılıp ulaşılamadığını test etmek için birebir.

Basit TCP Port Testi

nc -zv 192.168.1.100 80

Buradaki parametreler:

  • -z: Zero-I/O modu, sadece bağlantı kurar, veri göndermez
  • -v: Verbose mod, sonucu ekrana basar

Başarılı çıktı şöyle görünür:

Connection to 192.168.1.100 80 port [tcp/http] succeeded!

Başarısız olursa:

nc: connect to 192.168.1.100 port 80 (tcp) failed: Connection refused

Port Aralığı Tarama

Birden fazla portu tek seferde test etmek istiyorsanız aralık belirtebilirsiniz:

nc -zv 192.168.1.100 20-25

Bu komut 20’den 25’e kadar tüm portları test eder. FTP, SSH, Telnet gibi servislerin aktif olup olmadığını hızlıca görmek için kullanışlı.

Zaman Aşımı Ayarı

Varsayılan olarak netcat cevap gelmeyene kadar bekleyebilir. Özellikle script içinde kullanıyorsanız timeout belirtmek şart:

nc -zv -w 3 192.168.1.100 443

-w 3: 3 saniye bekle, gelen yanıt yoksa çık. Bu sayede script’leriniz takılı kalmaz.

UDP Port Testi

TCP testleri straightforward ama UDP biraz farklı çalışıyor. UDP’de bağlantı kavramı olmadığı için “port açık” teyidini almak her zaman mümkün değil:

nc -zvu 192.168.1.100 53

-u: UDP modunda çalıştır. DNS (53), SNMP (161) gibi UDP servisleri test ederken bu parametreyi kullanın.

Gerçek Dünya Senaryosu 1: Güvenlik Duvarı Kurallarını Doğrulama

Diyelim ki yeni bir güvenlik duvarı kuralı eklediniz ve app sunucusunun veritabanı sunucusuna 5432 portunu (PostgreSQL) görebilmesi gerekiyor. Kural doğru çalışıyor mu?

# App sunucusu üzerinde çalıştırın
nc -zv -w 5 db-server.internal 5432

# Çıktı başarılı ise:
# Connection to db-server.internal 5432 port [tcp/postgresql] succeeded!

Eğer bağlantı başarısız olursa “Connection refused” mu alıyorsunuz yoksa hiç cevap gelmiyor mu? Bu iki durum farklı anlam taşıyor:

  • Connection refused: Porta ulaşıyorsunuz ama servis dinlemiyor ya da o portu reddediyor
  • Timeout (cevap yok): Güvenlik duvarı paketi düşürüyor, hedef bile görmüyor

Bu ayrım güvenlik duvarı kurallarını debug ederken hayat kurtarıyor.

Dinleme Modu: Basit Sunucu Kurma

Netcat sadece client değil, server olarak da çalışabilir. Bu özelliği sayesinde bağlantı testi yaparken karşı tarafta gerçek bir servis olmak zorunda değilsiniz.

Basit Listener Başlatma

Sunucu tarafında:

nc -lvp 9999
  • -l: Listen modu
  • -v: Verbose
  • -p: Port numarası (bazı versiyonlarda doğrudan port numarası da yazılabiliyor)

Client tarafında:

nc 192.168.1.100 9999

Bağlantı kurulunca iki taraf da birbirine mesaj yazabilir. Basit ama etkili bir bağlantı testi. Yazdığınız her satır Enter’a basınca karşı tarafa gidiyor.

Gerçek Dünya Senaryosu 2: Servis Banner Grabbing

Bir porta bağlandığınızda servis genellikle kendini tanıtan bir banner gönderiyor. Bu bilgi troubleshooting’de çok işe yarıyor:

echo "" | nc -w 3 mail.example.com 25

SMTP sunucusu şöyle bir şey döndürür:

220 mail.example.com ESMTP Postfix (Ubuntu)

HTTP sunucusu için:

echo -e "HEAD / HTTP/1.0rnrn" | nc -w 3 webserver.example.com 80

Bu yöntemle hangi yazılımın çalıştığını, versiyonunu öğrenebilirsiniz. Özellikle bir servisi yeni güncelledikten sonra doğru versiyonun çalıştığını teyit etmek için kullanışlı.

Dosya Transferi

Netcat’in scp veya rsync bilinen bir şey olmadan basit dosya transferi yapabilme özelliği var. Özellikle ssh key kurulu olmayan, FTP olmayan ama ağ bağlantısı olan sistemler arasında hızlı çözüm arıyorsanız netcat kurtarıcı oluyor.

Basit Dosya Gönderme

Alıcı tarafında önce listener başlatın:

nc -lvp 5555 > gelen_dosya.tar.gz

Gönderici tarafında:

nc -w 3 192.168.1.200 5555 < dosya.tar.gz

Transfer tamamlanınca alıcı taraftaki netcat otomatik kapanıyor (ya da Ctrl+C ile kapatabilirsiniz). Dosyanın düzgün gelip gelmediğini md5sum ile doğrulayabilirsiniz:

# Gönderici
md5sum dosya.tar.gz

# Alıcı
md5sum gelen_dosya.tar.gz

Dizin Transferi

Tek dosya değil, dizin transferi yapmak istiyorsanız tar ile birlikte kullanın:

# Alıcı tarafında
nc -lvp 5555 | tar xvf -

# Gönderici tarafında
tar cvf - /var/www/html/ | nc -w 3 192.168.1.200 5555

Bu kombo ile dizin yapısını olduğu gibi karşı tarafa gönderiyorsunuz. Küçük çaplı yedek transferleri için oldukça pratik.

Gerçek Dünya Senaryosu 3: Disk Image Transferi

Bir sunucunun diskini başka bir sunucuya klonlamanız gerekiyor ama arada sadece ağ bağlantısı var. Netcat + dd kombinasyonu burada devreye giriyor:

# Hedef sunucuda
nc -lvp 5555 | dd of=/dev/sdb bs=4M

# Kaynak sunucuda
dd if=/dev/sda bs=4M | nc -w 10 192.168.1.200 5555

Bu yöntem fiziksel disk kopyalama için kullanılıyor. Dikkat: Hedef diskin boyutu kaynak diskten büyük veya eşit olmalı. Ayrıca hedef /dev/sdb‘yi doğru yazdığınızdan emin olun, yanlış diske yazmak o diskteki verileri mahveder.

Transfer hızını görmek için pv aracını araya ekleyebilirsiniz:

dd if=/dev/sda bs=4M | pv | nc -w 10 192.168.1.200 5555

Script İçinde Port Testi Kullanımı

Monitoring script’leri yazarken netcat’in çıkış kodunu kullanmak çok pratik. Başarılı bağlantıda 0, başarısız olduğunda 1 döndürüyor.

#!/bin/bash

HOSTS=("web01" "web02" "db01")
PORTS=(80 80 5432)

for i in "${!HOSTS[@]}"; do
    HOST="${HOSTS[$i]}"
    PORT="${PORTS[$i]}"
    
    if nc -zv -w 3 "$HOST" "$PORT" 2>/dev/null; then
        echo "[OK] $HOST:$PORT erişilebilir"
    else
        echo "[FAIL] $HOST:$PORT erişilemiyor! Alarm gönderiliyor..."
        # Burada alert mekanizmanızı çağırabilirsiniz
    fi
done

Bu scripti cron’a ekleyip periyodik port monitoring yapabilirsiniz. Zabbix veya Prometheus gibi monitoring sistemleri olmayan küçük ortamlarda işe yarıyor.

Basit Chat Uygulaması

Bu biraz eğlenceli bir kullanım ama bazen işe yarıyor. İki terminal arasında basit mesajlaşma:

# Terminal 1 (sunucu rolü)
nc -lvp 8888

# Terminal 2 (client rolü)
nc localhost 8888

Her iki taraf da mesaj yazıp gönderebilir. Tabii bu şifreli değil, üretim ortamında ciddi veri için kullanmayın ama hızlı test mesajı atmak için yeterli.

Gerçek Dünya Senaryosu 4: Web Sunucusu Debug

Bir web uygulamasında garip HTTP hatalar alıyorsunuz ve Nginx/Apache’nin tam olarak ne döndürdüğünü görmek istiyorsunuz. Tarayıcı çok şeyi otomatik handle ediyor, netcat ise ham HTTP’yi gösteriyor:

printf "GET /api/health HTTP/1.1rnHost: myapp.example.comrnConnection: closernrn" | nc -w 5 myapp.example.com 80

Çıktıda header’ları ve body’yi tam olarak göreceksiniz:

HTTP/1.1 200 OK
Server: nginx/1.18.0
Date: Mon, 01 Jan 2024 12:00:00 GMT
Content-Type: application/json
...

{"status":"healthy","version":"2.1.0"}

Bu yöntem özellikle load balancer arkasındaki farklı backend’leri test ederken, hangi sunucunun cevap verdiğini anlamak için çok değerli.

Güvenlik Notları ve Dikkat Edilmesi Gerekenler

Netcat güçlü bir araç ama dikkatli kullanılması gerekiyor:

  • Şifreleme yok: Netcat üzerinden gönderdiğiniz veriler düz metin olarak geçiyor. Hassas veri (parola, key, kişisel veri) transferi için kesinlikle kullanmayın. Bunun için scp ya da rsync over SSH kullanın.
  • Kimlik doğrulama yok: Listener başlattığınızda aynı ağdaki herkes bağlanabilir. Üretim sistemlerinde netcat listener çalıştırmak ciddi güvenlik riski oluşturuyor.
  • Firewall logları: Port tarama testleri güvenlik sistemlerinde alarm tetikleyebilir. Kendi sisteminizde test yapıyor olsanız bile SOC ekibini önceden bilgilendirin.
  • -e parametresi: Bazı versiyonlarda bir komuta shell bağlamayı sağlayan bu parametreden kaçının. Pentest araçlarında kullanılıyor ama production sistemlerde kullanmak tehlikeli.

Netcat Alternatifleri

Bazı durumlarda netcat yerine başka araçlar daha iyi çalışıyor:

  • nmap: Daha kapsamlı port tarama gerekiyorsa
  • telnet: Basit TCP banner grab için hala kullanılıyor ama modern sistemlerde genellikle yüklü değil
  • socat: Netcat’in daha gelişmiş versiyonu gibi düşünebilirsiniz, SSL desteği var
  • curl: HTTP/HTTPS testleri için çok daha uygun
  • Python one-liner: python3 -c "import socket; s=socket.socket(); s.connect(('host',80)); print('OK')" gibi

Yaygın Hatalar ve Çözümleri

“nc: invalid option — ‘p'”: OpenBSD netcat’te -p ile port belirtmek yerine doğrudan nc -lv 9999 şeklinde kullanın.

Listener bir kez bağlantı sonrası kapanıyor: OpenBSD netcat’te -k parametresiyle listener’ı canlı tutabilirsiniz:

nc -lvkp 9999

UDP testlerinde sonuç belirsiz: UDP stateless olduğu için “connection succeeded” mesajı almak her zaman mümkün değil. Servis UDP probe’a cevap veriyorsa görebiliyorsunuz, vermiyorsa timeout alıyorsunuz. Bu ikisi arasındaki farkı anlamak önemli.

“Address already in use”: Aynı portu tekrar açmaya çalışıyorsanız önceki process’i bulup kapatın:

lsof -i :9999
kill -9 <PID>

Hızlı Referans

Günlük kullanımda en çok işe yarayan komutları bir arada görmek faydalı:

  • nc -zv host port: Tek port testi
  • nc -zv -w 3 host port: Timeout ile port testi
  • nc -zv host 20-100: Port aralığı testi
  • nc -zvu host 53: UDP port testi
  • nc -lvp 9999: Listener başlat
  • nc -lvkp 9999: Tekrar eden bağlantılar için listener
  • nc host 9999 < dosya: Dosya gönder
  • nc -lvp 9999 > dosya: Dosya al

Sonuç

Netcat, sysadmin araç kutusunda hep bulunması gereken, görünürde basit ama derinlikli bir araç. Port testi için telnet kullananlar hala var ama netcat çok daha esnek ve scriptlenebilir. Özellikle güvenlik duvarı değişikliklerini doğrulama, servis ayağa kalkmadan önce port açıklığını test etme ve acil durum dosya transferleri gibi senaryolarda pratik değeri tartışılmaz.

Bununla birlikte, netcat’in güçlü olduğu kadar dikkatli kullanılması gerektiğini de unutmayın. Özellikle production ortamlarda listener modunda çalıştırmak, hassas veri transferi için kullanmak gibi durumlardan kaçının. Güvenlik gereksinimleriniz varsa socat ya da SSH tünelleme gibi alternatifler daha uygun olabilir.

Komutları ezberlemek yerine bu yazıyı bir referans olarak kullanın. Gerçek senaryolarla pratik yaptıkça netcat kullanımı ikinci doğanız haline geliyor. Ağ sorunlarını debug ederken “acaba bu port açık mı, güvenlik duvarı mı bloklıyor” sorusunun cevabını birkaç saniyede almak, troubleshooting sürenizi ciddi ölçüde kısaltıyor.

Yorum yapın