Pull to refresh

Выявление адресов сетей провайдера

Reading time2 min
Views8.1K
Так уж вышло, что я, как и многие, люблю халяву. И в один прекрасный момент, для обеспечения онной, мне понадобилось узнать адреса сетей закреплённых за моим провайдером. Гугл простого и однозначного ответа не дал, буду рад если знатоки ткнут меня носом. Звонок провайдеру, порождающий резонный вопрос — «а зачем вам?» — отпадал. Пришлось изголяться.
В сети нашего провайдера действует довольно-таки популярный 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]))

Как видно, помимо штатных библиотек нам понадобятся:
  • iptools — для работы с ip-адресам
  • cymruwhois — whois-клиент
Результат выглядит примерно так:
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 секунд. Так что не удивляйтесь если долго не увидите вывода.
Tags:
Hubs:
0
Comments7

Articles