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,
-eparametresini 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.
-eparametresi: 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 testinc -zv -w 3 host port: Timeout ile port testinc -zv host 20-100: Port aralığı testinc -zvu host 53: UDP port testinc -lvp 9999: Listener başlatnc -lvkp 9999: Tekrar eden bağlantılar için listenernc host 9999 < dosya: Dosya göndernc -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.