マップでIP接続をマークする

こんにちは



自宅でDebianをゲートウェイとして実行しているAtomの通常のコンピューターを使用していることが起こりました。 このため、ファイルストレージ、トレントのダウンロード、個人リポジトリなど、多くの追加機能を実行します。 しかし、これは重要ではありません。 トレントクライアントの存在は、比較的多数の接続を意味し、「すべてを視覚化する必要がありますか?」というアイデアが生まれました。

すぐに解決策が見つかりました:xplanet(マーカーが付いた地球の画像を描画できます)+ geoip(IP->座標)。



カスタマイズ



ジオイプ


プロジェクトはgithub.com/appliedsec/pygeoipでホストされています 。 インストールに問題はありません。唯一のことは、データベースを個別にダウンロードする必要があることです: www.maxmind.com/download/geoip/database/GeoLiteCity.dat.xz (プロジェクトwikiから確認できます)およびpython-sixを個別に配信する。 ゲートウェイでテスト中の配布ブランチがあり、このパッケージはリポジトリにあります(安定ブランチにはありません。振る必要があります)。 他のディストリビューションでもリポジトリに含まれている可能性があります。

このAPIを使用すると、たとえば、都市名、国、郵便番号など、さまざまな情報を受信できますが、関心があるのは座標のみです。



xplanet


リポジトリからインストールされました。 インストール後に行う必要がある最初のことは、構成を修正することです(/ etc / xplanet / config / defaultにあります)。つまり、マーカーでファイルの名前を指定します。ファイルは使用できません。 これを行うには、[Earth]セクションで次を指定します。

marker_file=[ ]









すべてをまとめる



これで、すべてを1つの全体に収集することができます。 次のコマンドを使用して、すべての接続のリストを取得できます。

 netstat -ntp
      
      





簡単な説明:-n-名前ではなくIPアドレスを表示します、t-tcp接続、p-プロセスの名前とPIDを表示します(自分だけでなくすべてのプロセスの名前を表示するには、sudoを使用する必要があります)。 次に、不要なもの(ヘッダーとipv6)をすべて除外します。

 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
      
      







さて、残りの作業を行うのはpythonスクリプトの番です。

 #!/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
      
      







これで、結果を楽しんだり、 何が起こるかの例を見ることができます PIDのない接続は、すべての種類のTIME_WAITなどです。



この実装には欠陥がないわけではありません。 たとえば、色は円で繰り返され、2番目または3番目の円に入ると、マーカーのサイズが正しく表示されない場合があります。 色はキーの一部です。 何が起こっても、ユニークな色を生成する必要がありますが、少数のプロセスで、このアプローチは存在する権利があります。

マップの連続描画が必要な場合は、開始回数を制限せずに、ターミナルに縛られることなく、xplanetを実行できます。 その後、特定の頻度でマーカー(たとえば、cron)でファイルを更新するだけで十分です。



ただし、この例は、より複雑/単純な実装の優れたベースとして機能します。



All Articles