Блокировка ICMP-трафика в Linux с помощью iptables

CompTIABeginner
Практиковаться сейчас

Введение

В этой лабораторной работе вы научитесь использовать 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-адрес из вывода:

  1. Найдите интерфейс со статусом state UP (обычно это eth0).
  2. Найдите строку, начинающуюся с inet (не inet6).
  3. Возьмите только часть с IP-адресом до косой черты / (например, если вы видите inet 172.16.50.13/24, ваш IP-адрес — 172.16.50.13).
  4. Игнорируйте петлевой интерфейс (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 машины, подтвердив, что запросы теперь завершаются по тайм-ауту, как и ожидалось.