Linux iptables ile, giden bir bağlantı başlatan işlem / komut adını kaydetmek mümkün müdür?


27

Bir Linux masaüstünde giden bağlantılar başlatan işlemleri takip etmek istiyorum. Bulabileceğim en iyisi şudur:

iptables -A OUTPUT -m state --state NEW -j LOG --log-uid

Bu, bağlantıyı başlatan uid / gid'i kaydeder, ancak proses / komut adını veya hatta pid'i kaydetmez. Pid'i yeni alabilirsem, muhtemelen günlük yazıldığında işlem ismini çeken bir senaryo yazabilirim ama bu mümkün bile değil gibi görünüyor.

İdeal olarak, gelen bağlantıları kabul eden işlemleri de kaydetmek isterim.

Bunun Linux kutusundaki iptables [veya başka herhangi bir şey] ile nasıl mümkün olabileceği hakkında bir fikriniz var mı?


Ben (tamamen emin değil) bu sorunun serverfault üzerinde cevaplandığına inanıyorum, bakın.
niXar

Şahsen, bu iş için sysdig kullanırım .
Charles Duffy

Yanıtlar:


7

Çıkışı şuna benzeyen / proc / net / tcp programını izlemek için bir program yazabilirsiniz:

obi-wan ~ # cat /proc/net/tcp
  sl  local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode
   0: 00000000:0050 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 4847458 1 e6060560 300 0 0 2 -1
   1: 00000000:04D2 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 4847477 1 f2e64da0 300 0 0 2 -1
   2: 00000000:0016 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 7109 1 f2e65ac0 300 0 0 2 -1
   3: 0100007F:177A 00000000:0000 0A 00000000:00000000 00:00000000 00000000  1000        0 4864457 1 d2726540 300 0 0 2 -1
   4: 00000000:01BB 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 4847462 1 e60609c0 300 0 0 2 -1
   5: 6B00A8C0:0016 30F4B5CA:C3AB 01 00000044:00000000 01:00000031 00000000     0        0 4982752 3 f2e64940 55 4 0 2 -1
   6: 0100007F:B143 0100007F:BC5E 01 00000000:00000000 00:00000000 00000000  1000        0 2130283 1 d59cce40 21 4 1 2 -1
   7: 0100007F:BC5E 0100007F:B143 01 00000000:00000000 00:00000000 00000000  1000        0 2130285 1 d59cd2a0 21 4 0 2 -1
   8: 6B00A8C0:0016 3276C35B:8E11 01 00000000:00000000 02:000ADAB1 00000000     0        0 4982629 2 d2727260 40 4 8 2 2
   9: 6B00A8C0:0016 6500A8C0:DD5D 01 00000538:00000000 01:00000029 00000000     0        0 4864416 5 e6061b40 42 12 27 3 -1

Daha sonra açılan bağlantı noktalarını, her işlem için listelenen dosya tanımlayıcılarına okuma bağlantısı yaparak, işlemlere ve dosya tanımlayıcılarına geri dönebilecek şekilde inode'larla ilişkilendirebilirsiniz:

obi-wan ~ # readlink /proc/28850/fd/3
socket:[4847458]

Buraya bakın, 4847458 numaralı inod, yukarıdaki listedeki ilk tcp soketine karşılık geliyor. Netstat -tapn'ın çıktısı bunu benim için doğrular (ve şunu hatırlayın: 0x50 == 80):

obi-wan ~ # netstat -tapn
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN     28850/cherokee-work

İzleme programı / proc / net / tcp dosyasında bir değişiklik fark ettiğinde, verileri ayrıştırın ve değişikliğin yeni açılan bir soket olup olmadığını belirleyin. Ardından / proc içinde listelenen her bir işlem için tüm dosya tanımlayıcılarını numaralandırabilir ve eşleşen inode'u bulmak için her birindeki okuma bağlantısını yapabilirsiniz. Bunu bulduğunuzda, özellikle işlem yapmak için hesabınız varsa, isteyebileceğiniz herhangi bir şeyi alabileceğiniz bir satın alma talebiniz vardır.

Bildiriminizin anlık olması gerekmiyorsa, monitör programınız yavaş bir anket kullanabilir (belki 50ms veya 100ms, hatta 1000ms).


2
Bir seçenek sunduğunuz için teşekkür ederiz! Ancak her seferinde her açık dosya tanımlayıcısını sorgulamak ve sorgulamak çok sağlam değildir ve çok verimsizdir. Hala birisinin daha iyi bir çözüm bulacağını ya da neden artık iptables'ın bir parçası olmadığını ve neden --cmd sahibinin kararsız olduğunu açıklığa kavuşturacağını umuyorum.
nealmcb,

Çekirdek / proc düzenini değiştirmezse veya netstat ve readlink veya ps değişikliği olmadıkça (pek mümkün değilse), bunun oldukça sağlam olduğunu söyleyebilirim. Ne tür verimlilik sorunlarıyla ilgileniyorsunuz? Anlık işlem yapmak istiyorsanız, iptables ile kullanmak için bir çekirdek modülü yazmanız gerekir.
Ben Collins

Reddedilen bağlantıları günlüğe kaydedersem soket hemen çekirdek tarafından yok edilir, bu yüzden / proc içinde görme şansım çok az. Belki de bağlantı zaman aşımına
uğrayacak şekilde REJECT'i

Süper küçük zaman penceresinin bu senaryosunda bu işe yaramaz, ancak ayrıştırma / işlemcinin kırılganlığı giderildiği sürece, yalnızca "lsof -F -i" komutunu kullanabilir ve ağdan hoş bir şekilde soyutlanmış bir dökümü alabilirsiniz. veri. Bu da filtrelenebilir (yalnızca belirli bir bağlantı noktasında) ve sizin için tüm dosya adı / pid / kullanıcı eşleştirmesini yaptı.
dannysauer 12:15 te

9

Yalnızca OUTPUT zincirinde (ve belki PREROUTING ...?) Çalışan sahip eşleştirme modülünü istiyorsunuz. Dokümanları okuyun, ancak böyle bir şey çalışacaktır:

iptables --append OUTPUT -m owner --cmd-owner "$app" \
--jump LOG --log-level DEBUG --log-prefix "OUTPUT $app packet died: "

1
Bir iptables log komutu bir değişkeni bu şekilde ayarlayıp enterpolasyon yapabilir mi? Benim için işe yaramadı. Ayrıca, --cmd-sahibi seçeneği çekirdek> = 2.6.15'te kaldırılmıştır. Bu talihsiz bir durum çünkü faydalı bir seçenek gibi görünüyor.

4
Evet, --cmd sahibi kaldırıldı: "
düzeltilemez

1
Bilgi için teşekkürler, @guettli. Permalink.gmane.org/… adresinde daha fazla özellik belirtiliyor: “[NETFILTER]: ipt {, 6} sahibindeki görev listesinden_Cervisyonu kaldır; düzeltilemediğinden kırıldığından ve durduğundan beri cmd / sid / pid eşleşmesini yok et kilitlemenin yolu tasklist_lock olarak değişir. " Ama yine de biraz daha arka plan veya daha iyi alternatifler istiyorum.
nealmcb

5

İptables veya logging ile ilgisi yok; ama burada / proc / dizinini yoklayan ve program / pid başına bant genişliğini görüntüleyen "top" benzeri bir arayüz var:

http://sourceforge.net/projects/nethogs

"NetHogs küçük bir 'net top' aracıdır. Çoğu araç gibi protokol başına veya alt ağ başına trafiği kesmek yerine, bant genişliğini işlemlere göre gruplandırır. NetHogs yüklenecek özel bir çekirdek modülüne güvenmez."


Nethogs'un güvenilmez istatistikler verdiğini fark ettim, ancak üstüne 2 (+ netatop) bunu iyi yapıyor.
Tobu

1

Benzer bir soru ararken, skype hızını sınırlamaya çalışırken, buldum

$ netstat -p | grep <mycmdname>

port numarasını pid / cmd'ye bağlamanın iyi bir yoludur, şimdi pid-sahibi / cmd-sahibi artık iptables'da doğrudan desteklenmemektedir; daha sonra sonucu ayrıştırmanız, sonra iptables kuralını bağlantı noktasına göre eklemeniz gerekir; doğal olarak sonradan / sistem kapandığında / yeniden başlatıldığında, bazı temizleme kodlarına ihtiyacınız olacak; port numarasını / s temizleme zamanında başvuru için bir dosyaya kaydedin

Aslında port numaraları sorusuna iyi bir cevap

$ sudo netstat -p | grep "tcp.*<mycmdname>" | sed -r "s/.*<MYCOMPUTER>:([0-9]+).*/\1/"`

grep tcp öğesini gereksinimlerinize göre ayarlamanız gerekebilir

o zaman benim amaçlarım için, port numaralarına göre tc u32 filtreleri eklemek, port numaralarına göre iptables girişlerini eklemek en basittir.

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.