Введение
В этой лабораторной работе вы научитесь использовать iptables — мощную утилиту брандмауэра командной строки в Linux — для блокировки входящего ICMP-трафика. Вы настроите правило брандмауэра для сброса (drop) пакетов протокола ICMP, который часто используется командой ping для проверки сетевого соединения. Это фундаментальный навык для защиты системы Linux путем управления сетевым доступом на уровне протоколов.
Вы начнете с предварительного сканирования сети с помощью nmap, чтобы оценить открытые порты системы. Затем вы установите контрольную точку, используя ping, чтобы убедиться, что изначально ICMP-трафик разрешен. Основная часть работы будет посвящена созданию и применению специфического правила iptables для сброса всех входящих ICMP-пакетов. Наконец, вы проверите активность правила и протестируете его эффективность, попытавшись снова выполнить команду ping в адрес вашей машины, чтобы подтвердить успешную блокировку запросов.
Сканирование открытых портов TCP и UDP с помощью nmap
На этом этапе вы научитесь использовать инструмент nmap для сканирования собственной системы на наличие открытых сетевых портов. Сетевые порты — это конечные точки связи в операционной системе. Когда программа хочет получать информацию из сети, она «слушает» определенный порт. Сканирование открытых портов — это важный первый шаг в оценке безопасности машины, так как каждый открытый порт представляет собой потенциальную точку входа для злоумышленника.
Сначала необходимо установить nmap, так как он не входит в базовое окружение. Перед установкой нового программного обеспечения рекомендуется обновить список пакетов.
Выполните следующую команду для обновления списка пакетов:
sudo apt-get update
Теперь установите nmap, выполнив:
sudo apt-get install -y nmap
Вы должны увидеть вывод, указывающий на установку nmap и его зависимостей.
Затем вам нужно узнать IP-адрес вашей машины, чтобы указать nmap, что именно сканировать. Это можно сделать с помощью команды ip.
ip addr show
Ищите запись вроде eth0 или ens33. Ваш IP-адрес будет указан рядом с inet. Он будет выглядеть примерно так: 172.16.50.13/24.
Как определить ваш IP-адрес из вывода:
- Найдите интерфейс со статусом
state UP(обычно этоeth0). - Найдите строку, начинающуюся с
inet(неinet6). - Возьмите только часть с IP-адресом до косой черты
/(например, если вы видитеinet 172.16.50.13/24, ваш IP-адрес —172.16.50.13). - Игнорируйте петлевой интерфейс (loopback,
lo) с адресом127.0.0.1.
В оставшейся части этой лабораторной работы мы будем использовать <your_IP_address> в качестве заполнителя для вашего реального IP-адреса.
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:16:3e:04:c3:1d brd ff:ff:ff:ff:ff:ff
altname enp0s5
altname ens5
inet 172.16.50.13/24 metric 100 brd 172.16.50.255 scope global dynamic eth0
valid_lft 1892159940sec preferred_lft 1892159940sec
inet6 fe80::216:3eff:fe04:c31d/64 scope link
valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:1d:45:49:f8 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
Теперь вы готовы к первому сканированию. Начнем со сканирования открытых портов TCP (Transmission Control Protocol). TCP — это протокол с установлением соединения, который используется для многих распространенных служб, таких как SSH (порт 22) и HTTP (порт 80). Опция -sT в nmap выполняет сканирование методом установления TCP-соединения.
Важно: Замените <your_IP_address> на реальный IP, который вы нашли на предыдущем шаге. Например, если ваш IP 172.16.50.13, команда будет выглядеть так: nmap -sT 172.16.50.13.
Замените <your_IP_address> на ваш IP и выполните команду:
nmap -sT <your_IP_address>
В выводе будут перечислены порты, находящиеся в состоянии "open" (открыт). В вашей системе, скорее всего, по умолчанию будет открыт порт SSH (22), а также могут быть запущены дополнительные службы на других портах.
Starting Nmap 7.80 ( https://nmap.org ) at 2025-07-01 14:08 CST
Nmap scan report for iZrj93qpoj98oqswu96cqfZ (172.16.50.13)
Host is up (0.00013s latency).
Not shown: 997 closed ports
PORT STATE SERVICE
22/tcp open ssh
3000/tcp open ppp
3001/tcp open nessus
Nmap done: 1 IP address (1 host up) scanned in 0.06 seconds
Далее просканируем порты UDP (User Datagram Protocol). UDP — это протокол без установления соединения, используемый для таких служб, как DNS (порт 53) и DHCP (порт 67/68). Сканирование UDP может быть медленнее и менее надежным, чем сканирование TCP. Использование sudo дает более точные результаты при UDP-сканировании. Опция -sU указывает nmap выполнить сканирование UDP.
Помните: Замените <your_IP_address> на ваш реальный IP-адрес.
Замените <your_IP_address> на ваш IP и выполните команду:
sudo nmap -sU <your_IP_address>
Вывод может показать порты в состоянии open|filtered. Это означает, что nmap не может определить, открыт ли порт или сканирование блокируется брандмауэром. Это обычный результат для UDP-сканирования.
Starting Nmap 7.80 ( https://nmap.org ) at 2025-07-01 14:09 CST
Nmap scan report for iZrj93qpoj98oqswu96cqfZ (172.16.50.13)
Host is up (0.0000060s latency).
Not shown: 998 closed ports
PORT STATE SERVICE
68/udp open|filtered dhcpc
5353/udp open|filtered zeroconf
Nmap done: 1 IP address (1 host up) scanned in 1.29 seconds
Выполнив эти сканирования, вы успешно идентифицировали службы, ожидающие сетевых подключений на вашей машине.
Проверка исходной сетевой связности с помощью ping
На этом этапе вы воспользуетесь командой ping, чтобы убедиться, что ваша система отвечает на сетевые запросы перед внедрением каких-либо правил брандмауэра. Команда ping отправляет пакеты ICMP (Internet Control Message Protocol) типа "echo request" целевому хосту. Если хост доступен и настроен на ответ, он отправит обратно пакет "echo reply". Это базовый способ проверки сетевой связности.
Прежде чем создавать правило брандмауэра для блокировки этого типа трафика, мы должны подтвердить, что в данный момент трафик разрешен. Это гарантирует, что при последующем тестировании мы будем уверены: блокировка вызвана именно нашим правилом, а не какой-то другой предсуществующей проблемой в сети.
Мы будем пинговать адрес "петли" (loopback) — 127.0.0.1. Этот специальный IP-адрес всегда указывает на вашу собственную машину, позволяя тестировать локальный сетевой стек без необходимости внешнего соединения или даже знания назначенного IP-адреса вашей машины.
Чтобы отправить ровно четыре пакета и остановиться, мы используем опцию -c 4. Это важно, так как без нее ping будет работать бесконечно, пока вы не остановите его вручную с помощью Ctrl+C.
Откройте терминал и выполните следующую команду:
ping -c 4 127.0.0.1
Вы должны увидеть вывод, показывающий, что четыре пакета были отправлены и четыре получены. Это означает, что ваша система корректно отвечает на ICMP-запросы.
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.045 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.055 ms
64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.052 ms
64 bytes from 127.0.0.1: icmp_seq=4 ttl=64 time=0.053 ms
--- 127.0.0.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3070ms
rtt min/avg/max/mdev = 0.045/0.051/0.055/0.003 ms
Строка 0% packet loss подтверждает, что соединение работает идеально. Теперь, когда вы установили базовое состояние, вы готовы настроить правило брандмауэра для блокировки этого вида связи.
Создание правила iptables для сброса ICMP-пакетов
На этом этапе вы настроите простое правило брандмауэра с помощью iptables — стандартной утилиты командной строки для управления правилами фильтрации сетевых пакетов в ядре Linux. Мы создадим правило для блокировки ICMP-трафика, который вы ранее протестировали командой ping.
iptables работает с системой таблиц, цепочек и правил.
- Таблицы (Tables): Это коллекции цепочек для определенных целей. Самая часто используемая таблица —
filter, она является стандартной и применяется для фильтрации пакетов. - Цепочки (Chains): Это списки правил, которые проверяются по порядку. Для входящего трафика используется цепочка
INPUT. - Правила (Rules): Правило определяет критерии для пакета (например, его протокол или адрес источника) и действие (target) — что сделать с пакетом (например,
ACCEPT— разрешить илиDROP— сбросить).
Сначала давайте изучим текущий набор правил. Поскольку iptables изменяет настройки ядра, необходимо использовать sudo. Опция -L выводит список правил в таблице filter по умолчанию.
sudo iptables -L
Вы увидите три стандартные цепочки: INPUT, FORWARD и OUTPUT. В этой среде вы можете заметить, что Docker уже создал некоторые правила в цепочке FORWARD и добавил пользовательские цепочки для работы сети контейнеров. Цепочки INPUT и OUTPUT по-прежнему используют политику ACCEPT по умолчанию для обычного трафика.
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy DROP)
target prot opt source destination
DOCKER-USER all -- anywhere anywhere
DOCKER-ISOLATION-STAGE-1 all -- anywhere anywhere
ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED
DOCKER all -- anywhere anywhere
ACCEPT all -- anywhere anywhere
ACCEPT all -- anywhere anywhere
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain DOCKER (1 references)
target prot opt source destination
Chain DOCKER-ISOLATION-STAGE-1 (1 references)
target prot opt source destination
DOCKER-ISOLATION-STAGE-2 all -- anywhere anywhere
RETURN all -- anywhere anywhere
Chain DOCKER-ISOLATION-STAGE-2 (1 references)
target prot opt source destination
DROP all -- anywhere anywhere
RETURN all -- anywhere anywhere
Chain DOCKER-USER (1 references)
target prot opt source destination
RETURN all -- anywhere anywhere
Теперь добавим правило для блокировки входящих ICMP-пакетов. Мы добавим (-A, append) новое правило в цепочку INPUT.
Команда строится следующим образом:
sudo iptables: Команда для управления брандмауэром.-A INPUT: Добавить правило в цепочкуINPUT.-p icmp: Это правило применяется к пакетам, использующим протоколicmp.-j DROP: Если пакет соответствует критериям, перейти к действиюDROP, которое незаметно отбрасывает пакет без отправки ответа.
Выполните следующую команду для создания правила:
sudo iptables -A INPUT -p icmp -j DROP
Эта команда не выведет ничего в случае успеха. Теперь вы проинструктировали брандмауэр ядра сбрасывать все входящие ICMP-пакеты из любого источника.
Проверка правила брандмауэра и тестирование блокировки
На этом заключительном этапе вы подтвердите, что ваше новое правило брандмауэра было успешно добавлено, а затем протестируете его действие, попытавшись снова выполнить ping вашей системы. Процесс проверки критически важен в сетевом администрировании для обеспечения правильной реализации политик безопасности.
Сначала снова просмотрим список правил, чтобы увидеть ваше нововведение. Выполнив ту же команду, что и раньше, вы увидите текущее состояние брандмауэра.
sudo iptables -L
Теперь вы должны увидеть новое правило в цепочке INPUT. Вывод наглядно показывает, что пакеты, соответствующие протоколу icmp, будут направляться к цели DROP.
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP icmp -- anywhere anywhere
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Теперь, когда вы подтвердили наличие правила, давайте его протестируем. Выполните ту же команду ping, которую вы использовали на шаге 2.
ping -c 4 127.0.0.1
На этот раз ответов не будет. Команда как будто «зависнет» на несколько секунд, а затем завершится. Вывод покажет 100% packet loss (100% потеря пакетов). Это ожидаемое поведение, так как брандмауэр ядра теперь молча отбрасывает входящие ICMP-пакеты, как вы и приказали.
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
--- 127.0.0.1 ping statistics ---
4 packets transmitted, 0 received, 100% packet loss, time 3055ms
Вы успешно заблокировали ICMP-трафик! Правила, создаваемые с помощью iptables, не являются постоянными и будут стерты после перезагрузки системы. Однако полезно знать, как удалить правило вручную. Это можно сделать с помощью флага -D (delete), указав то же самое правило, которое вы добавляли.
Давайте удалим правило, чтобы восстановить связность.
sudo iptables -D INPUT -p icmp -j DROP
Чтобы убедиться, что правило исчезло и связь восстановлена, выполните ping в последний раз.
ping -c 2 127.0.0.1
Теперь ping должен пройти успешно, подтверждая, что вы успешно удалили правило брандмауэра.
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.048 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.058 ms
--- 127.0.0.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1024ms
rtt min/avg/max/mdev = 0.048/0.053/0.058/0.005 ms
Резюме
В ходе этой лабораторной работы вы научились проводить начальную сетевую разведку в системе Linux. Вы начали с установки инструмента nmap для сканирования открытых портов TCP и UDP после определения IP-адреса машины. После этого вы установили базовый уровень сетевой связности с помощью команды ping, которая подтвердила, что система успешно принимает и отвечает на ICMP-трафик.
Основная часть работы была посвящена использованию утилиты брандмауэра iptables для управления сетевым трафиком. Вы составили и применили специальное правило в цепочке INPUT для сброса (DROP) всех входящих ICMP-пакетов, эффективно заблокировав такие инструменты, как ping. В завершение вы убедились в активности нового правила, просмотрев текущий набор правил iptables, и протестировали блокировку, попытавшись снова выполнить ping машины, подтвердив, что запросы теперь завершаются по тайм-ауту, как и ожидалось.



