tcpdump olmadan tcp bağlantılarını boşaltma


17

Centos kutusunda, tcp bağlantılarını boşaltmak istiyorum - Bir sunucunun belirli bir IP'ye istek göndermeye çalışıp çalışmadığını görmek istiyorum. Genellikle tcpdump hile yapar - ancak tcpdump yüklü değildir ve yazılım yüklemek bir seçenek değildir (şirket politikası nedeniyle). Korkarım netstat bana tek bir istek göstermeyecek.

Bu yüzden başka hangi seçeneklerim olduğunu merak ediyordum. Sunucuda root erişimim var.


Sunucuda root erişiminiz var mı?
user9517

Evet, root erişimim var.
Isaac

11
Ayrıca şirket politikasını düzeltmek için de çalışmalısınız. İşinizi yapmanıza engel olduğunda, politika bozulur.
Michael Hampton

1
Peki, değişim temelde bir FDA gereksinimini kontrol ediyor - bu yüzden bu hayatta değişeceğim hiçbir şey yok :)
Isaac

Yanıtlar:


15

Elbette var pythonmı?

from socket import * 
from struct import unpack 
import sys 

INTERFACE = "eth0"
TARGET = "8.8.8.8" 

if __name__ == "__main__": 
  sock = socket(AF_PACKET, SOCK_DGRAM, 0x0800) 
  sock.bind((INTERFACE, 0x0800)) 
  while True: 
    data = sock.recvfrom(1500, 0)[0] 
    ip = inet_ntop(AF_INET, data[12:16]) 
    if ip == TARGET: 
      print "GOT TARGET" 
      sys.exit(1)

Bu, IP adresi eşleşmeleri sağlayan "GOT TARGET" ile çıkar. Bir el sıkışma sırasında TCP'nin bir şey geri göndermesi gerektiğinden, bu, belirli bir hedef adresten herhangi bir şeyi yakalamalıdır. Yine de protokol TCP veya UDP olup olmadığını umurumda değil (ne de kontrol).

HEDEF ve ARAYÜZÜ değiştirmeyi unutmayın.


Ayrıca bir tcp syn paketini yakalamak için bunu nasıl değiştirirsiniz? Çünkü hedefe ulaşılamazsa, denenmiş ancak başarısız bir bağlantı gösterilmez.
Isaac

3
Bu komut dosyası yeni bir yazılım değil mi (yani sisteme yüklenmemelidir)?
Vi.

@Vi bu mantıkla, herhangi bir kabuk betiğinin 'yeni yazılım' olduğunu iddia edebilirsiniz. Bu, 'yazılımı' nasıl tanımladığınıza bağlıdır.
Matthew Ife

1
-1 Üzgünüm, bu korkunç bir çözüm. Bir tavuğu sadece bir makineli tüfekle öldürmekle kalmaz (zaten bir çözüm olanı yapmak için bir program yazarak), aynı zamanda sonsuz bir döngü - gereksiz yere CPU kaynaklarını tüketir (python işleminde bir yük çalıştırın ... Control-C tuşu!), kullanıcının sorusunu doğru bir şekilde çözemez: "GOT TARGET" e hem gelen hem de giden TCP bağlantılarına yanıt verecektir (kullanıcı "istek göndermeye çalışır ..." istedi). Sonunda başarı üzerine 1 (kabuğun başarısız olduğunu gösterir) ile çıkar.
Mike S

1
çok güzel, ancak bunun için yine de yükseltilmiş izinlere ihtiyacınız var. Ben varsocket.error: (1, 'Operation not permitted')
Grant Bowman

17

Gerçekten tcpdump almaya çalışırdım. Bununla birlikte, bir IP için belirli bir bağlantının olup olmadığını görmek için bazı alternatifler şunlardır:

strace:

[kbrandt@ny-kbrandt01: ~] strace -e trace=network nc 1.2.3.4 1234
...
socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) = 3
connect(3, {sa_family=AF_INET, sin_port=htons(1234), sin_addr=inet_addr("1.2.3.4")}, 16) = -1 EINPROGRESS (Operation now in progress)

lsof:

[kbrandt@ny-kbrandt01: ~] nc 1.2.3.4 1234 &
[1] 11434
[kbrandt@ny-kbrandt01: ~] lsof -p 11434
....
nc      11434 kbrandt    3u  IPv4 4543149      0t0     TCP 10.7.0.78:58886->1.2.3.4:search-agent (SYN_SENT)

netstat:

[kbrandt@ny-kbrandt01: ~] nc 1.2.3.4 1234 &
[1] 11486
[kbrandt@ny-kbrandt01: ~] sudo netstat -a -p | grep 11486
tcp        0      1 10.7.0.78:58891             1.2.3.4:search-agent        SYN_SENT    11486/nc

1
Bu benim umduğum cevaptı. Ne yazık ki strace kurulu değil: /
Isaac

Ben lsof deneyeceğim
Isaac

1
Sanırım orijinal poster cevabı sevdi, ama garip bir şekilde sorusunu cevaplamıyor ("... tcp bağlantıları - Bir sunucunun belirli bir IP'ye istek göndermeye çalışıp çalışmadığını görmek istiyorum ...). belirli bir işlem için size ağ bağlantısı bilgileri vermek ... belki o istiyor? Bu benim gibi bir makineden diğerine TCP bağlantıları hakkında bilgi arayanlar için bu hile olmayabilir. Ama bir dizi göstermek için sahne ağ bağlantılarınız hakkında bilgi toplamanızı sağlayan farklı kabuk komut örnekleri
Mike S

15

Iptables bir hata ayıklama yeteneğine sahiptir ve bu trafik analizi için de kullanılabilir.

Çözüm aşağıdaki URL'de açıklanmaktadır.

Iptables'da hata ayıklama kuralları

İzleme çıktısının istediğiniz bir dosyaya kaydedilmesini ayarlamak için aşağıdaki URL'yi okumaya değer.

http://backreference.org/2010/06/11/iptables-debugging/

Bu çözümü tcpdump'a eşit düşünmüyorum, ancak Centos'un minimal bir kurulumu kullanılarak yapılabilir. Diski günlüklerle doldurmamaya dikkat etmelisiniz, çünkü tcpdump disk kullanımında çok daha verimlidir. Gerekli olmadığında günlüğe kaydetmeyi kapatın.

Aşağıdakileri kodunuzda temel bir şablon olarak kullanabilirsiniz.

# Logging
log(){
SOURCE=a.b.c.d (IP address)
$IPT -A INPUT   -s $SOURCE -m limit --limit 50/minute -j LOG --log-level 7 --log-prefix "In: "
$IPT -A OUTPUT  -s $SOURCE -m limit --limit 50/minute -j LOG --log-level 7 --log-prefix "Out: "
$IPT -A FORWARD -s $SOURCE -m limit --limit 50/minute -j LOG --log-level 7 --log-prefix "Fw: "
$IPT -t nat -A POSTROUTING -m limit --limit 50/minute -j LOG --log-level 7 --log-prefix "Nat: "
}
#log  (remove comment to enable)

trace(){
iptables -t raw -A PREROUTING -p tcp  -j TRACE
iptables -t raw -A OUTPUT     -p tcp  -j TRACE
}
#trace (remove comment to enable)

8

İşinizi yapmak için özel bir yazılıma ihtiyacınız varsa ve buna izin verilmiyorsa, ya iyi bir iş vakası hazırlamıyorsunuz ya da fikirlerinizi doğru kişilere satmıyorsunuz ... ya da bu sistemin kontrolü sizde değil .. .

Bir şey yapmakla görevlendirildim ve bu durumda ihtiyacınız olan hata ayıklama / sorun giderme bilgilerine ihtiyaç duyduysam, doğru aracı kullanardım. Muhtemelen tcpdumpya da tshark. Evet, bunlar bir yazılım parçası, ama onları daha gerekli araçlar olarak görüyorum . Aslında, sisteme geçici olarak kurulabilen veya yüklenebilen ve olaysız kaldırılabilen yardımcı programlardır (çıkarılabilir medya bir seçenek midir? ... ipucu )

Ancak mesele şudur ki, şirket politikasının önemsiz bir çözümü muhtemelen bu kullanım durumu için onay almaktan daha fazla çaba gerektirir.


Doğru iş için doğru aracı kullanmayı tamamen kabul ediyorum. Aslında, yazılım yükleyebilirim, ancak değişiklik kontrolünü kullanmalıyız, bu yüzden süreç birkaç gün sürüyor - şu anda döküme ihtiyacım vardı, bu yüzden yükleme bir seçenek değildi. Sadece bazı seçenekleri henüz düşünmedim gözden kaçan olup olmadığını merak ediyordum.
Isaac

:( değişim yönetimi hakkında. Politik bir oyun oynamanın ve çöplükten faydalanacak insanları / partileri değişim yönetimi sürecini hızlı bir şekilde izlemenin bir yolu var mı?
ewwhite

1
Korkmuyorum - ama değişim yönetimi ve aynı zamanda tcpdump gerektiren müşteri olduğu için, gerçekleri kabul etmek zorunda kalacak. Onu her şekilde mutlu edebilmeyi umuyordum.
Isaac

3
@wwhite: Herhangi bir iyi değişiklik yönetimi politikası, belirli süreçlerin veya sınıfların değişikliklerinin tüm sürecin tamamından muaf tutulmasını sağlamalıdır. Bu olmazsa ....
Scott Pack

2
Statik olarak bağlanmış tcpdumpbaşka bir yerde derleyemez ve / tmp dosyasına kopyalayıp oradan koşamaz mısınız?
che

5

Kyle harika seçenekler sundu. Bir tane daha kullanmak olacaktır iptables:

[james@server ~]$ sudo iptables -I OUTPUT -d 1.2.3.4/32
...
[james@server ~]$ sudo iptables -L OUTPUT -n -v
Chain OUTPUT (policy ACCEPT 105 packets, 35602 bytes)
 pkts bytes target  prot opt in  out  source      destination
   87 33484 LOG     all  --  *   *    0.0.0.0/0   1.2.3.4     LOG flags 0 level 4

Bu aslında bir muhasebe kuralıdır. Trafiğe açıkça izin vermez veya reddetmez, bu nedenle ÇIKIŞ zinciri için varsayılan politika kullanılır (varsayılan olarak KABUL ET). Ancak eşleşen paketler kural için sayaçları artıracaktır.

İsteğe bağlı olarak, paketle ilgili ayrıntıları isteğe bağlı olarak da kaydedebilirsiniz -j LOG:

[james@server ~]$ sudo iptables -I OUTPUT -d 1.2.3.4/32 -j LOG
...
[james@server ~]@ dmesg | grep 1.2.3.4 | tail -1
IN= OUT=eth0 SRC=192.168.1.1 DST=1.2.3.4 LEN=100 TOS=0x10 PREC=0x00 TTL=64 ...

Günlükler çekirdek kayıt tesisine gidecektir, bu nedenle Red Hat türevlerinde / var / log / mesajlarında ve Debian türevlerinde /var/log/kern.log'da görünmelidir. Ayrıca dmesggösterildiği gibi çıktısında da görülebilir . Farklı olarak tcpdump, bununla birlikte, bu paketin tam içeriğini, paket başlığının yalnızca içeriklerini giriş olmayacaktır.


Ben iptables kendi kendime düşünüyordum, ama aynı zamanda yüklü değil:. Her neyse, güzel bir çözüm.
Isaac

3

Sunucunuz belirli bir IP'ye bağlandığından, sizin de bilginiz olan bir bağlantı noktasına olacağını sanıyorum?

Her durumda netstatveya ssistediğinizi yapmak için tasarlanmıştır. Her iki komutla da aynısını yapabilirsiniz:

netstat -n -t | awk '{print $5}' | grep A.B.C.D:n
ss      -n -t | awk '{print $5}' | grep A.B.C.D:n

burada A.B.C.Dbir IPv4 adresini ve n sunucunuzun uzak tarafta bağlandığı bir bağlantı noktası numarasını temsil eder. Örneğin:

ss      -n -t | awk '{print $5}' | grep 10.137.54.22:3389

Veya sadece bağlantının yapıldığını bilmek istiyorsanız:

ss      -n -t | awk '{print $5}' | grep -q 10.137.54.22:3389 && echo "CONNECTION MADE"

Bağlanmaya çalıştığınız bağlantı noktası numarasını bilmiyorsanız, TCP veri ve ACK paketleri için konuşmanın her iki tarafında bir bağlantı noktası açacağından iş daha zor olacaktır. Bu durumda, herhangi bir bağlantının yapılıp yapılmadığını göstermek için IP adresinin grep komutunu kullanabilirsiniz.

Son olarak, izleme aracı olarak kullanmak için bunu kalbinizin içeriğine dönüştürebilirsiniz:

while true; do
    ss -n -t | awk '{print $5}' | grep -q A.B.C.D:n && \
        echo "CONNECTION MADE" && \
        exit 0
    sleep 1
done

Yükseltilmiş çekirdek ayrıcalıklarına ihtiyaç duymadan izlemek için harika bir yol.
Grant Bowman
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.