Перейти к содержимому

Практика 5. Протоколы, SSH, файрвол и сниффинг


Цель работы

Изучить работу TCP/UDP на практике, освоить SSH, настройку файрвола и перехват пакетов.


Часть 1. TCP и UDP на практике

Задание 1.1. Просмотр прослушиваемых портов

  1. Просмотрите все прослушиваемые TCP-порты:

    Окно терминала
    ss -tlnp

    Объясните флаги: -t (TCP), -l (listening), -n (числовые), -p (процессы).

  2. Просмотрите UDP-порты:

    Окно терминала
    ss -ulnp
  3. Просмотрите все активные соединения:

    Окно терминала
    ss -tnp

    Найдите соединения в разных состояниях: ESTABLISHED, TIME_WAIT, CLOSE_WAIT.

  4. Альтернативный инструмент (устаревший, но полезно знать):

    Окно терминала
    netstat -tlnp

Задание 1.2. Исследование TCP-соединения

  1. Установите TCP-соединение с помощью curl и наблюдайте:

    Окно терминала
    # В первом терминале — мониторинг
    watch -n 1 'ss -tnp | grep :80'
    # Во втором терминале — запрос
    curl -v http://example.com
  2. Изучите заголовки HTTP-ответа:

    Окно терминала
    curl -I http://example.com

    Какой код статуса вернулся? Какие заголовки присутствуют?


Часть 2. curl и HTTP

Задание 2.1. GET-запросы

  1. Выполните простой GET-запрос:

    Окно терминала
    curl http://httpbin.org/get
  2. Запрос с подробным выводом (видны заголовки запроса и ответа):

    Окно терминала
    curl -v http://httpbin.org/get

    Найдите в выводе: метод, путь, заголовки запроса (>) и ответа (<).

  3. Запрос только заголовков:

    Окно терминала
    curl -I http://httpbin.org/get
  4. Запрос с пользовательским заголовком:

    Окно терминала
    curl -H "Accept: application/json" -H "X-Custom: test" http://httpbin.org/headers

Задание 2.2. POST-запросы

  1. Отправьте POST-запрос с данными:

    Окно терминала
    curl -X POST -d "name=student&course=os" http://httpbin.org/post
  2. Отправьте JSON:

    Окно терминала
    curl -X POST \
    -H "Content-Type: application/json" \
    -d '{"name": "student", "course": "os"}' \
    http://httpbin.org/post
  3. Сохраните ответ в файл:

    Окно терминала
    curl -o ~/project/data/response.json http://httpbin.org/get
    cat ~/project/data/response.json

Задание 2.3. Коды ответов

Выполните запросы и объясните полученные коды:

Окно терминала
curl -o /dev/null -s -w "Код: %{http_code}\n" http://httpbin.org/status/200
curl -o /dev/null -s -w "Код: %{http_code}\n" http://httpbin.org/status/301
curl -o /dev/null -s -w "Код: %{http_code}\n" http://httpbin.org/status/404
curl -o /dev/null -s -w "Код: %{http_code}\n" http://httpbin.org/status/500

Для каждого кода укажите: класс (1xx–5xx), название и описание.


Часть 3. SSH

Задание 3.1. Генерация SSH-ключей

  1. Сгенерируйте пару ключей Ed25519:

    Окно терминала
    ssh-keygen -t ed25519 -C "student@os-course"

    При запросе пути нажмите Enter (по умолчанию ~/.ssh/id_ed25519).

  2. Просмотрите созданные файлы:

    Окно терминала
    ls -la ~/.ssh/
    cat ~/.ssh/id_ed25519.pub # Публичный ключ

    Какие права установлены на приватный ключ? Почему это важно?

  3. Проверьте отпечаток ключа:

    Окно терминала
    ssh-keygen -l -f ~/.ssh/id_ed25519.pub

Задание 3.2. Настройка SSH-клиента

  1. Создайте (или отредактируйте) файл конфигурации SSH:

    Окно терминала
    cat > ~/.ssh/config << 'EOF'
    # Общие настройки
    Host *
    ServerAliveInterval 60
    ServerAliveCountMax 3
    # Пример конфигурации для сервера
    Host myserver
    HostName 192.168.1.100
    User student
    Port 22
    IdentityFile ~/.ssh/id_ed25519
    EOF
    chmod 600 ~/.ssh/config
  2. Объясните каждую директиву в конфигурации.

Задание 3.3. Подключение по SSH (если есть доступный сервер)

Если у вас есть второй хост (виртуальная машина, VPS или контейнер):

  1. Скопируйте публичный ключ на сервер:

    Окно терминала
    ssh-copy-id user@server_ip
  2. Подключитесь по ключу:

    Окно терминала
    ssh user@server_ip
  3. Выполните команду без интерактивного входа:

    Окно терминала
    ssh user@server_ip "uptime && free -h && df -h"

Задание 3.4. Передача файлов

  1. Копирование через SCP:

    Окно терминала
    # Загрузить файл на сервер
    scp ~/project/data/response.json user@server_ip:/tmp/
    # Скачать файл с сервера
    scp user@server_ip:/etc/hostname ~/project/data/
  2. Копирование каталога:

    Окно терминала
    scp -r ~/project/src/ user@server_ip:/tmp/project_src/
  3. Синхронизация через rsync:

    Окно терминала
    rsync -avz ~/project/src/ user@server_ip:/tmp/project_src/

    Чем rsync лучше scp?


Часть 4. Перехват пакетов (tcpdump)

Задание 4.1. Базовый перехват

  1. Перехватите пакеты на основном интерфейсе:

    Окно терминала
    sudo tcpdump -i any -c 10

    Объясните формат вывода.

  2. Фильтрация по порту:

    Окно терминала
    # В первом терминале — перехват
    sudo tcpdump -i any port 80 -c 5
    # Во втором терминале — генерация трафика
    curl http://example.com
  3. Фильтрация по хосту:

    Окно терминала
    sudo tcpdump -i any host 8.8.8.8 -c 5
    ping -c 2 8.8.8.8

Задание 4.2. Наблюдение TCP Handshake

  1. Перехватите трёхстороннее рукопожатие:

    Окно терминала
    # В первом терминале
    sudo tcpdump -i any port 80 -nn -c 10
    # Во втором терминале
    curl http://example.com

    Найдите в выводе пакеты с флагами:

    • [S] — SYN
    • [S.] — SYN-ACK
    • [.] — ACK
    • [F.] — FIN-ACK
  2. Сохраните перехваченный трафик в файл .pcap:

    Окно терминала
    sudo tcpdump -i any port 80 -c 20 -w ~/project/data/capture.pcap
    # В другом терминале
    curl http://example.com
    # Прочитать файл
    sudo tcpdump -r ~/project/data/capture.pcap

Задание 4.3. Наблюдение DNS-запросов

Окно терминала
# В первом терминале
sudo tcpdump -i any port 53 -nn -c 10
# Во втором терминале
dig google.com
nslookup ya.ru

Найдите DNS-запрос и ответ. Какой транспортный протокол используется (TCP или UDP)?


Часть 5. Файрвол (ufw)

Задание 5.1. Установка и базовая настройка

  1. Установите ufw:

    Окно терминала
    sudo apt install ufw
  2. Проверьте текущий статус:

    Окно терминала
    sudo ufw status verbose
  3. Установите политики по умолчанию:

    Окно терминала
    sudo ufw default deny incoming
    sudo ufw default allow outgoing

Задание 5.2. Добавление правил

  1. Разрешите SSH (важно сделать ДО включения файрвола!):

    Окно терминала
    sudo ufw allow 22/tcp
  2. Разрешите HTTP и HTTPS:

    Окно терминала
    sudo ufw allow 80/tcp
    sudo ufw allow 443/tcp
  3. Разрешите доступ с конкретного IP:

    Окно терминала
    sudo ufw allow from 192.168.1.0/24
  4. Включите файрвол:

    Окно терминала
    sudo ufw enable
  5. Просмотрите правила:

    Окно терминала
    sudo ufw status numbered

Задание 5.3. Управление правилами

  1. Удалите правило по номеру:

    Окно терминала
    sudo ufw delete 3
  2. Запретите конкретный порт:

    Окно терминала
    sudo ufw deny 8080/tcp
  3. Просмотрите итоговый набор правил:

    Окно терминала
    sudo ufw status verbose
  4. Отключите файрвол (для учебной среды):

    Окно терминала
    sudo ufw disable

Часть 6. Netcat — сетевой «швейцарский нож»

Задание 6.1. Простой чат

  1. В первом терминале запустите сервер:

    Окно терминала
    nc -l -p 12345
  2. Во втором терминале подключитесь как клиент:

    Окно терминала
    nc localhost 12345
  3. Введите текст в любом терминале — он появится в другом. Это простейший TCP-чат.

Задание 6.2. Передача файлов

  1. Приёмник (первый терминал):

    Окно терминала
    nc -l -p 12345 > ~/project/data/received_file.txt
  2. Отправитель (второй терминал):

    Окно терминала
    echo "Файл передан через netcat!" | nc localhost 12345
  3. Проверьте:

    Окно терминала
    cat ~/project/data/received_file.txt

Задание 6.3. Сканирование портов

Окно терминала
nc -zv localhost 22
nc -zv localhost 80
nc -zv localhost 1-100 2>&1 | grep succeeded

Какие порты открыты?


Мини-проект: настройка безопасного сервера

Выполните полную настройку безопасности сетевого доступа (на виртуальной машине):

  1. Создайте нового пользователя с правами sudo:

    Окно терминала
    sudo useradd -m -s /bin/bash secureuser
    sudo passwd secureuser
    sudo usermod -aG sudo secureuser
  2. Настройте SSH-доступ только по ключу:

    • Сгенерируйте ключ для нового пользователя.
    • Добавьте публичный ключ в ~secureuser/.ssh/authorized_keys.
    • Отключите вход по паролю в /etc/ssh/sshd_config:
      PasswordAuthentication no
      PermitRootLogin no
    • Перезапустите sshd: sudo systemctl restart sshd.
  3. Настройте файрвол:

    Окно терминала
    sudo ufw default deny incoming
    sudo ufw default allow outgoing
    sudo ufw allow 22/tcp
    sudo ufw allow 80/tcp
    sudo ufw enable
  4. Проверьте с помощью tcpdump что трафик на закрытые порты отклоняется:

    Окно терминала
    sudo tcpdump -i any port 8080 -c 5 &
    nc -zv localhost 8080
  5. Составьте отчёт со всеми выполненными шагами и результатами проверок.


Контрольные вопросы

  1. Чем TCP отличается от UDP? Приведите по 3 примера применения каждого протокола.
  2. Опишите трёхстороннее рукопожатие TCP. Зачем оно нужно?
  3. Что такое порт? Чем well-known порты отличаются от ephemeral?
  4. Как работает DNS? Опишите процесс резолвинга имени www.example.com.
  5. Перечислите основные типы DNS-записей и их назначение.
  6. Что показывают коды ответов HTTP 200, 301, 404, 500?
  7. Как работает HTTPS? Что обеспечивает TLS?
  8. Чем аутентификация по SSH-ключу безопаснее пароля?
  9. Что такое межсетевой экран? Чем stateful firewall отличается от пакетного фильтра?
  10. Какие флаги TCP можно наблюдать в tcpdump при установлении и разрыве соединения?