मानचित्र पर आईपी कनेक्शन को चिह्नित करें

शुभ दोपहर

ऐसा हुआ कि घर पर मैं डेबियन को गेटवे के रूप में चल रहे एटम पर एक नियमित कंप्यूटर का उपयोग करता हूं। इस वजह से, यह कई अतिरिक्त कार्य करता है: फ़ाइल भंडारण, टोरेंट डाउनलोड करना, एक व्यक्तिगत भंडार, आदि। लेकिन यह महत्वपूर्ण नहीं है। एक धार ग्राहक की उपस्थिति का तात्पर्य अपेक्षाकृत बड़ी संख्या में कनेक्शन से है, और यह विचार उत्पन्न हुआ: "लेकिन क्या सभी की कल्पना नहीं की जानी चाहिए?"।
एक समाधान काफी जल्दी मिल गया था: xplanet (आपको उस पर मार्कर के साथ पृथ्वी की एक छवि खींचने की अनुमति देता है) + जियोइप (आईपी -> निर्देशांक)।

समायोजन


GeoIP

परियोजना को github.com/appliedsec/pygeoip पर होस्ट किया गया है। स्थापना के साथ कोई समस्या नहीं है, केवल एक चीज यह है कि आपको डेटाबेस को अलग से डाउनलोड करने की आवश्यकता है: www.maxmind.com/download/geoip/database/GeoLiteCity.dat.xz (जिसे आप प्रोजेक्ट विकी से पता कर सकते हैं) और अलग से अजगर-छह वितरित कर सकते हैं। मेरे पास गेटवे पर परीक्षण के तहत वितरण शाखा है, और यह पैकेज रिपॉजिटरी में है (यह स्थिर शाखा में नहीं है, मुझे हाथ मिलाना होगा)। अन्य वितरणों के भी रिपॉजिटरी में होने की संभावना है।
यह एपीआई आपको विभिन्न जानकारी प्राप्त करने की अनुमति देता है, उदाहरण के लिए: शहर का नाम, देश, ज़िप कोड, आदि, लेकिन हम केवल निर्देशांक में रुचि रखते हैं।

xplanet

इसे भंडार से स्थापित किया गया था। स्थापना के बाद जो पहली चीज़ करनी है, वह है विन्यास को सही करने के लिए (मेरे पास इसमें स्थित: / etc / xplanet / config / default), अर्थात्, मार्कर के साथ फ़ाइल का नाम निर्दिष्ट करें, जिसे हम नक्शे पर इंगित करेंगे, स्टार्टअप पर एक विकल्प के रूप में, इसका स्थान निर्दिष्ट करें। फ़ाइल संभव नहीं है। ऐसा करने के लिए, [पृथ्वी] अनुभाग में, निर्दिष्ट करें:
marker_file=[ ]


यह सब एक साथ रखना


अब आप एक पूरे में सब कुछ एकत्र करने के लिए आगे बढ़ सकते हैं। कमांड के साथ सभी कनेक्शनों की एक सूची प्राप्त की जा सकती है:
 netstat -ntp 

थोड़ा स्पष्टीकरण: -n - आईपी पता प्रदर्शित करता है, नाम नहीं, टी-टीसीपी कनेक्शन, पी - प्रक्रिया का नाम और पीआईडी ​​प्रदर्शित करता है (सभी प्रक्रियाओं के नाम देखने के लिए, न केवल अपने खुद के, आपको sudo का उपयोग करना होगा)। अगला, सभी अनावश्यक (हेडर और आईपीवी 6) को फ़िल्टर करें:
 sudo netstat -ntp | grep tcp | grep -v :: 

नीचे एक छोटी स्क्रिप्ट है जो काम का हिस्सा है।
 #!/bin/sh #   ,     netstat'a STAT_FILE=`mktemp` #     MARKER_FILE="ipm" sudo netstat -nutp | grep tcp | grep -v :: > $STAT_FILE #           ./net_draw.py $STAT_FILE > $MARKER_FILE #   . # -output p.jpg -    # -geometry 1920X1080 -  # -projection rectangular -  ,    . # -longitude 15 -       (    "") # -num_times 1 -   1  # -quality 100 -   xplanet -output p.jpg -geometry 1920X1080 -projection rectangular -longitude 15 -quality 100 -num_times 1 #      rm $STAT_FILE 


अब यह अजगर स्क्रिप्ट की बारी है जो बाकी काम करेगी।
 #!/usr/bin/env python # -*- coding: utf-8 -*- import pygeoip import sys input_file = sys.argv[1] #    gi = pygeoip.GeoIP("GeoLiteCity.dat") marker_map = {} #   -   # :     class Col: def __init__(self): #  ,     self.c_id = 0 #     self.color_map = {} #    self.colors = ["White", "Red", "Green", "Yellow", "Purple", "Brown", "Blue", "Pink", "Gray", "Orange"] def get_color(self,id): if id in self.color_map: return self.color_map[id] self.color_map[id] = self.colors[self.c_id] self.c_id = self.c_id + 1 #  ,    if self.c_id == len(self.colors): self.c_id = 0 return self.color_map[id] c_c = Col() i_f = open(input_file, 'r') for l in i_f: #      fields = l.split() #    IP  pos = fields[4].find(':') ip = fields[4][:pos] gi_pos = gi.record_by_addr(ip) #   name = fields[6] #     ,     None if gi_pos != None: color = c_c.get_color(name) marker_id = "%5.2f %5.2f \"\" color=%s" % (gi_pos['latitude'], gi_pos['longitude'],color) #         ,    ,   2 if marker_id in marker_map: marker_map[marker_id] = marker_map[marker_id] + 1 else: marker_map[marker_id] = 2 #   for mid in marker_map: print (mid + " symbolsize=%d" % marker_map[mid]) #    , x, y -   x = 0 y = 50 for key in c_c.color_map: print ("%5.2f %5.2f \"%s\" color=%s" % (x, y, key, c_c.color_map[key])) x = x - 2.5 y = y + 0 


अब आप परिणाम का आनंद ले सकते हैं या क्या होता है इसका एक उदाहरण देख सकते हैं पीआईडी ​​के बिना कनेक्शन सभी प्रकार के TIME_WAIT और अन्य हैं।

यह कार्यान्वयन दोषों के बिना नहीं है। उदाहरण के लिए, रंगों को एक सर्कल में दोहराया जाता है और दूसरे या यहां तक ​​कि तीसरे सर्कल में प्रवेश करते समय, मार्करों का आकार सही ढंग से नहीं हो सकता है, क्योंकि रंग कुंजी का हिस्सा है। जो कुछ भी होता है, यह अद्वितीय रंग उत्पन्न करने के लिए आवश्यक है, लेकिन बहुत कम प्रक्रियाओं के साथ, इस दृष्टिकोण को अस्तित्व का अधिकार है।
यदि मानचित्र के निरंतर ड्राइंग की आवश्यकता होती है, तो टर्मिनल की सीमा के बिना शुरू किए बिना और शुरू किए बिना xplanet को चलाना संभव है। फिर यह केवल एक निश्चित आवृत्ति के साथ मार्कर (उदाहरण के लिए, क्रोन) के साथ फ़ाइल को अपडेट करने के लिए पर्याप्त है।

हालाँकि, यह उदाहरण अधिक जटिल / सरल कार्यान्वयन के लिए एक अच्छे आधार के रूप में काम कर सकता है।

Source: https://habr.com/ru/post/In143504/


All Articles