This commit is contained in:
uristalex
2026-04-20 14:57:38 +03:00
parent 9a3fd011fa
commit b5a00025c2
2 changed files with 212 additions and 0 deletions

139
ip_analyzer.py Normal file
View 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()