Files
server-tools/ip_analyzer.py
uristalex b5a00025c2 test
2026-04-20 14:57:38 +03:00

139 lines
5.9 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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()