test
This commit is contained in:
139
ip_analyzer.py
Normal file
139
ip_analyzer.py
Normal file
@@ -0,0 +1,139 @@
|
||||
import argparse
|
||||
import socket
|
||||
import subprocess
|
||||
import platform
|
||||
import json
|
||||
import urllib.request
|
||||
import urllib.error
|
||||
import concurrent.futures
|
||||
|
||||
|
||||
def get_ip_info(ip):
|
||||
"""Получает общую информацию об IP через ip-api.com"""
|
||||
url = f"http://ip-api.com/json/{ip}?fields=status,message,country,countryCode,region,regionName,city,zip,lat,lon,timezone,isp,org,as,query"
|
||||
try:
|
||||
# Притворяемся браузером, чтобы избежать блокировок
|
||||
req = urllib.request.Request(url, headers={'User-Agent': 'Mozilla/5.0'})
|
||||
with urllib.request.urlopen(req, timeout=10) as response:
|
||||
data = json.loads(response.read().decode())
|
||||
return data
|
||||
except Exception as e:
|
||||
return {"error": str(e)}
|
||||
|
||||
|
||||
def check_ping(ip, count=4):
|
||||
"""Измеряет средний пинг до сервера с помощью системной утилиты ping"""
|
||||
# Выбираем правильный параметр в зависимости от ОС: Windows использует -n, Linux/Mac -c
|
||||
param = '-n' if platform.system().lower() == 'windows' else '-c'
|
||||
command = ['ping', param, str(count), ip]
|
||||
|
||||
try:
|
||||
output = subprocess.check_output(command, stderr=subprocess.STDOUT, universal_newlines=True)
|
||||
return output
|
||||
except subprocess.CalledProcessError as e:
|
||||
return e.output
|
||||
except Exception as e:
|
||||
return str(e)
|
||||
|
||||
|
||||
def check_port(ip, port, timeout=2):
|
||||
"""Проверяет доступность определенного TCP-порта"""
|
||||
try:
|
||||
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
|
||||
sock.settimeout(timeout)
|
||||
result = sock.connect_ex((ip, port))
|
||||
return result == 0
|
||||
except Exception:
|
||||
return False
|
||||
|
||||
|
||||
def check_dnsbl(ip):
|
||||
"""Проверяет IP в популярных базах DNSBL (спам-базы и черные списки)"""
|
||||
dnsbl_lists = [
|
||||
"zen.spamhaus.org",
|
||||
"b.barracudacentral.org",
|
||||
"bl.spamcop.net",
|
||||
"cbl.abuseat.org",
|
||||
"dnsbl.sorbs.net"
|
||||
]
|
||||
|
||||
# Разворачиваем IP для DNS-запроса (например: 1.2.3.4 -> 4.3.2.1)
|
||||
try:
|
||||
reversed_ip = ".".join(reversed(ip.split(".")))
|
||||
except Exception:
|
||||
return {"error": "Неверный формат IP-адреса для проверки в DNSBL"}
|
||||
|
||||
results = {}
|
||||
for dnsbl in dnsbl_lists:
|
||||
query = f"{reversed_ip}.{dnsbl}"
|
||||
try:
|
||||
# Если IP в базе, DNS вернет loopback адрес (обычно 127.0.0.x)
|
||||
answers = socket.gethostbyname(query)
|
||||
results[dnsbl] = f"В ЧЕРНОМ СПИСКЕ (ответ: {answers})"
|
||||
except socket.gaierror:
|
||||
# Имя не разрешено, значит IP нет в базе, он чист
|
||||
results[dnsbl] = "Чисто"
|
||||
except Exception as e:
|
||||
results[dnsbl] = f"Ошибка проверки: {e}"
|
||||
|
||||
return results
|
||||
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(description="Скрипт для подробного анализа IP-адреса сервера.")
|
||||
parser.add_argument("ip", help="IP-адрес для анализа")
|
||||
args = parser.parse_args()
|
||||
ip = args.ip
|
||||
|
||||
print(f"{'=' * 50}")
|
||||
print(f"Анализ IP-адреса: {ip}")
|
||||
print(f"{'=' * 50}\n")
|
||||
|
||||
# 1. Информация о локации и провайдере
|
||||
print("[*] 1. Получение общей информации и геолокации...")
|
||||
info = get_ip_info(ip)
|
||||
if info.get('status') == 'success':
|
||||
print(f" Страна: {info.get('country')} ({info.get('countryCode')})")
|
||||
print(f" Регион: {info.get('regionName')}, {info.get('city')} {info.get('zip', '')}")
|
||||
print(f" Временная: {info.get('timezone')}")
|
||||
print(f" Координаты: Lat: {info.get('lat')}, Lon: {info.get('lon')}")
|
||||
print(f" Провайдер: {info.get('isp')}")
|
||||
print(f" Организация: {info.get('org')}")
|
||||
print(f" AS: {info.get('as')}")
|
||||
else:
|
||||
print(f" Не удалось получить информацию. Ответ: {info}")
|
||||
|
||||
# 2. Проверка популярных портов
|
||||
print("\n[*] 2. Проверка доступности портов (Сервисы)...")
|
||||
ports_to_check = {'HTTP (80)': 80, 'HTTPS (443)': 443, 'SSH (22)': 22, 'RDP (3389)': 3389, 'FTP (21)': 21}
|
||||
with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
|
||||
future_to_port = {executor.submit(check_port, ip, port): name for name, port in ports_to_check.items()}
|
||||
for future in concurrent.futures.as_completed(future_to_port):
|
||||
port_name = future_to_port[future]
|
||||
try:
|
||||
is_open = future.result()
|
||||
status = "Открыт" if is_open else "Закрыт / Заблокирован Firewall"
|
||||
print(f" Порт {port_name:12}: {status}")
|
||||
except Exception as e:
|
||||
print(f" Порт {port_name:12}: Ошибка проверки ({e})")
|
||||
|
||||
# 3. Базы блокировок
|
||||
print("\n[*] 3. Проверка по базам блокировок (DNSBL / Spamhaus)...")
|
||||
dnsbl_results = check_dnsbl(ip)
|
||||
if "error" in dnsbl_results:
|
||||
print(f" {dnsbl_results['error']}")
|
||||
else:
|
||||
for db, res in dnsbl_results.items():
|
||||
print(f" {db:25}: {res}")
|
||||
|
||||
# 4. Проверка пинга
|
||||
print("\n[*] 4. Измерение пинга до локации (ICMP)...")
|
||||
ping_result = check_ping(ip)
|
||||
# Выводим результат пинга с небольшим отступом для красоты
|
||||
for line in ping_result.splitlines():
|
||||
if line.strip():
|
||||
print(f" {line}")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user