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/bashasla production’da kullanma. Test ortamında bile dikkatli ol. Bu, bağlanan herkese shell erişimi veriyor.- Her zaman
--allowveya--allowfilekullan. Herkese açık birncatlistener bırakmak güvenlik ihlalidir. - SSL kullanıyorsan sertifikaları koru. Private key dosyalarının izinleri
600olmalı. - Firewall’u unutma.
ncatın kendi erişim kontrolü ikinci bir savunma katmanı, birincil koruma hala firewall. - Log tut.
-vflag’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.
