From 7c83fe5e1ab0216decaa6a9acc81c8ad38316bc8 Mon Sep 17 00:00:00 2001 From: Arity-T Date: Sat, 4 Apr 2026 10:21:42 +0300 Subject: [PATCH] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F=20lab4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lab4/README.md | 81 ++++++++++++++--------------------------------- report/report.tex | 52 ++++++++++++------------------ 2 files changed, 45 insertions(+), 88 deletions(-) diff --git a/lab4/README.md b/lab4/README.md index 393316b..eb492c5 100644 --- a/lab4/README.md +++ b/lab4/README.md @@ -122,7 +122,11 @@ sudo iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT * SSH-сессии, в которой ты уже сидишь; * ответов от DNS-сервера; * ответов от 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. * `-j ACCEPT` — разрешить. -```bash -sudo iptables -A INPUT -p udp --sport 53 -j ACCEPT -``` - -Пояснение: - -* `-A INPUT` — правило для входящих ответов. -* `-p udp` — протокол UDP. -* `--sport 53` — исходный порт удалённого DNS-сервера равен 53. -* `-j ACCEPT` — разрешить. +Входящие ответы DNS (UDP с `sport 53`) после этого правила пропускаются правилом `ESTABLISHED,RELATED` на `INPUT`; отдельная строка `INPUT --sport 53` не нужна и при типичном порядке правил всё равно не получила бы трафика. ## TCP DNS @@ -187,14 +182,7 @@ 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-сервера. +* входящие TCP-ответы от DNS идут через `ESTABLISHED,RELATED` на `INPUT`. --- @@ -214,13 +202,7 @@ sudo iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT * `--dport 80` — порт назначения 80, стандартный HTTP. * правило разрешает открывать веб-страницы по HTTP. -```bash -sudo iptables -A INPUT -p tcp --sport 80 -j ACCEPT -``` - -Пояснение: - -* разрешает входящие ответы от HTTP-сервера, у которого исходный порт 80. +Входящие ответы HTTP (и далее HTTPS) принимаются правилом `ESTABLISHED,RELATED` на `INPUT`; отдельное `INPUT --sport 80` не требуется. ## HTTPS @@ -232,13 +214,7 @@ sudo iptables -A OUTPUT -p tcp --dport 443 -j ACCEPT * порт 443 — стандартный HTTPS. -```bash -sudo iptables -A INPUT -p tcp --sport 443 -j ACCEPT -``` - -Пояснение: - -* разрешает входящие ответы от HTTPS-сервера. +Входящие ответы HTTPS обрабатываются на `INPUT` через `ESTABLISHED,RELATED`. --- @@ -256,14 +232,7 @@ sudo iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT * `--icmp-type echo-request` — ICMP-пакеты типа “эхо-запрос”, то есть сам ping-запрос. * `-j ACCEPT` — разрешить отправку. -```bash -sudo iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT -``` - -Пояснение: - -* `echo-reply` — ответ на ping. -* правило разрешает принимать ответы на отправленные запросы. +Ответы `echo-reply` на этот исходящий ping ядро относит к той же «сессии»; на `INPUT` они проходят через `ESTABLISHED,RELATED`. Отдельное правило `INPUT -p icmp --icmp-type echo-reply` не обязательно и при раннем conntrack дублирует его бесполезно. --- @@ -338,8 +307,8 @@ sudo iptables -L -n -v --line-numbers Пояснение: -* убедись, что правила SSH, loopback, DNS, HTTP/HTTPS и ICMP стоят в списке. -* также удобно смотреть счётчики пакетов: если SSH работает, у соответствующих правил будут увеличиваться значения. +* убедись, что правила SSH, conntrack, loopback, исходящие DNS/HTTP(S)/ICMP и узкое правило входящего ping с `192.168.100.2` стоят в списке. +* на `INPUT` основной рост счётчиков у «ответного» трафика обычно виден у строки `ESTABLISHED,RELATED`, а не у отдельных `--sport` (если ты их вообще не добавляешь). Открой **вторую SSH-сессию** к `firewall-host`: @@ -418,21 +387,24 @@ ping -c 4 192.168.100.1 ## Проверка блокировки лишнего трафика -Например, попробуй на `firewall-host`: +Надёжный вариант — **TCP на порт, который не разрешён политикой**, на второй ВМ в `intnet` (у тебя это `external-client`). + +На `external-client` подними слушатель на порт, например `8080`: ```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-подключений. -* `-v` — подробный режим. -* `-z` — не передавать данные, а только проверить возможность подключения. -* `example.com 22` — попытка открыть TCP-соединение на порт 22. -* так как доступ наружу разрешён только для DNS, HTTP, HTTPS и ping, это подключение должно не пройти. - -Если `nc` не установлен, можно проверить другим способом, но ты писал, что инструменты уже есть, так что, скорее всего, всё нормально. +* исходящий TCP на `192.168.100.2:8080` не попадает под разрешённые `dport 53`/`80`/`443`, поэтому при политике `OUTPUT DROP` соединение не устанавливается (обычно таймаут). +* проверка к `example.com:22` для отчёта часто бессмысленна: порт 22 у публичных имён часто закрыт независимо от твоего МЭ. --- @@ -538,17 +510,12 @@ 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 diff --git a/report/report.tex b/report/report.tex index d11df18..259df37 100755 --- a/report/report.tex +++ b/report/report.tex @@ -752,7 +752,7 @@ DNS-запросы обрабатываются службой \texttt{systemd-r Пакет последовательно сравнивается с правилами цепочки. При совпадении выполняется действие: \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{Реализация политики фильтрации} @@ -793,19 +793,14 @@ sudo iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT # Loopback sudo iptables -A INPUT -i 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 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 -# HTTP и HTTPS +# HTTP и HTTPS (ответы на INPUT через ESTABLISHED,RELATED) 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 -# Исходящий ping +# Исходящий ping (echo-reply на INPUT через ESTABLISHED,RELATED) 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 sudo iptables -A INPUT -p icmp --icmp-type echo-request \ -s 192.168.100.2 -d 192.168.100.1 -j ACCEPT @@ -818,7 +813,7 @@ sudo iptables -P FORWARD DROP \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}): @@ -827,28 +822,23 @@ sudo iptables -P FORWARD DROP Chain INPUT (policy DROP 0 packets, 0 bytes) 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 -2 10 760 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 -4 0 0 ACCEPT udp * 0.0.0.0/0 0.0.0.0/0 udp spt:53 -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 +2 312 142K ACCEPT all * 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED +3 12 780 ACCEPT all lo 0.0.0.0/0 0.0.0.0/0 +4 8 672 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 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 -3 0 0 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 +2 289 33680 ACCEPT all * 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED +3 12 780 ACCEPT all * lo 0.0.0.0/0 0.0.0.0/0 +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 -6 0 0 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 -8 0 0 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 +6 4 240 ACCEPT tcp * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 +7 10 600 ACCEPT tcp * 0.0.0.0/0 0.0.0.0/0 tcp dpt:443 +8 4 336 ACCEPT icmp * 0.0.0.0/0 0.0.0.0/0 icmptype 8 +9 8 672 ACCEPT icmp * 192.168.100.1 192.168.100.2 icmptype 0 \end{verbatim} } @@ -915,12 +905,12 @@ arity@external-client:~$ ping -c 4 192.168.100.1 \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 \begin{verbatim} -$ nc -vz example.com 22 -(нет ответа, соединение заблокировано, прервано по Ctrl+C) +$ timeout 5 nc -vz 192.168.100.2 8080 +nc: connect to 192.168.100.2 port 8080 (tcp) failed: Connection timed out \end{verbatim} } @@ -954,7 +944,7 @@ $ sudo tcpdump -i any -n icmp \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