Исправления lab4

This commit is contained in:
2026-04-04 10:21:42 +03:00
parent 642e3cf0c7
commit 7c83fe5e1a
2 changed files with 45 additions and 88 deletions

View File

@@ -122,7 +122,11 @@ sudo iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
* SSH-сессии, в которой ты уже сидишь; * SSH-сессии, в которой ты уже сидишь;
* ответов от DNS-сервера; * ответов от DNS-сервера;
* ответов от HTTP/HTTPS-серверов; * ответов от HTTP/HTTPS-серверов;
* ответов на ping. * ответов на исходящий ping (`echo-reply`).
**Порядок имеет значение.** Раз это правило стоит **раньше**, чем узкие правила вида «принять UDP/TCP с `--sport 53` или TCP с `--sport 80/443`» или «`echo-reply`», то **все ответные пакеты** по уже разрешённым исходящим запросам срабатывают здесь. Отдельные строки `INPUT` для `sport` DNS/HTTP(S) и для входящего `echo-reply` становятся **лишними**: до них очередь не дойдёт, а счётчики у таких правил останутся нулевыми.
На `INPUT` в учебной конфигурации **осмысленно оставить** явные разрешения только для **нового** входящего трафика, которое не описывается как `ESTABLISHED`/`RELATED`: SSH (если нужен), loopback и входящий `echo-request` только с разрешённого адреса (см. раздел 8).
--- ---
@@ -167,16 +171,7 @@ sudo iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
* `--dport 53` — порт назначения 53, стандартный порт DNS. * `--dport 53` — порт назначения 53, стандартный порт DNS.
* `-j ACCEPT` — разрешить. * `-j ACCEPT` — разрешить.
```bash Входящие ответы DNS (UDP с `sport 53`) после этого правила пропускаются правилом `ESTABLISHED,RELATED` на `INPUT`; отдельная строка `INPUT --sport 53` не нужна и при типичном порядке правил всё равно не получила бы трафика.
sudo iptables -A INPUT -p udp --sport 53 -j ACCEPT
```
Пояснение:
* `-A INPUT` — правило для входящих ответов.
* `-p udp` — протокол UDP.
* `--sport 53` — исходный порт удалённого DNS-сервера равен 53.
* `-j ACCEPT` — разрешить.
## TCP DNS ## TCP DNS
@@ -187,14 +182,7 @@ sudo iptables -A OUTPUT -p tcp --dport 53 -j ACCEPT
Пояснение: Пояснение:
* TCP используется реже, но может понадобиться для больших DNS-ответов или специальных случаев. * TCP используется реже, но может понадобиться для больших DNS-ответов или специальных случаев.
* входящие TCP-ответы от DNS идут через `ESTABLISHED,RELATED` на `INPUT`.
```bash
sudo iptables -A INPUT -p tcp --sport 53 -j ACCEPT
```
Пояснение:
* разрешает входящие TCP-ответы от DNS-сервера.
--- ---
@@ -214,13 +202,7 @@ sudo iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT
* `--dport 80` — порт назначения 80, стандартный HTTP. * `--dport 80` — порт назначения 80, стандартный HTTP.
* правило разрешает открывать веб-страницы по HTTP. * правило разрешает открывать веб-страницы по HTTP.
```bash Входящие ответы HTTP (и далее HTTPS) принимаются правилом `ESTABLISHED,RELATED` на `INPUT`; отдельное `INPUT --sport 80` не требуется.
sudo iptables -A INPUT -p tcp --sport 80 -j ACCEPT
```
Пояснение:
* разрешает входящие ответы от HTTP-сервера, у которого исходный порт 80.
## HTTPS ## HTTPS
@@ -232,13 +214,7 @@ sudo iptables -A OUTPUT -p tcp --dport 443 -j ACCEPT
* порт 443 — стандартный HTTPS. * порт 443 — стандартный HTTPS.
```bash Входящие ответы HTTPS обрабатываются на `INPUT` через `ESTABLISHED,RELATED`.
sudo iptables -A INPUT -p tcp --sport 443 -j ACCEPT
```
Пояснение:
* разрешает входящие ответы от HTTPS-сервера.
--- ---
@@ -256,14 +232,7 @@ sudo iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
* `--icmp-type echo-request` — ICMP-пакеты типа “эхо-запрос”, то есть сам ping-запрос. * `--icmp-type echo-request` — ICMP-пакеты типа “эхо-запрос”, то есть сам ping-запрос.
* `-j ACCEPT` — разрешить отправку. * `-j ACCEPT` — разрешить отправку.
```bash Ответы `echo-reply` на этот исходящий ping ядро относит к той же «сессии»; на `INPUT` они проходят через `ESTABLISHED,RELATED`. Отдельное правило `INPUT -p icmp --icmp-type echo-reply` не обязательно и при раннем conntrack дублирует его бесполезно.
sudo iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
```
Пояснение:
* `echo-reply` — ответ на ping.
* правило разрешает принимать ответы на отправленные запросы.
--- ---
@@ -338,8 +307,8 @@ sudo iptables -L -n -v --line-numbers
Пояснение: Пояснение:
* убедись, что правила SSH, loopback, DNS, HTTP/HTTPS и ICMP стоят в списке. * убедись, что правила SSH, conntrack, loopback, исходящие DNS/HTTP(S)/ICMP и узкое правило входящего ping с `192.168.100.2` стоят в списке.
* также удобно смотреть счётчики пакетов: если SSH работает, у соответствующих правил будут увеличиваться значения. * на `INPUT` основной рост счётчиков у «ответного» трафика обычно виден у строки `ESTABLISHED,RELATED`, а не у отдельных `--sport` (если ты их вообще не добавляешь).
Открой **вторую SSH-сессию** к `firewall-host`: Открой **вторую SSH-сессию** к `firewall-host`:
@@ -418,21 +387,24 @@ ping -c 4 192.168.100.1
## Проверка блокировки лишнего трафика ## Проверка блокировки лишнего трафика
Например, попробуй на `firewall-host`: Надёжный вариант — **TCP на порт, который не разрешён политикой**, на второй ВМ в `intnet` (у тебя это `external-client`).
На `external-client` подними слушатель на порт, например `8080`:
```bash ```bash
nc -vz example.com 22 python3 -m http.server 8080
```
На `firewall-host` попробуй подключиться:
```bash
timeout 5 nc -vz 192.168.100.2 8080
``` ```
Пояснение: Пояснение:
* `nc` — netcat, утилита для проверки TCP/UDP-подключений. * исходящий TCP на `192.168.100.2:8080` не попадает под разрешённые `dport 53`/`80`/`443`, поэтому при политике `OUTPUT DROP` соединение не устанавливается (обычно таймаут).
* `-v` — подробный режим. * проверка к `example.com:22` для отчёта часто бессмысленна: порт 22 у публичных имён часто закрыт независимо от твоего МЭ.
* `-z` — не передавать данные, а только проверить возможность подключения.
* `example.com 22` — попытка открыть TCP-соединение на порт 22.
* так как доступ наружу разрешён только для DNS, HTTP, HTTPS и ping, это подключение должно не пройти.
Если `nc` не установлен, можно проверить другим способом, но ты писал, что инструменты уже есть, так что, скорее всего, всё нормально.
--- ---
@@ -538,17 +510,12 @@ sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A OUTPUT -o lo -j ACCEPT sudo iptables -A OUTPUT -o lo -j ACCEPT
sudo iptables -A OUTPUT -p udp --dport 53 -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 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 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 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 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 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 -A OUTPUT -p icmp --icmp-type echo-reply -s 192.168.100.1 -d 192.168.100.2 -j ACCEPT

View File

@@ -752,7 +752,7 @@ DNS-запросы обрабатываются службой \texttt{systemd-r
Пакет последовательно сравнивается с правилами цепочки. При совпадении выполняется действие: \texttt{ACCEPT} (пропустить), \texttt{DROP} (молча отбросить) или \texttt{REJECT} (отбросить с уведомлением). Если ни одно правило не сработало, применяется политика по умолчанию. Пакет последовательно сравнивается с правилами цепочки. При совпадении выполняется действие: \texttt{ACCEPT} (пропустить), \texttt{DROP} (молча отбросить) или \texttt{REJECT} (отбросить с уведомлением). Если ни одно правило не сработало, применяется политика по умолчанию.
Модуль \texttt{conntrack} позволяет отслеживать состояния соединений. Правило с параметром \texttt{-{}-ctstate ESTABLISHED,RELATED} пропускает ответные пакеты уже установленных соединений без необходимости создания отдельных правил для каждого обратного направления. Модуль \texttt{conntrack} позволяет отслеживать состояния соединений. Правило с параметром \texttt{-{}-ctstate ESTABLISHED,RELATED} пропускает ответные пакеты уже установленных соединений без необходимости дублировать на цепочке \texttt{INPUT} отдельные правила по исходным портам для DNS, HTTP/HTTPS и для \texttt{echo-reply} на исходящий \texttt{ping}: при расположении этого правила \textbf{выше} узких правил ответный трафик срабатывает в нём, а счётчики у гипотетических строк \texttt{INPUT} с~\texttt{-{}-sport~53}/\texttt{80}/\texttt{443} оставались~бы нулевыми. На~\texttt{INPUT} явно заданы только новые входящие сценарии: SSH (для стенда), loopback и входящий \texttt{echo-request} с разрешённого адреса \texttt{192.168.100.2}.
\subsection{Реализация политики фильтрации} \subsection{Реализация политики фильтрации}
@@ -793,19 +793,14 @@ sudo iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# Loopback # Loopback
sudo iptables -A INPUT -i lo -j ACCEPT sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A OUTPUT -o lo -j ACCEPT sudo iptables -A OUTPUT -o lo -j ACCEPT
# DNS (UDP и TCP, порт 53) # DNS (UDP и TCP, порт 53; ответы на INPUT через ESTABLISHED,RELATED)
sudo iptables -A OUTPUT -p udp --dport 53 -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 OUTPUT -p tcp --dport 53 -j ACCEPT
sudo iptables -A INPUT -p tcp --sport 53 -j ACCEPT # HTTP и HTTPS (ответы на INPUT через ESTABLISHED,RELATED)
# HTTP и HTTPS
sudo iptables -A OUTPUT -p tcp --dport 80 -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 OUTPUT -p tcp --dport 443 -j ACCEPT
sudo iptables -A INPUT -p tcp --sport 443 -j ACCEPT # Исходящий ping (echo-reply на INPUT через ESTABLISHED,RELATED)
# Исходящий ping
sudo iptables -A OUTPUT -p icmp --icmp-type echo-request -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
# Входящий ping только от 192.168.100.2 # Входящий ping только от 192.168.100.2
sudo iptables -A INPUT -p icmp --icmp-type echo-request \ sudo iptables -A INPUT -p icmp --icmp-type echo-request \
-s 192.168.100.2 -d 192.168.100.1 -j ACCEPT -s 192.168.100.2 -d 192.168.100.1 -j ACCEPT
@@ -818,7 +813,7 @@ sudo iptables -P FORWARD DROP
\end{verbatim} \end{verbatim}
} }
Правило для SSH не входит в задание, но необходимо для сохранения удалённого доступа; оно добавлено до включения политик \texttt{DROP}. Правило для SSH не входит в задание, но необходимо для сохранения удалённого доступа; оно добавлено до включения политик \texttt{DROP}. Отдельные правила \texttt{INPUT} с~\texttt{-{}-sport} для ответов DNS/HTTP(S) и с~\texttt{echo-reply} для исходящего \texttt{ping} не используются: этот трафик обрабатывается правилом \texttt{ESTABLISHED,RELATED}.
Итоговое состояние таблицы \texttt{filter} (\texttt{iptables -L -n -v -{}-line-numbers}): Итоговое состояние таблицы \texttt{filter} (\texttt{iptables -L -n -v -{}-line-numbers}):
@@ -827,28 +822,23 @@ sudo iptables -P FORWARD DROP
Chain INPUT (policy DROP 0 packets, 0 bytes) Chain INPUT (policy DROP 0 packets, 0 bytes)
num pkts bytes target prot in source destination num pkts bytes target prot in source destination
1 162 10124 ACCEPT tcp * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 1 162 10124 ACCEPT tcp * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
2 10 760 ACCEPT all * 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED 2 312 142K ACCEPT all * 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
3 0 0 ACCEPT all lo 0.0.0.0/0 0.0.0.0/0 3 12 780 ACCEPT all lo 0.0.0.0/0 0.0.0.0/0
4 0 0 ACCEPT udp * 0.0.0.0/0 0.0.0.0/0 udp spt:53 4 8 672 ACCEPT icmp * 192.168.100.2 192.168.100.1 icmptype 8
5 0 0 ACCEPT tcp * 0.0.0.0/0 0.0.0.0/0 tcp spt:53
6 0 0 ACCEPT tcp * 0.0.0.0/0 0.0.0.0/0 tcp spt:80
7 0 0 ACCEPT tcp * 0.0.0.0/0 0.0.0.0/0 tcp spt:443
8 0 0 ACCEPT icmp * 0.0.0.0/0 0.0.0.0/0 icmptype 0
9 0 0 ACCEPT icmp * 192.168.100.2 192.168.100.1 icmptype 8
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) Chain FORWARD (policy DROP 0 packets, 0 bytes)
Chain OUTPUT (policy DROP 4 packets, 304 bytes) Chain OUTPUT (policy DROP 0 packets, 0 bytes)
num pkts bytes target prot out source destination num pkts bytes target prot out source destination
1 119 21028 ACCEPT tcp * 0.0.0.0/0 0.0.0.0/0 tcp spt:22 1 119 21028 ACCEPT tcp * 0.0.0.0/0 0.0.0.0/0 tcp spt:22
2 0 0 ACCEPT all * 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED 2 289 33680 ACCEPT all * 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
3 0 0 ACCEPT all lo 0.0.0.0/0 0.0.0.0/0 3 12 780 ACCEPT all * lo 0.0.0.0/0 0.0.0.0/0
4 0 0 ACCEPT udp * 0.0.0.0/0 0.0.0.0/0 udp dpt:53 4 28 1982 ACCEPT udp * 0.0.0.0/0 0.0.0.0/0 udp dpt:53
5 0 0 ACCEPT tcp * 0.0.0.0/0 0.0.0.0/0 tcp dpt:53 5 0 0 ACCEPT tcp * 0.0.0.0/0 0.0.0.0/0 tcp dpt:53
6 0 0 ACCEPT tcp * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 6 4 240 ACCEPT tcp * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
7 0 0 ACCEPT tcp * 0.0.0.0/0 0.0.0.0/0 tcp dpt:443 7 10 600 ACCEPT tcp * 0.0.0.0/0 0.0.0.0/0 tcp dpt:443
8 0 0 ACCEPT icmp * 0.0.0.0/0 0.0.0.0/0 icmptype 8 8 4 336 ACCEPT icmp * 0.0.0.0/0 0.0.0.0/0 icmptype 8
9 0 0 ACCEPT icmp * 192.168.100.1 192.168.100.2 icmptype 0 9 8 672 ACCEPT icmp * 192.168.100.1 192.168.100.2 icmptype 0
\end{verbatim} \end{verbatim}
} }
@@ -915,12 +905,12 @@ arity@external-client:~$ ping -c 4 192.168.100.1
\end{verbatim} \end{verbatim}
} }
\textbf{Блокировка запрещённого трафика.} Попытка TCP-соединения на порт~22 внешнего сервера не проходит (исходящий TCP разрешён только на порты 53, 80, 443): \textbf{Блокировка запрещённого трафика.} На узле \texttt{external-client} запущен \texttt{python3 -m http.server 8080}; исходящий TCP на порт~8080 в политику не входит (разрешены только 53, 80, 443), поэтому с \texttt{firewall-host} соединение не устанавливается:
{\footnotesize {\footnotesize
\begin{verbatim} \begin{verbatim}
$ nc -vz example.com 22 $ timeout 5 nc -vz 192.168.100.2 8080
(нет ответа, соединение заблокировано, прервано по Ctrl+C) nc: connect to 192.168.100.2 port 8080 (tcp) failed: Connection timed out
\end{verbatim} \end{verbatim}
} }
@@ -954,7 +944,7 @@ $ sudo tcpdump -i any -n icmp
\subsection{Выводы} \subsection{Выводы}
В ходе практической работы №4 на стенде из двух виртуальных машин VirtualBox настроена политика межсетевого экранирования средствами \texttt{iptables}. Реализована схема с политикой \texttt{DROP} по умолчанию и разрешающими правилами для loopback, DNS, исходящего ping, входящего ping от адреса \texttt{192.168.100.2} и HTTP/HTTPS. Экспериментальная проверка подтвердила пропуск разрешённого трафика и блокировку соединений, не описанных в политике. Анализ трафика утилитой \texttt{tcpdump} продемонстрировал соответствие наблюдаемой сетевой активности заданным правилам фильтрации. В ходе практической работы №4 на стенде из двух виртуальных машин VirtualBox настроена политика межсетевого экранирования средствами \texttt{iptables}. Реализована схема с политикой \texttt{DROP} по умолчанию и разрешающими правилами для loopback, DNS, исходящего ping, входящего ping от адреса \texttt{192.168.100.2} и HTTP/HTTPS; ответный трафик по этим сценариям на цепочке \texttt{INPUT} обрабатывается правилом \texttt{ESTABLISHED,RELATED}. Экспериментальная проверка подтвердила пропуск разрешённого трафика и блокировку соединений, не описанных в политике. Анализ трафика утилитой \texttt{tcpdump} продемонстрировал соответствие наблюдаемой сетевой активности заданным правилам фильтрации.
\newpage \newpage