This commit is contained in:
2026-03-26 09:18:16 +03:00
parent c62f6284d2
commit c373e8f5d9
5 changed files with 941 additions and 1 deletions

569
lab4/README.md Normal file
View File

@@ -0,0 +1,569 @@
Сетевые адаптеры:
Adapter 1: NAT
для выхода в интернет (DNS, HTTP)
Adapter 2: Internal Network
имя: intnet
для связи с VM2
sudo vim /etc/netplan/01-netcfg.yaml
network:
version: 2
ethernets:
enp0s3: # NAT
dhcp4: true
enp0s8: # internal
addresses: [192.168.100.1/24]
network:
version: 2
ethernets:
enp0s3: # NAT
dhcp4: true
enp0s8: # internal
addresses: [192.168.100.2/24]
sudo chmod 600 /etc/netplan/01-netcfg.yaml
sudo netplan apply
sudo iptables -F
sudo iptables -X
sudo iptables -t nat -F
Ниже — учебная инструкция **только для настройки и проверки iptables**, без шагов про установку ОС, VirtualBox, netplan и утилит. Будем исходить из твоего текущего стенда:
* `firewall-host` — защищаемый хост, IP `192.168.100.1`
* `external-client` — внешний клиент, IP `192.168.100.2`
* у обеих машин есть NAT-интерфейс `enp0s3`
* внутренний интерфейс — `enp0s8`
* SSH к обеим машинам у тебя уже работает через проброс портов VirtualBox на `127.0.0.1:40001` и `127.0.0.1:40002`
Политика лабы: разрешить loopback, DNS, ping наружу, ping к защищаемому хосту только с одного IP, HTTP/HTTPS, а всё остальное запретить. Это прямо соответствует тексту задания.
---
# 2. Сначала разрешаем SSH, чтобы не отрезать себе доступ
Так как ты подключаешься к `firewall-host` по SSH, нужно **до включения блокировки** разрешить входящие SSH-подключения.
В твоём случае подключение приходит на саму Ubuntu-машину уже **после NAT VirtualBox**, то есть для Linux это обычный входящий TCP на порт `22`.
Выполни на `firewall-host`:
```bash
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
```
Пояснение:
* `-A INPUT` — добавить правило в конец цепочки `INPUT`, которая обрабатывает пакеты, входящие на этот хост.
* `-p tcp` — правило относится только к протоколу TCP.
* `--dport 22` — порт назначения 22, то есть SSH-сервер.
* `-j ACCEPT` — разрешить такой трафик.
Теперь разрешим ответы сервера по уже установленному SSH-соединению:
```bash
sudo iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT
```
Пояснение:
* `-A OUTPUT` — добавить правило в цепочку `OUTPUT`, то есть для пакетов, исходящих с этого хоста.
* `-p tcp` — правило касается TCP.
* `--sport 22` — исходный порт 22; это ответы SSH-сервера клиенту.
* `-j ACCEPT` — разрешить.
Такой вариант рабочий, но в Linux обычно лучше использовать правило состояний соединений. Поэтому следующим шагом мы добавим его тоже.
---
# 3. Разрешаем уже установленные и связанные соединения
Это одно из самых важных правил. Оно позволяет не расписывать вручную каждый ответный пакет.
```bash
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
```
Пояснение:
* `-A INPUT` — правило для входящих пакетов.
* `-m conntrack` — подключить модуль отслеживания состояний соединений.
* `--ctstate ESTABLISHED,RELATED` — матчить пакеты:
* `ESTABLISHED` — относящиеся к уже установленному соединению;
* `RELATED` — связанные с уже существующим соединением.
* `-j ACCEPT` — разрешить.
И аналогично для исходящих:
```bash
sudo iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
```
Пояснение:
* здесь то же самое, но для исходящих пакетов.
Это правило особенно важно для:
* SSH-сессии, в которой ты уже сидишь;
* ответов от DNS-сервера;
* ответов от HTTP/HTTPS-серверов;
* ответов на ping.
---
# 4. Разрешаем loopback
Loopback — это локальное взаимодействие внутри самой ОС через интерфейс `lo`. По условию лабы его нужно разрешить.
```bash
sudo iptables -A INPUT -i lo -j ACCEPT
```
Пояснение:
* `-i lo` — входящий интерфейс `lo`, то есть loopback.
* `-j ACCEPT` — разрешить.
```bash
sudo iptables -A OUTPUT -o lo -j ACCEPT
```
Пояснение:
* `-o lo` — исходящий интерфейс `lo`.
* `-j ACCEPT` — разрешить.
---
# 5. Разрешаем DNS
По условию нужно разрешить взаимодействие с DNS-сервером. Обычно DNS-запросы идут по UDP на порт `53`. Иногда может использоваться и TCP 53, поэтому для учебной работы лучше разрешить оба варианта.
## UDP DNS
```bash
sudo iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
```
Пояснение:
* `-A OUTPUT` — правило для исходящих запросов.
* `-p udp` — DNS чаще всего использует UDP.
* `--dport 53` — порт назначения 53, стандартный порт DNS.
* `-j ACCEPT` — разрешить.
```bash
sudo iptables -A INPUT -p udp --sport 53 -j ACCEPT
```
Пояснение:
* `-A INPUT` — правило для входящих ответов.
* `-p udp` — протокол UDP.
* `--sport 53` — исходный порт удалённого DNS-сервера равен 53.
* `-j ACCEPT` — разрешить.
## TCP DNS
```bash
sudo iptables -A OUTPUT -p tcp --dport 53 -j ACCEPT
```
Пояснение:
* TCP используется реже, но может понадобиться для больших DNS-ответов или специальных случаев.
```bash
sudo iptables -A INPUT -p tcp --sport 53 -j ACCEPT
```
Пояснение:
* разрешает входящие TCP-ответы от DNS-сервера.
---
# 6. Разрешаем HTTP и HTTPS
По заданию нужно разрешить доступ к любым внешним серверам по HTTP/HTTPS.
## HTTP
```bash
sudo iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT
```
Пояснение:
* `-p tcp` — HTTP работает по TCP.
* `--dport 80` — порт назначения 80, стандартный HTTP.
* правило разрешает открывать веб-страницы по HTTP.
```bash
sudo iptables -A INPUT -p tcp --sport 80 -j ACCEPT
```
Пояснение:
* разрешает входящие ответы от HTTP-сервера, у которого исходный порт 80.
## HTTPS
```bash
sudo iptables -A OUTPUT -p tcp --dport 443 -j ACCEPT
```
Пояснение:
* порт 443 — стандартный HTTPS.
```bash
sudo iptables -A INPUT -p tcp --sport 443 -j ACCEPT
```
Пояснение:
* разрешает входящие ответы от HTTPS-сервера.
---
# 7. Разрешаем ping наружу
По заданию нужно разрешить использование `ping` для проверки достижимости любых компьютеров во внешней сети. Для `ping` используется протокол ICMP. Конкретно запрос — это `echo-request`, ответ — `echo-reply`.
```bash
sudo iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
```
Пояснение:
* `-p icmp` — правило для протокола ICMP.
* `--icmp-type echo-request` — ICMP-пакеты типа “эхо-запрос”, то есть сам ping-запрос.
* `-j ACCEPT` — разрешить отправку.
```bash
sudo iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
```
Пояснение:
* `echo-reply` — ответ на ping.
* правило разрешает принимать ответы на отправленные запросы.
---
# 8. Разрешаем ping к защищаемому хосту только с одного адреса
По заданию защищаемый хост должен отвечать на ping только от одного конкретного внешнего адреса. В твоём стенде таким адресом будет `192.168.100.2`, то есть `external-client`.
```bash
sudo iptables -A INPUT -p icmp --icmp-type echo-request -s 192.168.100.2 -d 192.168.100.1 -j ACCEPT
```
Пояснение:
* `-p icmp` — ICMP.
* `--icmp-type echo-request` — входящий ping-запрос.
* `-s 192.168.100.2` — источник должен быть именно `192.168.100.2`.
* `-d 192.168.100.1` — адрес назначения — защищаемый хост.
* `-j ACCEPT` — разрешить.
```bash
sudo iptables -A OUTPUT -p icmp --icmp-type echo-reply -s 192.168.100.1 -d 192.168.100.2 -j ACCEPT
```
Пояснение:
* это правило разрешает отправку ответа ping именно этому клиенту.
* `-s 192.168.100.1` — источник ответа, сам firewall-host.
* `-d 192.168.100.2` — получатель ответа, только разрешённый клиент.
---
# 9. Только теперь включаем политику DROP по умолчанию
Когда все разрешающие правила уже стоят, можно включить запрет всего остального.
```bash
sudo iptables -P INPUT DROP
```
Пояснение:
* `-P` — установить политику по умолчанию для цепочки.
* `INPUT` — цепочка входящих пакетов.
* `DROP` — все пакеты, которые не подошли ни под одно разрешающее правило, будут отбрасываться.
```bash
sudo iptables -P OUTPUT DROP
```
Пояснение:
* то же самое для исходящих пакетов.
```bash
sudo iptables -P FORWARD DROP
```
Пояснение:
* цепочка `FORWARD` нужна для транзитных пакетов через хост.
* в этой лабораторной маршрутизатор делать не требуется, поэтому безопасно оставить `DROP`.
---
# 10. Проверяем, что SSH не отвалился
Сразу после установки политик выполни:
```bash
sudo iptables -L -n -v --line-numbers
```
Пояснение:
* убедись, что правила SSH, loopback, DNS, HTTP/HTTPS и ICMP стоят в списке.
* также удобно смотреть счётчики пакетов: если SSH работает, у соответствующих правил будут увеличиваться значения.
Открой **вторую SSH-сессию** к `firewall-host`:
```bash
ssh -p 40001 arity@127.0.0.1
```
Пояснение:
* это контрольная проверка.
* пока первая сессия ещё жива, ты проверяешь, что новое подключение тоже проходит.
* если вторая сессия открылась, значит SSH точно не заблокирован.
---
# 11. Проверка правил по заданию
## Проверка DNS
На `firewall-host`:
```bash
nslookup example.com
```
Пояснение:
* `nslookup` отправляет DNS-запрос серверу имён.
* если команда возвращает IP-адрес сайта, значит DNS разрешён.
## Проверка HTTP
```bash
curl http://example.com
```
Пояснение:
* `curl` делает HTTP-запрос к веб-серверу.
* если приходит HTML-ответ, правило HTTP работает.
## Проверка HTTPS
```bash
curl https://example.com
```
Пояснение:
* то же самое, но по HTTPS на порт 443.
## Проверка ping наружу
```bash
ping -c 4 8.8.8.8
```
Пояснение:
* `ping` — утилита проверки достижимости узла.
* `-c 4` — отправить только 4 запроса, а не бесконечно.
* `8.8.8.8` — внешний IP-адрес.
* если ответы приходят, исходящий ping разрешён.
## Проверка ping к защищаемому хосту с разрешённого адреса
На `external-client`:
```bash
ping -c 4 192.168.100.1
```
Пояснение:
* клиент `192.168.100.2` должен успешно пинговать `firewall-host`, потому что именно этот источник разрешён.
## Проверка блокировки лишнего трафика
Например, попробуй на `firewall-host`:
```bash
nc -vz example.com 22
```
Пояснение:
* `nc` — netcat, утилита для проверки TCP/UDP-подключений.
* `-v` — подробный режим.
* `-z` — не передавать данные, а только проверить возможность подключения.
* `example.com 22` — попытка открыть TCP-соединение на порт 22.
* так как доступ наружу разрешён только для DNS, HTTP, HTTPS и ping, это подключение должно не пройти.
Если `nc` не установлен, можно проверить другим способом, но ты писал, что инструменты уже есть, так что, скорее всего, всё нормально.
---
# 12. Контроль трафика через tcpdump
По заданию нужно показать прохождение пакетов через `tcpdump`.
Общий просмотр трафика:
```bash
sudo tcpdump -i any -n
```
Пояснение:
* `tcpdump` — сниффер пакетов.
* `-i any` — слушать все интерфейсы сразу.
* `-n` — не преобразовывать адреса в имена.
Просмотр только ICMP:
```bash
sudo tcpdump -i any -n icmp
```
Пояснение:
* фильтр `icmp` покажет только ping-трафик.
Просмотр DNS:
```bash
sudo tcpdump -i any -n port 53
```
Пояснение:
* `port 53` — показать DNS-пакеты.
Просмотр HTTP/HTTPS:
```bash
sudo tcpdump -i any -n 'tcp port 80 or tcp port 443'
```
Пояснение:
* кавычки нужны, чтобы shell корректно передал выражение целиком.
* `or` — логическое “или”.
* выражение показывает трафик к HTTP и HTTPS.
Просмотр SSH:
```bash
sudo tcpdump -i any -n tcp port 22
```
Пояснение:
* поможет убедиться, что SSH-пакеты действительно проходят через фильтр.
---
# 13. Сохранение правил
Когда убедишься, что всё работает, сохрани конфигурацию:
```bash
sudo netfilter-persistent save
```
Пояснение:
* `netfilter-persistent` сохраняет текущие правила iptables, чтобы они восстановились после перезагрузки.
Можно дополнительно сохранить в файл:
```bash
sudo iptables-save > ~/iptables-lab4.rules
```
Пояснение:
* это текстовый дамп всех правил.
* удобно приложить к отчёту или использовать для восстановления.
---
# 14. Готовый набор команд в правильном порядке
Ниже — тот же порядок, но компактным блоком, чтобы ты мог выполнять по шагам:
```bash
sudo iptables-save > ~/iptables-before-lab.rules
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A OUTPUT -o lo -j ACCEPT
sudo iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
sudo iptables -A INPUT -p udp --sport 53 -j ACCEPT
sudo iptables -A OUTPUT -p tcp --dport 53 -j ACCEPT
sudo iptables -A INPUT -p tcp --sport 53 -j ACCEPT
sudo iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --sport 80 -j ACCEPT
sudo iptables -A OUTPUT -p tcp --dport 443 -j ACCEPT
sudo iptables -A INPUT -p tcp --sport 443 -j ACCEPT
sudo iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
sudo iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
sudo iptables -A INPUT -p icmp --icmp-type echo-request -s 192.168.100.2 -d 192.168.100.1 -j ACCEPT
sudo iptables -A OUTPUT -p icmp --icmp-type echo-reply -s 192.168.100.1 -d 192.168.100.2 -j ACCEPT
sudo iptables -P INPUT DROP
sudo iptables -P OUTPUT DROP
sudo iptables -P FORWARD DROP
```
---
# 16. Что написать в учебном смысле про SSH как “дополнение”
Можно формулировать так:
> В базовом задании SSH не входит в перечень разрешённого трафика, однако для сохранения удалённого доступа к стенду было добавлено дополнительное правило, разрешающее входящие TCP-соединения на порт 22 защищаемого хоста. Правило было установлено до включения политик DROP по умолчанию, чтобы не потерять административный доступ к системе.
Это хорошо звучит и по сути верно.

69
lab4/lab4.md Normal file
View File

@@ -0,0 +1,69 @@
# Защита информации, 2026
## Практическая работа №4
**по дисциплине «Защита информации»**
**Тема работы:** «Межсетевое экранирование»
**Преподаватель:** Силиненко А.В.
**Email:** a_silinenko@mail.ru
## 1. Цель работы
Получение базовых знаний по настройке межсетевого экрана (МЭ) в ОС Linux/MacOS.
## 2. Задачи практической работы
### 2.1.
Изучение МЭ iptables или любого другого, обеспечивающего выполнение задания.
### 2.2.
Реализация заданной политики доступа.
## 3. Ход практической работы
### 3.1.
Установить или убедиться в наличии iptables.
### 3.2.
Изучить МЭ iptables, в том числе:
- установка МЭ;
- принципы и порядок обработки пакетов, основные цепочки (таблицы) обработки;
- действия по умолчанию;
- возможные параметры правил фильтрации.
### 3.3.
Изучить команды вывода таблиц фильтрации, добавления, редактирования и удаления правил фильтрации.
### 3.4.
Реализовать следующую политику доступа:
- разрешить локальное взаимодействие через интерфейс loopback;
- разрешить взаимодействие с DNS-сервером;
- разрешить использование утилиты ping для проверки достижимости компьютеров с любыми IP-адресами во внешней сети;
- разрешить использование утилиты ping для проверки достижимости защищаемого хоста только с конкретного адреса внешней сети;
- разрешить доступ по протоколам HTTP/HTTPS к любым внешним серверам;
- блокировать все пакеты, не удовлетворяющие указанным выше условиям.
Правила политики доступа должны содержать (там, где это уместно):
- IP-адрес (сеть) источника;
- IP-адрес (сеть) приемника;
- транспортный протокол;
- для протоколов TCP и UDP: порт приемника;
- для протокола ICMP: тип и код сообщения.
### 3.5.
Произвести проверку корректности реализации заданной политики, используя программы ping, nslookup (или аналоги), web-браузер.
Также убедиться, что весь трафик, кроме разрешенного, блокируется.
### 3.6.
Проконтролировать прохождение пакетов утилитой tcpdump.
## 4. Требования к отчету
### 4.1.
В разделе отчета, посвященному данной работе, должны быть приведены:
- актуальность темы работы в контексте курса;
- цели и задачи работы;
- схема стенда, в т.ч. защищаемый компьютер с МЭ, внешняя сеть, DNS-сервер(а), IP-адреса хостов;
- принципы обработки пакетов в цепочках (таблицах) iptables;
- примеры команд добавления правил фильтрации;
- набор правил фильтрации, реализующий заданную политику доступа;
- проверку реализованной политики демонстрацию примеров пропуска разрешенного трафика и блокировки запрещенного;
- пример контроля трафика (вывод tcpdump) при проверках реализованной политики;
- выводы по проделанной работе.

27
lab4/stand.mmd Normal file
View File

@@ -0,0 +1,27 @@
graph TB
subgraph host["Хост-машина"]
subgraph fw["firewall-host (защищаемый хост, iptables)"]
fw_lo["lo: 127.0.0.1/8"]
fw_nat["enp0s3 &lpar;NAT&rpar;<br/>10.0.2.15/24"]
fw_int["enp0s8 &lpar;Internal&rpar;<br/>192.168.100.1/24"]
end
subgraph ec["external-client (внешний клиент)"]
ec_nat["enp0s3 &lpar;NAT&rpar;<br/>10.0.2.15/24"]
ec_int["enp0s8 &lpar;Internal&rpar;<br/>192.168.100.2/24"]
end
end
fw_int <--->|"Internal Network &lpar;intnet&rpar;<br/>192.168.100.0/24"| ec_int
inet["Интернет<br/>&lpar;DNS: 10.0.2.3, HTTP/HTTPS,<br/>ICMP: 8.8.8.8 и др.&rpar;"]
fw_nat -->|"NAT"| inet
style fw fill:#e8f4e8,stroke:#2d7d2d,stroke-width:2px
style ec fill:#e8e8f4,stroke:#2d2d7d,stroke-width:2px
style host fill:#f9f9f9,stroke:#999,stroke-width:1px
style inet fill:#fff3e0,stroke:#e65100,stroke-width:2px
style fw_lo fill:#fff,stroke:#666
style fw_nat fill:#fff,stroke:#666
style fw_int fill:#fff,stroke:#666
style ec_nat fill:#fff,stroke:#666
style ec_int fill:#fff,stroke:#666