プロバイダーネットワークアドレスの識別

たまたま私は、多くの人と同じように景品が大好きです。 そして、ある時点で、それを確実にするために、プロバイダーに割り当てられたネットワークのアドレスを見つける必要がありました。 グーグルは単純で明確な答えを出さなかった。専門家が私の鼻を突いてくれたら嬉しい。 プロバイダーへの呼び出し、合理的な質問-「なぜ必要なのですか?」 お腹がすいた。

プロバイダーのネットワークには、かなり人気のあるDCハブがあります。 さらに、サブスクライバーのみがアクセスできます。 ここに出口があります!)

いずれかのgreylinkdc ++プログラムを使用した場合、おそらくハブへの接続をログに記録し、非常に重要なことに、IPクライアントがログに表示されることを覚えているでしょう。 このタイプのログ「 ip; nickname; hub; timestamp 」、つまり通常のcvsを解析しました。 さて、それは小さなスクリプト次第です。

#!/usr/bin/env python import re, cymruwhois from sys import argv, stdin from iptools import IpRange, IpRangeList private_nets = IpRangeList("10/8", "172.16/12", "192.168/16") ip_re = re.compile(r'^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])') def iprangelistappend(match, rangelist): rangelist.ips += (IpRange(match.prefix),) return (match.prefix, match.owner) def main(input): ips = sorted(set(ip_re.match(line).group(0) for line in input if ip_re.match(line))) ips = filter(lambda ip: ip not in private_nets, ips) public_nets = IpRangeList() whois = cymruwhois.Client() nets = (iprangelistappend(whois.lookup(ip), public_nets) for ip in ips if ip not in public_nets) for prefix, owner in nets: print prefix, owner if __name__ == "__main__": if len(argv) == 1: main(stdin) else: main(open(argv[2]))
      
      





ご覧のとおり、通常のライブラリに加えて、次のものが必要です。 結果は次のようになります。
109.171.0.0/17 ZSTTKAS JSC Zap-SibTranstelecom

176.196.0.0/15 ELIGHT-AS E-Light-Telecom

178.171.0.0/17 ELIGHT-AS E-Light-Telecom

195.161.0.0/16 RTCOMM-AS OJSC RTComm.RU

212.75.192.0/19 ELIGHT-AS E-Light-Telecom

46.180.0.0/15 ELIGHT-AS E-Light-Telecom

………

正当な質問をすることができます-出力に異なるプロバイダーがあるのはなぜですか? なぜ所有者を表示する必要があるのですか? 答えます。 サブネットを見落とす可能性を最小限に抑えるために、かなり長い期間スクリプトをフィードしたログ。 この間、アドレスの再配布が行われたと思います。 だから、誰が言っても、あなたはまだプロセスを制御する必要があります。

最後に、速度についてです。 チーム
 cat userip.log | grep 10.110.1.10 | cut -d";" -f 1 | ./exctract_nets.py;
      
      



私のcore-i5で、4418365レコードのログで、19秒で満たされます。 長い間結論が出ていなくても驚かないでください。



All Articles