19 KiB
Сетевые адаптеры:
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— защищаемый хост, IP192.168.100.1external-client— внешний клиент, IP192.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:
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
Пояснение:
-A INPUT— добавить правило в конец цепочкиINPUT, которая обрабатывает пакеты, входящие на этот хост.-p tcp— правило относится только к протоколу TCP.--dport 22— порт назначения 22, то есть SSH-сервер.-j ACCEPT— разрешить такой трафик.
Теперь разрешим ответы сервера по уже установленному SSH-соединению:
sudo iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT
Пояснение:
-A OUTPUT— добавить правило в цепочкуOUTPUT, то есть для пакетов, исходящих с этого хоста.-p tcp— правило касается TCP.--sport 22— исходный порт 22; это ответы SSH-сервера клиенту.-j ACCEPT— разрешить.
Такой вариант рабочий, но в Linux обычно лучше использовать правило состояний соединений. Поэтому следующим шагом мы добавим его тоже.
3. Разрешаем уже установленные и связанные соединения
Это одно из самых важных правил. Оно позволяет не расписывать вручную каждый ответный пакет.
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
Пояснение:
-
-A INPUT— правило для входящих пакетов. -
-m conntrack— подключить модуль отслеживания состояний соединений. -
--ctstate ESTABLISHED,RELATED— матчить пакеты:ESTABLISHED— относящиеся к уже установленному соединению;RELATED— связанные с уже существующим соединением.
-
-j ACCEPT— разрешить.
И аналогично для исходящих:
sudo iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
Пояснение:
- здесь то же самое, но для исходящих пакетов.
Это правило особенно важно для:
- SSH-сессии, в которой ты уже сидишь;
- ответов от DNS-сервера;
- ответов от HTTP/HTTPS-серверов;
- ответов на ping.
4. Разрешаем loopback
Loopback — это локальное взаимодействие внутри самой ОС через интерфейс lo. По условию лабы его нужно разрешить.
sudo iptables -A INPUT -i lo -j ACCEPT
Пояснение:
-i lo— входящий интерфейсlo, то есть loopback.-j ACCEPT— разрешить.
sudo iptables -A OUTPUT -o lo -j ACCEPT
Пояснение:
-o lo— исходящий интерфейсlo.-j ACCEPT— разрешить.
5. Разрешаем DNS
По условию нужно разрешить взаимодействие с DNS-сервером. Обычно DNS-запросы идут по UDP на порт 53. Иногда может использоваться и TCP 53, поэтому для учебной работы лучше разрешить оба варианта.
UDP DNS
sudo iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
Пояснение:
-A OUTPUT— правило для исходящих запросов.-p udp— DNS чаще всего использует UDP.--dport 53— порт назначения 53, стандартный порт DNS.-j ACCEPT— разрешить.
sudo iptables -A INPUT -p udp --sport 53 -j ACCEPT
Пояснение:
-A INPUT— правило для входящих ответов.-p udp— протокол UDP.--sport 53— исходный порт удалённого DNS-сервера равен 53.-j ACCEPT— разрешить.
TCP DNS
sudo iptables -A OUTPUT -p tcp --dport 53 -j ACCEPT
Пояснение:
- TCP используется реже, но может понадобиться для больших DNS-ответов или специальных случаев.
sudo iptables -A INPUT -p tcp --sport 53 -j ACCEPT
Пояснение:
- разрешает входящие TCP-ответы от DNS-сервера.
6. Разрешаем HTTP и HTTPS
По заданию нужно разрешить доступ к любым внешним серверам по HTTP/HTTPS.
HTTP
sudo iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT
Пояснение:
-p tcp— HTTP работает по TCP.--dport 80— порт назначения 80, стандартный HTTP.- правило разрешает открывать веб-страницы по HTTP.
sudo iptables -A INPUT -p tcp --sport 80 -j ACCEPT
Пояснение:
- разрешает входящие ответы от HTTP-сервера, у которого исходный порт 80.
HTTPS
sudo iptables -A OUTPUT -p tcp --dport 443 -j ACCEPT
Пояснение:
- порт 443 — стандартный HTTPS.
sudo iptables -A INPUT -p tcp --sport 443 -j ACCEPT
Пояснение:
- разрешает входящие ответы от HTTPS-сервера.
7. Разрешаем ping наружу
По заданию нужно разрешить использование ping для проверки достижимости любых компьютеров во внешней сети. Для ping используется протокол ICMP. Конкретно запрос — это echo-request, ответ — echo-reply.
sudo iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
Пояснение:
-p icmp— правило для протокола ICMP.--icmp-type echo-request— ICMP-пакеты типа “эхо-запрос”, то есть сам ping-запрос.-j ACCEPT— разрешить отправку.
sudo iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
Пояснение:
echo-reply— ответ на ping.- правило разрешает принимать ответы на отправленные запросы.
8. Разрешаем ping к защищаемому хосту только с одного адреса
По заданию защищаемый хост должен отвечать на ping только от одного конкретного внешнего адреса. В твоём стенде таким адресом будет 192.168.100.2, то есть external-client.
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— разрешить.
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 по умолчанию
Когда все разрешающие правила уже стоят, можно включить запрет всего остального.
sudo iptables -P INPUT DROP
Пояснение:
-P— установить политику по умолчанию для цепочки.INPUT— цепочка входящих пакетов.DROP— все пакеты, которые не подошли ни под одно разрешающее правило, будут отбрасываться.
sudo iptables -P OUTPUT DROP
Пояснение:
- то же самое для исходящих пакетов.
sudo iptables -P FORWARD DROP
Пояснение:
- цепочка
FORWARDнужна для транзитных пакетов через хост. - в этой лабораторной маршрутизатор делать не требуется, поэтому безопасно оставить
DROP.
10. Проверяем, что SSH не отвалился
Сразу после установки политик выполни:
sudo iptables -L -n -v --line-numbers
Пояснение:
- убедись, что правила SSH, loopback, DNS, HTTP/HTTPS и ICMP стоят в списке.
- также удобно смотреть счётчики пакетов: если SSH работает, у соответствующих правил будут увеличиваться значения.
Открой вторую SSH-сессию к firewall-host:
ssh -p 40001 arity@127.0.0.1
Пояснение:
- это контрольная проверка.
- пока первая сессия ещё жива, ты проверяешь, что новое подключение тоже проходит.
- если вторая сессия открылась, значит SSH точно не заблокирован.
11. Проверка правил по заданию
Проверка DNS
На firewall-host:
nslookup example.com
Пояснение:
nslookupотправляет DNS-запрос серверу имён.- если команда возвращает IP-адрес сайта, значит DNS разрешён.
Проверка HTTP
curl http://example.com
Пояснение:
curlделает HTTP-запрос к веб-серверу.- если приходит HTML-ответ, правило HTTP работает.
Проверка HTTPS
curl https://example.com
Пояснение:
- то же самое, но по HTTPS на порт 443.
Проверка ping наружу
ping -c 4 8.8.8.8
Пояснение:
ping— утилита проверки достижимости узла.-c 4— отправить только 4 запроса, а не бесконечно.8.8.8.8— внешний IP-адрес.- если ответы приходят, исходящий ping разрешён.
Проверка ping к защищаемому хосту с разрешённого адреса
На external-client:
ping -c 4 192.168.100.1
Пояснение:
- клиент
192.168.100.2должен успешно пинговатьfirewall-host, потому что именно этот источник разрешён.
Проверка блокировки лишнего трафика
Например, попробуй на firewall-host:
nc -vz example.com 22
Пояснение:
nc— netcat, утилита для проверки TCP/UDP-подключений.-v— подробный режим.-z— не передавать данные, а только проверить возможность подключения.example.com 22— попытка открыть TCP-соединение на порт 22.- так как доступ наружу разрешён только для DNS, HTTP, HTTPS и ping, это подключение должно не пройти.
Если nc не установлен, можно проверить другим способом, но ты писал, что инструменты уже есть, так что, скорее всего, всё нормально.
12. Контроль трафика через tcpdump
По заданию нужно показать прохождение пакетов через tcpdump.
Общий просмотр трафика:
sudo tcpdump -i any -n
Пояснение:
tcpdump— сниффер пакетов.-i any— слушать все интерфейсы сразу.-n— не преобразовывать адреса в имена.
Просмотр только ICMP:
sudo tcpdump -i any -n icmp
Пояснение:
- фильтр
icmpпокажет только ping-трафик.
Просмотр DNS:
sudo tcpdump -i any -n port 53
Пояснение:
port 53— показать DNS-пакеты.
Просмотр HTTP/HTTPS:
sudo tcpdump -i any -n 'tcp port 80 or tcp port 443'
Пояснение:
- кавычки нужны, чтобы shell корректно передал выражение целиком.
or— логическое “или”.- выражение показывает трафик к HTTP и HTTPS.
Просмотр SSH:
sudo tcpdump -i any -n tcp port 22
Пояснение:
- поможет убедиться, что SSH-пакеты действительно проходят через фильтр.
13. Сохранение правил
Когда убедишься, что всё работает, сохрани конфигурацию:
sudo netfilter-persistent save
Пояснение:
netfilter-persistentсохраняет текущие правила iptables, чтобы они восстановились после перезагрузки.
Можно дополнительно сохранить в файл:
sudo iptables-save > ~/iptables-lab4.rules
Пояснение:
- это текстовый дамп всех правил.
- удобно приложить к отчёту или использовать для восстановления.
14. Готовый набор команд в правильном порядке
Ниже — тот же порядок, но компактным блоком, чтобы ты мог выполнять по шагам:
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 по умолчанию, чтобы не потерять административный доступ к системе.
Это хорошо звучит и по сути верно.