package infosecmodules

import (
	"rubric/utils"
)

var NetsecModule = Module{
	Key:         "netsec",
	Aliases:     []string{"ns", "network", "сетьбез"},
	Title:       "Сетевая безопасность",
	Description: "Сканирование, анализ трафика, IDS/IPS, VPN, сегментация сети",
	Run:         showNetsec,
}

func showNetsec() {
	utils.Header("InfoSec — Сетевая безопасность")

	utils.Section("Сетевая разведка и сканирование")
	utils.Code(`# nmap — сетевой сканер:
nmap 192.168.1.1                     # базовое сканирование
nmap 192.168.1.0/24                  # сканировать подсеть
nmap -sV 192.168.1.1                 # определить версии сервисов
nmap -sV -sC 192.168.1.1            # + скрипты по умолчанию
nmap -p 22,80,443 192.168.1.1       # конкретные порты
nmap -p 1-1000 192.168.1.1          # диапазон портов
nmap -p- 192.168.1.1                # все 65535 портов
nmap -A 192.168.1.1                  # OS, версии, скрипты, traceroute
nmap -O 192.168.1.1                  # определить ОС
nmap -sn 192.168.1.0/24             # только ping sweep (без портов)
nmap -sS 192.168.1.1                 # SYN scan (stealth, нужен root)
nmap -sU -p 53,161 192.168.1.1     # UDP сканирование
nmap -Pn 192.168.1.1                # не пинговать перед сканом
nmap --script vuln 192.168.1.1      # проверка уязвимостей
nmap -oA results 192.168.1.1        # сохранить в 3 форматах

# masscan — очень быстрое сканирование:
masscan -p80,443 192.168.0.0/16 --rate=10000

# rustscan — быстрый сканер на Rust:
rustscan -a 192.168.1.1 -- -sV -sC`)

	utils.Section("Анализ трафика")
	utils.Code(`# tcpdump — захват пакетов в CLI:
tcpdump -i eth0                          # всё с интерфейса
tcpdump -i eth0 port 80                  # только HTTP
tcpdump -i eth0 host 192.168.1.10       # к/от хоста
tcpdump -i eth0 'tcp and port 443'      # HTTPS
tcpdump -i eth0 -w capture.pcap         # сохранить в файл
tcpdump -r capture.pcap                 # читать файл
tcpdump -i eth0 -n -A port 80          # без разрешения имён, ASCII
tcpdump -i eth0 'tcp[tcpflags] & tcp-syn != 0'  # SYN пакеты

# Фильтры BPF (Berkeley Packet Filter):
host 10.0.0.1                    # хост
net 192.168.1.0/24               # подсеть
port 22                          # порт
tcp / udp / icmp                 # протокол
src host 10.0.0.1                # только источник
dst port 80                      # только назначение
not port 22                      # исключить SSH`)

	utils.Println(utils.ColorBold + "Wireshark — GUI анализ:" + utils.ColorReset)
	utils.Code(`# Фильтры дисплея Wireshark:
ip.addr == 192.168.1.1           # IP
tcp.port == 80                   # порт
http                             # только HTTP
http.request.method == "POST"    # POST запросы
tls.handshake                    # TLS handshake
!(arp or dns)                    # исключить ARP и DNS
tcp.flags.syn == 1               # SYN пакеты
frame contains "password"        # строка в пакете
tcp.analysis.retransmission      # ретрансмиссии

# Tshark — CLI версия Wireshark:
tshark -i eth0 -f "port 80" -w output.pcap
tshark -r capture.pcap -T fields -e ip.src -e http.host`)

	utils.Section("IDS/IPS — системы обнаружения вторжений")
	utils.Code(`IDS (Intrusion Detection System) — обнаруживает, уведомляет
IPS (Intrusion Prevention System) — обнаруживает И блокирует

Типы:
  NIDS — сетевой (анализирует трафик)
  HIDS — хостовый (файлы, логи, процессы)
  Signature-based — сравнение с известными паттернами
  Anomaly-based   — отклонение от нормы (ML)

Snort — популярный NIDS/IPS:
  snort -i eth0 -c /etc/snort/snort.conf
  snort -r capture.pcap -c /etc/snort/snort.conf

# Правило Snort:
alert tcp any any -> $HOME_NET 22 (
    msg:"Brute force SSH";
    flow:to_server;
    threshold:type both, track by_src, count 5, seconds 60;
    sid:1000001; rev:1;
)

Suricata — современная замена Snort:
  Многопоточный, поддерживает Lua-скрипты, YAML-конфиг

OSSEC / Wazuh — HIDS:
  Анализ логов, мониторинг файловой системы (FIM),
  мониторинг реестра Windows, активный ответ`)

	utils.Section("Брандмауэры и сегментация")
	utils.Code(`Типы файрволов:
  Packet Filter    — фильтрация по IP/порту/протоколу (L3-L4)
  Stateful         — отслеживает состояние соединений
  Application (L7) — анализирует контент приложений
  WAF              — Web Application Firewall (HTTP/HTTPS)
  NGFW             — Next-Gen FW (IPS + AppID + SSL inspection)

Сегментация сети:
  DMZ — демилитаризованная зона (веб-серверы, доступные снаружи)
  Разделение на VLAN по функции: серверная, управление, пользователи
  Micro-segmentation — в облаке и K8s (Network Policy)

# iptables (Linux):
# Разрешить входящий SSH:
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# Разрешить установленные соединения:
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Заблокировать всё остальное входящее:
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

# Сохранить правила:
iptables-save > /etc/iptables/rules.v4

# nftables (современная замена iptables):
nft add table ip filter
nft add chain ip filter input { type filter hook input priority 0 \; policy drop \; }
nft add rule ip filter input tcp dport 22 accept
nft add rule ip filter input ct state established,related accept

# Kubernetes Network Policy:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: deny-all
spec:
  podSelector: {}
  policyTypes: [Ingress, Egress]
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-api
spec:
  podSelector:
    matchLabels:
      app: api
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: frontend
    ports:
    - port: 8000`)

	utils.Section("VPN — виртуальные частные сети")
	utils.Code(`Типы VPN:
  Remote Access VPN — подключение удалённых пользователей
  Site-to-Site VPN  — соединение офисов
  Split Tunneling   — часть трафика через VPN, остальное напрямую

Протоколы:
  WireGuard — современный, быстрый, простой (рекомендуется)
  OpenVPN   — популярный, гибкий, на TLS
  IPsec     — стандарт, сложная настройка
  L2TP/IPsec — устаревает
  PPTP      — СЛОМАН, не использовать

# WireGuard — быстрая настройка:
# Установка:
apt install wireguard

# Генерация ключей:
wg genkey | tee privatekey | wg pubkey > publickey

# /etc/wireguard/wg0.conf (сервер):
[Interface]
PrivateKey = <server_private_key>
Address = 10.0.0.1/24
ListenPort = 51820
PostUp   = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

[Peer]
PublicKey = <client_public_key>
AllowedIPs = 10.0.0.2/32

# /etc/wireguard/wg0.conf (клиент):
[Interface]
PrivateKey = <client_private_key>
Address = 10.0.0.2/24
DNS = 1.1.1.1

[Peer]
PublicKey = <server_public_key>
Endpoint = server_ip:51820
AllowedIPs = 0.0.0.0/0   # весь трафик через VPN
PersistentKeepalive = 25

# Запуск:
wg-quick up wg0
systemctl enable wg-quick@wg0`)

	utils.Section("Сетевые атаки и защита")
	utils.Code(`ARP Spoofing / MITM:
  Атака: отправка ложных ARP-ответов → перехват трафика
  Защита: Dynamic ARP Inspection (DAI) на коммутаторе

DNS Spoofing / Cache Poisoning:
  Атака: подмена DNS-ответов
  Защита: DNSSEC, DNS over HTTPS (DoH), DNS over TLS (DoT)

DDoS — Distributed Denial of Service:
  Volumetric   — переполнение канала (UDP flood, DNS amplification)
  Protocol     — исчерпание ресурсов (SYN flood, Ping of Death)
  Application  — L7 атаки (HTTP flood, Slowloris)
  Защита: CDN (Cloudflare), rate limiting, scrubbing centers

SYN Flood:
  Атака: отправка SYN без ACK → очередь half-open соединений
  Защита: SYN cookies (sysctl net.ipv4.tcp_syncookies=1)

Man-in-the-Middle (MITM):
  Перехват и изменение трафика
  Защита: TLS с пиннингом сертификата, HSTS, HPKP

Защита от сканирования:
  fail2ban — блокировка после N неудачных попыток
  Port knocking — последовательность "стуков" для открытия порта
  Honeypots — приманки для обнаружения злоумышленников`)

	utils.Footer()
}
