238 lines
11 KiB
Go
Executable file
238 lines
11 KiB
Go
Executable file
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()
|
||
}
|