ncat ile Gelişmiş Ağ Dinleme, Şifreli Bağlantı ve Betik Entegrasyonu

Ağ araçları söz konusu olduğunda çoğu sysadmin aklına hemen netcat gelir. Haklı da sayılır, yıllardır iş görüyor. Ama ncat başka bir şey. Nmap projesinin bir parçası olarak sıfırdan yazılmış, SSL desteği, proxy zinciri, erişim kontrolü ve betik entegrasyonu gibi özellikleriyle ncnin yapamadığı işleri kolayca hallediyor. Ben de bir süredir production ortamlarında nc yerine ncat kullanıyorum ve bu geçişi hiç pişman olmadım.

ncat Nedir, Neden nc Değil?

Klasik netcat yıllar içinde farklı platformlarda farklı fork’lara ayrıldı. OpenBSD versiyonu, GNU versiyonu, farklı Linux dağıtımlarındaki paketlenmiş haller… Hepsinin davranışı biraz farklı. Bir sistemde çalışan bir flag başka sistemde çalışmayabiliyor. ncat ise Nmap ekibinin bu kaosa son vermek için yazdığı, tutarlı, modern ve özellik zengini bir araç.

Kurulum oldukça basit. Çoğu sistemde nmap paketiyle birlikte geliyor:

# RHEL/CentOS/Rocky
sudo dnf install nmap-ncat

# Debian/Ubuntu
sudo apt install ncat

# Arch
sudo pacman -S nmap

# Versiyon kontrolü
ncat --version

Kurulumdan sonra ncat komutu doğrudan kullanılabilir. Bazı sistemlerde nc olarak sembolik link de oluşuyor, ama ben karışıklık olmasın diye hep ncat yazıyorum.

Temel Kullanım: Dinleme ve Bağlanma

Önce temeli sağlam kuralım. ncatın iki temel modu var: dinleme (server) modu ve bağlanma (client) modu.

# Sunucu tarafı: 4444 portunda dinle
ncat -l 4444

# İstemci tarafı: uzak sunucuya bağlan
ncat 192.168.1.100 4444

# UDP modunda dinle
ncat -l -u 5555

# Belirli bir arayüzde dinle
ncat -l -s 10.0.0.1 4444

Bu kadar basit. İki terminal aç, birinde dinle, diğerinde bağlan. Yazdığın her şey karşı tarafa gidiyor. Ama asıl eğlence bundan sonra başlıyor.

Sık kullanacağın parametreler şunlar:

  • -l: Dinleme modunu aktif eder (listen)
  • -p: Port numarasını belirtir (bazı versiyonlarda -l ile birlikte kullanılır)
  • -u: UDP protokolünü kullanır
  • -s: Kaynak IP adresini belirtir
  • -v: Verbose mod, daha fazla bilgi gösterir
  • -k: Bağlantı kapandıktan sonra dinlemeye devam eder (keep-open)
  • -4: Sadece IPv4 kullan
  • -6: Sadece IPv6 kullan
  • -w: Bağlantı zaman aşımı (saniye cinsinden)
  • -z: Zero-I/O modu, port tarama için kullanılır
  • -n: DNS çözümlemesi yapma, sadece IP kullan

Dosya Transfer Senaryoları

Ağ üzerinden hızlı dosya transferi için ncat son derece kullanışlı. SCP kuramadığın, FTP istemediğin, HTTP server ayarlamak için vaktinin olmadığı durumlarda hayat kurtarıcı.

# Alıcı tarafta (dosyayı bekle)
ncat -l 9999 > yedek_dosya.tar.gz

# Gönderici tarafta
ncat 192.168.1.200 9999 < yedek_dosya.tar.gz

# İlerleme görmek istersen pv ile birleştir
ncat -l 9999 > yedek.tar.gz &
tar czf - /var/log | pv | ncat 192.168.1.200 9999

Burada dikkat edilmesi gereken bir nokta var: ncat transferin ne zaman bittiğini bilmiyor. Gönderen taraf dosyayı gönderince bağlantıyı kapatıyor ve bu genellikle yeterli oluyor, ama bazen alıcı tarafta dosya beklenenden önce kapanabiliyor. Bu durumda --send-only veya --recv-only flaglerini kullanmak daha sağlıklı:

# Sadece gönder, bitince bağlantıyı kapat
ncat --send-only 192.168.1.200 9999 < buyuk_dosya.img

# Sadece al
ncat -l --recv-only 9999 > buyuk_dosya.img

SSL/TLS ile Şifreli Bağlantılar

İşte burada ncat gerçekten parlıyor. Klasik nc ile şifreli bağlantı kurmak için stunnel veya benzeri bir araç gerekiyor. ncat bunu doğrudan destekliyor.

Basit bir şifreli dinleyici kurmak için önce sertifika lazım:

# Self-signed sertifika oluştur
openssl req -x509 -newkey rsa:4096 -keyout server.key 
  -out server.crt -days 365 -nodes 
  -subj "/CN=ncat-server"

# SSL ile dinle
ncat --ssl --ssl-cert server.crt --ssl-key server.key -l 4443

# İstemci tarafından bağlan (sertifika doğrulaması olmadan)
ncat --ssl 192.168.1.100 4443

# Sertifika doğrulamasıyla bağlan
ncat --ssl --ssl-verify --ssl-trustfile server.crt 192.168.1.100 4443

Bu kombinasyonu gerçek bir senaryoda kullandım. İki datacenter arasında geçici bir şifreli tünel lazımdı, VPN ayarlamak zaman alacaktı, IPSec konfigürasyonu karmaşıktı. ncat --ssl ile beş dakikada çalışan bir çözüm kurdum ve işi hallettim.

SSL ile dosya transferi de aynı şekilde çalışıyor:

# Şifreli dosya al
ncat --ssl --ssl-cert server.crt --ssl-key server.key 
  -l 4443 --recv-only > hassas_veri.tar.gz

# Şifreli dosya gönder
ncat --ssl --ssl-verify --ssl-trustfile server.crt 
  --send-only 192.168.1.100 4443 < hassas_veri.tar.gz

Erişim Kontrolü: –allow ve –deny

Production ortamında rasgele herkese açık bir port bırakmak tabii ki kabul edilemez. ncat basit ama etkili bir erişim kontrol mekanizması sunuyor.

# Sadece belirli IP'ye izin ver
ncat -l 4444 --allow 192.168.1.50

# Birden fazla IP için
ncat -l 4444 --allow 192.168.1.50 --allow 192.168.1.51

# Subnet bazında izin
ncat -l 4444 --allow 192.168.1.0/24

# Belirli IP'yi engelle, geri kalanına izin ver
ncat -l 4444 --deny 10.0.0.5

# İzin listesi dosyadan oku
ncat -l 4444 --allowfile /etc/ncat/allowed_hosts.txt
--denyfile /etc/ncat/denied_hosts.txt

allowed_hosts.txt dosyası satır satır IP veya hostname içeriyor. CIDR notasyonu da destekleniyor. Büyük bir izin listesi varsa dosya yöntemi çok daha temiz.

Broker Modu: Çok Noktali Bağlantı

ncatın az bilinen ama çok kullanışlı bir özelliği broker modu. Birden fazla istemcinin birbirine bağlanmasını sağlıyor, basit bir mesajlaşma veya koordinasyon hub’ı gibi düşünebilirsin.

# Broker modunda başlat
ncat -l 4444 --broker

# Birden fazla istemci bağlanabilir
# Terminal 1:
ncat 192.168.1.100 4444

# Terminal 2:
ncat 192.168.1.100 4444

# Terminal 3:
ncat 192.168.1.100 4444

Broker modunda bir istemcinin yazdığı şey diğer tüm istemcilere iletiliyor. Basit bir dağıtık log toplama sistemi veya anlık bildirim mekanizması için kullanılabilir. Tabii production’da bunu gerçek bir mesajlaşma sistemiyle yapmak lazım, ama hızlı bir test veya geçici çözüm için yeterli.

Betik Entegrasyonu: –exec ve –sh-exec

Bu özellik ncatı gerçekten güçlü kılıyor. Bir porta gelen bağlantıyı doğrudan bir programa veya betiğe bağlayabiliyorsun.

# Bağlanan istemciye bash kabuğu sun (DİKKAT: Güvenlik riski!)
ncat -l 4444 --exec /bin/bash

# Shell üzerinden çalıştır (pipe ve yönlendirme destekler)
ncat -l 4444 --sh-exec "cat /var/log/app/application.log | tail -f"

# Her bağlantı için yeni process başlat
ncat -l 4444 -k --exec /usr/local/bin/process_request.sh

--exec ve --sh-exec arasındaki fark önemli. --exec programı doğrudan çalıştırıyor, shell yorumlaması yok. --sh-exec ise /bin/sh -c ile çalıştırıyor, yani pipe, yönlendirme ve shell özellikleri kullanılabiliyor.

Gerçek dünyadan bir kullanım örneği. Bir uygulama sunucusunda log izleme sistemi kurmak istedik. Log toplama aracı yoktu, kurulumu zaman alacaktı. Geçici çözüm olarak:

#!/bin/bash
# /usr/local/bin/log_streamer.sh

LOG_FILE="/var/log/myapp/application.log"
CLIENT_IP=$NCAT_REMOTE_ADDR

echo "=== Log stream başlatıldı: $(date) ==="
echo "=== İstemci: $CLIENT_IP ==="
echo "=================================="

tail -f "$LOG_FILE"
# Servisi çalıştır
ncat -l 9000 -k --allow 10.0.0.0/8 
  --sh-exec "/usr/local/bin/log_streamer.sh"

$NCAT_REMOTE_ADDR ortam değişkenini fark ettin mi? ncat bağlantı bilgilerini ortam değişkenleri olarak betiğe aktarıyor:

  • NCAT_REMOTE_ADDR: Bağlanan istemcinin IP adresi
  • NCAT_REMOTE_PORT: Bağlanan istemcinin port numarası
  • NCAT_LOCAL_ADDR: Dinlediğimiz IP adresi
  • NCAT_LOCAL_PORT: Dinlediğimiz port numarası

Bu değişkenler betik entegrasyonunda çok işe yarıyor. Kim bağlandığını, hangi porttan geldiğini bilmek loglama ve erişim kontrolü için değerli.

Chat Sunucusu ve Interaktif Betikler

--sh-exec ile basit bir interaktif sistem kurulabiliyor. Örneğin bir onay sistemi:

#!/bin/bash
# /usr/local/bin/deploy_gateway.sh

echo "=== Deployment Gateway ==="
echo "Sunucu: $(hostname)"
echo "Tarih: $(date)"
echo ""
echo "Deploy etmek istediğiniz ortamı seçin:"
echo "1) Staging"
echo "2) Production"
echo ""
read -r secim

case $secim in
  1)
    echo "Staging deploy başlatılıyor..."
    /usr/local/bin/deploy.sh staging
    ;;
  2)
    echo "Production deploy - Onay gerekli"
    echo "Devam etmek için 'EVET' yazın:"
    read -r onay
    if [ "$onay" = "EVET" ]; then
      /usr/local/bin/deploy.sh production
    else
      echo "Deploy iptal edildi."
    fi
    ;;
  *)
    echo "Geçersiz seçim."
    ;;
esac
ncat -l 8080 --allow 10.0.1.0/24 
  --sh-exec "/usr/local/bin/deploy_gateway.sh"

Port Yönlendirme ve Proxy

ncat basit bir port yönlendirme için de kullanılabiliyor. Karmaşık iptables kuralı yazmak yerine:

# Yerel 8080 portuna gelen trafiği uzak sunucuya yönlendir
ncat -l 8080 --sh-exec "ncat backend-server.internal 80"

# Daha temiz yöntem: --proxy-type kullan
# SOCKS4 proxy üzerinden bağlan
ncat --proxy 192.168.1.1:1080 --proxy-type socks4 hedef.com 80

# SOCKS5 proxy
ncat --proxy 192.168.1.1:1080 --proxy-type socks5 hedef.com 443

# HTTP proxy
ncat --proxy 192.168.1.1:8080 --proxy-type http hedef.com 443

Proxy zinciri özellikle kısıtlı ağ ortamlarında çok işe yarıyor. İç ağdaki bir jump server üzerinden başka bir sisteme erişmek gerektiğinde:

# Jump server üzerinden iç ağ sunucusuna bağlan
ncat --proxy jump-server.example.com:1080 
     --proxy-type socks5 
     internal-db.local 5432

Monitoring ve Healthcheck Entegrasyonu

ncat ile basit healthcheck servisleri de kurulabilir. Kubernetes veya load balancer’ın healthcheck isteklerine cevap verecek bir betik:

#!/bin/bash
# /usr/local/bin/healthcheck_server.sh

# Uygulama durumunu kontrol et
check_app() {
  if pgrep -f "myapp" > /dev/null; then
    echo "HTTP/1.0 200 OK"
    echo "Content-Type: text/plain"
    echo ""
    echo "OK"
    echo "Uptime: $(uptime)"
    echo "Memory: $(free -h | grep Mem | awk '{print $3"/"$2}')"
  else
    echo "HTTP/1.0 503 Service Unavailable"
    echo "Content-Type: text/plain"
    echo ""
    echo "UYGULAMA ÇALIŞMIYOR"
  fi
}

check_app
# Healthcheck servisini başlat
ncat -l 8888 -k --sh-exec "/usr/local/bin/healthcheck_server.sh"

Bu yöntemi küçük bir mikro servis mimarisinde kullandım. Her servisin yanında bu küçük healthcheck dinleyicisi çalışıyordu ve Nginx upstream kontrolü bu porta bakıyordu. Tabii gerçek production ortamı için bunu application level’da yapmak daha doğru, ama geçici bir çözüm veya test ortamı için gayet işe yarıyor.

systemd ile Servis Haline Getirme

ncat listener’ı sistem başlangıcında otomatik başlatmak için systemd unit dosyası yazalım:

# /etc/systemd/system/ncat-logstream.service
[Unit]
Description=ncat Log Stream Server
After=network.target

[Service]
Type=simple
User=loguser
Group=loggroup
ExecStart=/usr/bin/ncat -l 9000 -k 
  --allow 10.0.0.0/8 
  --sh-exec "/usr/local/bin/log_streamer.sh"
Restart=always
RestartSec=5
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target
# Servisi etkinleştir ve başlat
sudo systemctl daemon-reload
sudo systemctl enable ncat-logstream
sudo systemctl start ncat-logstream
sudo systemctl status ncat-logstream

Güvenlik Uyarıları ve En İyi Pratikler

ncat güçlü bir araç ama bu güç beraberinde sorumluluk getiriyor. Birkaç önemli nokta:

  • --exec /bin/bash asla production’da kullanma. Test ortamında bile dikkatli ol. Bu, bağlanan herkese shell erişimi veriyor.
  • Her zaman --allow veya --allowfile kullan. Herkese açık bir ncat listener bırakmak güvenlik ihlalidir.
  • SSL kullanıyorsan sertifikaları koru. Private key dosyalarının izinleri 600 olmalı.
  • Firewall’u unutma. ncatın kendi erişim kontrolü ikinci bir savunma katmanı, birincil koruma hala firewall.
  • Log tut. -v flag’i ile verbose modu açık tut ve logları bir yere yaz.
# Güvenli bir listener örneği
ncat -l 4443 
  --ssl --ssl-cert /etc/ncat/server.crt --ssl-key /etc/ncat/server.key 
  --allow 10.0.1.0/24 
  -k 
  --sh-exec "/usr/local/bin/secure_handler.sh" 
  -v 2>> /var/log/ncat/access.log

Sonuç

ncat benim araç çantamda artık vazgeçilmez bir yer edindi. Özellikle SSL desteği ve betik entegrasyonu onu klasik netcattan çok üstün kılıyor. Hızlı dosya transferi, şifreli bağlantı tüneli, log streaming, basit healthcheck servisleri… Bunların hepsi için ayrı ayrı araç kurmak yerine ncat yeterli oluyor çoğu durumda.

Tabii her şey için ncat kullanmak doğru değil. Kalıcı çözümler için gerçek servisler, VPN çözümleri veya amaç için tasarlanmış araçlar kullanılmalı. Ama geçici çözümler, hızlı testler ve debug senaryoları için ncat mükemmel. Bir sysadmin’in “evet bunu hızlıca halledebilirim” diyebilmesi için bu tür araçları iyi bilmesi gerekiyor.

Eğer hala ncyi kullanıyorsan, ncata bir şans ver. Öğrenme eğrisi neredeyse yok, ama kazanacakların çok.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir