package linuxmodules import ( "fmt" "rubric/utils" ) var NetworkModule = Module{ Key: "network", Aliases: []string{"net", "ssh", "сеть"}, Title: "Сети и SSH", Description: "Темы 42–44: основы сетей, настройка, SSH", Run: showNetwork, } func showNetwork() { utils.Header("Linux — Сети и SSH") // ─── 42. Основы сетей ───────────────────────────────────────── utils.Section("42. Основы сетей") utils.Println(utils.ColorBold + "Ключевые понятия:" + utils.ColorReset) utils.Code(`IP-адрес — уникальный адрес устройства в сети IPv4: 192.168.1.10 (4 байта, 0-255) IPv6: 2001:db8::1 (16 байт, hex) Маска сети — определяет границу сети и хостов /24 = 255.255.255.0 (256 адресов, 254 хоста) /16 = 255.255.0.0 (65536 адресов) Шлюз — маршрутизатор для выхода за пределы сети DNS — перевод имён в IP (8.8.8.8 = Google DNS) MAC-адрес — физический адрес сетевого интерфейса DHCP — автоматическое получение IP от сервера Приватные сети (RFC 1918): 10.0.0.0/8 (10.x.x.x) 172.16.0.0/12 (172.16-31.x.x) 192.168.0.0/16 (192.168.x.x) Localhost: 127.0.0.1 — loopback IPv4 (lo) ::1 — loopback IPv6`) utils.Println(utils.ColorBold + "Информация о сетевых интерфейсах:" + utils.ColorReset) utils.Command("ip addr", "IP-адреса всех интерфейсов") utils.Command("ip addr show eth0", "конкретный интерфейс") utils.Command("ip link", "состояние интерфейсов (UP/DOWN)") utils.Command("ip route", "таблица маршрутизации") utils.Command("ip route show default", "шлюз по умолчанию") utils.Command("ip neigh", "ARP-таблица (MAC → IP)") fmt.Println() utils.Code(`# Старые команды (net-tools, устаревшие): ifconfig # → ip addr route -n # → ip route netstat -rn # → ip route arp -n # → ip neigh`) utils.Println(utils.ColorBold + "Диагностика сети:" + utils.ColorReset) utils.Command("ping 8.8.8.8", "проверить доступность хоста") utils.Command("ping -c 4 google.com", "4 пакета") utils.Command("ping6 ::1", "ping для IPv6") utils.Command("traceroute google.com", "маршрут до хоста") utils.Command("tracepath google.com", "маршрут (без root)") utils.Command("mtr google.com", "ping + traceroute в реальном времени") utils.Command("nslookup google.com", "DNS-запрос") utils.Command("dig google.com", "подробный DNS-запрос") utils.Command("dig @8.8.8.8 google.com", "DNS через конкретный сервер") utils.Command("host google.com", "быстрый DNS-запрос") utils.Command("whois 192.168.1.1", "информация об IP/домене") fmt.Println() utils.Println(utils.ColorBold + "Сетевые соединения и порты:" + utils.ColorReset) utils.Command("ss -tuln", "прослушиваемые порты (t=tcp u=udp l=listen n=numeric)") utils.Command("ss -tulnp", "с именами процессов (root)") utils.Command("ss -s", "статистика соединений") utils.Command("ss -tn state established", "активные TCP-соединения") utils.Command("netstat -tuln", "аналог ss (устаревший)") utils.Command("lsof -i :80", "что слушает порт 80") utils.Command("lsof -i :22", "что слушает порт 22") utils.Command("nmap -sS 192.168.1.0/24", "сканирование сети (нужно установить)") utils.Command("nmap -p 22,80,443 server", "проверить конкретные порты") // ─── 43. Работа с сетью ─────────────────────────────────────── utils.Section("43. Настройка сети") utils.Println(utils.ColorBold + "Временная настройка (без сохранения):" + utils.ColorReset) utils.Code(`# Добавить IP: ip addr add 192.168.1.10/24 dev eth0 # Удалить IP: ip addr del 192.168.1.10/24 dev eth0 # Включить/выключить интерфейс: ip link set eth0 up ip link set eth0 down # Добавить маршрут: ip route add 10.0.0.0/8 via 192.168.1.1 ip route add default via 192.168.1.1 # Удалить маршрут: ip route del default`) utils.Println(utils.ColorBold + "NetworkManager — постоянная настройка:" + utils.ColorReset) utils.Code(`# nmcli — командная строка NetworkManager nmcli device status # список устройств nmcli connection show # все соединения nmcli connection show eth0 # параметры соединения # Статический IP: nmcli con mod eth0 ipv4.addresses 192.168.1.10/24 nmcli con mod eth0 ipv4.gateway 192.168.1.1 nmcli con mod eth0 ipv4.dns "8.8.8.8 8.8.4.4" nmcli con mod eth0 ipv4.method manual # static (не DHCP) nmcli con up eth0 # применить # DHCP: nmcli con mod eth0 ipv4.method auto nmcli con up eth0 # Создать соединение: nmcli con add type ethernet con-name myconn ifname eth1 \ ipv4.addresses 10.0.0.5/24 ipv4.gateway 10.0.0.1 \ ipv4.method manual # nmtui — псевдографический интерфейс: nmtui`) utils.Println(utils.ColorBold + "DNS-настройка:" + utils.ColorReset) utils.Code(`# /etc/resolv.conf — DNS-серверы: nameserver 8.8.8.8 nameserver 8.8.4.4 search mydomain.local # домен для коротких имён # /etc/hosts — локальное разрешение имён: 127.0.0.1 localhost 192.168.1.10 server01.local server01 # Порядок разрешения (/etc/nsswitch.conf): hosts: files dns myhostname # сначала /etc/hosts, потом DNS`) utils.Println(utils.ColorBold + "curl и wget — HTTP-запросы:" + utils.ColorReset) utils.Command("curl https://example.com", "GET запрос") utils.Command("curl -I https://example.com", "только заголовки") utils.Command("curl -o file.txt https://example.com/file", "сохранить в файл") utils.Command("curl -L https://example.com", "следовать перенаправлениям") utils.Command("curl -X POST -d 'data' https://api.example.com", "POST запрос") utils.Command("curl -H 'Authorization: Bearer token' https://api.example.com", "с заголовком") utils.Command("wget https://example.com/file.tar.gz", "скачать файл") utils.Command("wget -r -np https://example.com/docs/", "рекурсивно скачать") // ─── 44. SSH ────────────────────────────────────────────────── utils.Section("44. Удалённый доступ — SSH") utils.Println("SSH (Secure Shell) — зашифрованный протокол удалённого доступа.") fmt.Println() utils.Println(utils.ColorBold + "Подключение:" + utils.ColorReset) utils.Command("ssh user@server", "подключиться к серверу") utils.Command("ssh user@192.168.1.10", "по IP") utils.Command("ssh -p 2222 user@server", "нестандартный порт") utils.Command("ssh -i ~/.ssh/mykey user@server", "с конкретным ключом") utils.Command("ssh -v user@server", "подробный вывод (отладка)") utils.Command("ssh -A user@server", "пробросить SSH-агент") fmt.Println() utils.Println(utils.ColorBold + "SSH-ключи — аутентификация без пароля:" + utils.ColorReset) utils.Code(`# Генерация пары ключей: ssh-keygen -t ed25519 -C "alice@example.com" # (рекомендуется) ssh-keygen -t rsa -b 4096 -C "alice@example.com" # RSA 4096 # Файлы: ~/.ssh/id_ed25519 — приватный ключ (НИКОМУ не передавать!) ~/.ssh/id_ed25519.pub — публичный ключ # Скопировать публичный ключ на сервер: ssh-copy-id user@server # автоматически ssh-copy-id -i ~/.ssh/mykey.pub user@server # Вручную (добавить в ~/.ssh/authorized_keys на сервере): cat ~/.ssh/id_ed25519.pub >> ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys chmod 700 ~/.ssh/`) utils.Println(utils.ColorBold + "~/.ssh/config — настройка подключений:" + utils.ColorReset) utils.Code(`# ~/.ssh/config Host myserver HostName 192.168.1.10 User alice Port 22 IdentityFile ~/.ssh/id_ed25519 ServerAliveInterval 60 Host bastion HostName bastion.example.com User admin ForwardAgent yes Host internal HostName 10.0.0.5 User root ProxyJump bastion # подключиться через bastion # Использование: ssh myserver # вместо ssh alice@192.168.1.10 -i ~/.ssh/id_ed25519`) utils.Println(utils.ColorBold + "Передача файлов:" + utils.ColorReset) utils.Command("scp file.txt user@server:/path/", "скопировать на сервер") utils.Command("scp user@server:/path/file.txt .", "скопировать с сервера") utils.Command("scp -r dir/ user@server:/path/", "директорию рекурсивно") utils.Command("rsync -avzP dir/ user@server:/path/", "синхронизация (лучше scp)") fmt.Println() utils.Println(utils.ColorBold + "Конфигурация сервера (/etc/ssh/sshd_config):" + utils.ColorReset) utils.Code(`Port 22 # порт (лучше изменить) PermitRootLogin no # запретить вход root (рекомендуется) PasswordAuthentication no # только ключи PubkeyAuthentication yes # ключи разрешены AuthorizedKeysFile .ssh/authorized_keys AllowUsers alice bob # только эти пользователи MaxAuthTries 3 # попытки аутентификации # Применить изменения: sudo systemctl reload sshd # Проверить конфигурацию: sudo sshd -t`) utils.Println(utils.ColorBold + "Туннели SSH (Port Forwarding):" + utils.ColorReset) utils.Code(`# Локальный туннель (доступ к удалённому сервису через localhost): ssh -L 8080:localhost:80 user@server # Теперь http://localhost:8080 = http://server:80 # Удалённый туннель (открыть порт на удалённом сервере): ssh -R 9090:localhost:3000 user@server # Теперь server:9090 → localhost:3000 # SOCKS-прокси (динамический туннель): ssh -D 1080 user@server # Настроить браузер на SOCKS5 proxy localhost:1080`) utils.Footer() }