Что именно происходит, когда я включаю net.ipv4.ip_forward=1?

Вопрос или проблема

Предположим, у меня есть ситуация, когда я написал программу для отравления кэша ARP на 2 устройствах (скажем, A и B), оба в локальной сети, чтобы успешно выполнить MITM с устройства M. Программа работает на устройстве M. Когда я включаю IP-перенаправление с помощью команды sysctl net.ipv4.ip_forward=1 на устройстве M, HTTP-соединение от устройства A к B может быть установлено без каких-либо проблем, и я могу видеть трафик на устройстве M.

Но в той же ситуации, когда после отравления кэшей ARP я отключаю IP-перенаправление с помощью команды sysctl net.ipv4.ip_forward=0 на устройстве M, HTTP-соединение не может быть установлено от устройства A к B. Я вижу пакет TCP SYN от устройства A на устройстве M. В моей программе, после получения SYN пакета на устройстве M, я изменяю исходный MAC-адрес в пакете на MAC-адрес M (с MAC-адреса A) и целевой MAC-адрес на MAC-адрес B (с MAC-адреса M) и ввожу его в сеть. Я не изменяю ничего с уровня сети и далее. Я могу видеть пакет на B с новыми исходным и целевым MAC-адресами с помощью команды TCPdump, что означает, что пакет доходит до B. Но B не отвечает на этот пакет, что я не могу понять почему.

Таким образом, вопрос в том, что особенного делает ip_forward=1, что такая ситуация с MITM работает? Чтобы уточнить, все машины работают на Linux. С включенным перенаправлением на устройстве M, мне не нужно изменять MAC-адреса в пакетах. Я просто отравляю кэш, и с этого момента всё работает нормально.

Ядро M получает пакет, чей IP-адрес назначения указывает, что он не предназначен для M. Что оно сделает?

Когда ip_forward=0, оно думает: “Я не знаю, почему это было отправлено мне, и мне действительно всё равно. В мусор его!”

С ip_forward=1, “Хм, это не для меня. Но я знаю, где находится получатель, так что просто перешлю его с правильным MAC-адресом.”

Иными словами, с ip_forward=1, вы не должны изменять MAC-адрес, потому что ваше ядро делает это за вас.

Минимальный пример эксперимента, где net.ipv4.ip_forward=1 является ключевым

Рассмотрим следующую топологию:

Интернет --- Wi-Fi --- Компьютер 1 --- Ethernet --- Компьютер 2

и предположим, что вы хотите, чтобы Компьютер 2 мог получить доступ к Интернету через Компьютер 1, например, потому что у Компьютера 2 нет Wi-Fi. Это, по сути, означает превращение Компьютера 1 в маршрутизатор, я думаю.

На: https://askubuntu.com/questions/3063/share-wireless-connection-with-wired-ethernet-port/1502850#1502850 я смог добиться этой настройки с двумя ноутбуками на Ubuntu, и, как важный шаг, мне пришлось выполнить эту команду на Компьютере 1:

sudo sysctl net.ipv4.ip_forward=1

потому что без этого Компьютер 1 просто не будет перенаправлять IP-пакеты от Компьютера 2 в Интернет.

С net.ipv4.ip_forward=0, мы можем получить доступ к Компьютеру 1 с Компьютера 2, но мы не можем выйти за пределы Компьютера 1 в Интернет и обратно.

Крутая вещь, которую можно сделать на Компьютере 1, когда net.ipv4.ip_forward=1, это наблюдать за проходящими пакетами с помощью:

sudo wireshark -k -f 'icmp' -i enp1s0f0 -i wlp2s0

Если вы выполните с Компьютера 2:

ping example.com

то каждый ping запрос создаст 4 строки в Wireshark, и вы сможете чётко увидеть, как Компьютер 1 принимает запросные пакеты от Компьютера 2 и перенаправляет их в Интернет, а затем принимает ответ обратно из Интернета и отправляет его Компьютеру 2:

         Время        Источник            Назначение             Hw src             Hw dst  Протокол
1 0.000000000     10.42.0.70  93.184.216.34  54:e1:ad:b5:5b:08  fc:5c:ee:24:fb:b4      ICMP  запрос  id=0x79ee, seq=8/2048, ttl=64 (ответ в 4)
2 0.000074761  192.168.1.123  93.184.216.34  04:7b:cb:cc:1b:10  9c:53:22:17:e2:0e      ICMP  запрос  id=0x79ee, seq=8/2048, ttl=63 (ответ в 3)
3 0.098882299  93.184.216.34  192.168.1.123  9c:53:22:17:e2:0e  04:7b:cb:cc:1b:10      ICMP  ответ    id=0x79ee, seq=8/2048, ttl=51 (запрос в 2)
4 0.098952451  93.184.216.34     10.42.0.70  fc:5c:ee:24:fb:b4  54:e1:ad:b5:5b:08      ICMP  ответ    id=0x79ee, seq=8/2048, ttl=50 (запрос в 1)

Довольно забавно, что практически любой компьютер, который работает на Linux и имеет более одного сетевого интерфейса, может работать как маршрутизатор.

Тестировано с компьютером 1 = Lenovo ThinkPad P14s, Компьютер 2 = Lenovo ThinkPad P51 с отключённым Wi-Fi, оба на Ubuntu 23.10.

Когда вы отравляете кэш ARP, A и B начинают отправлять датаграммы M, которые имеют MAC-адрес M, но IP-адреса B и A соответственно. Таким образом, эти датаграммы направлены на M на уровне 2 (ethernet), но направлены на другое устройство на уровне 3 (IP). Чтобы отправить эти датаграммы на уровень 3 получателя (согласно IP-адресу), M должен выполнить IP-перенаправление.

С net.ipv4.ip_forward=0 вы отключаете IP-перенаправление, с net.ipv4.ip_forward=1 вы его включаете.


Зачем нужно IP-перенаправление?

Посмотрите на модель OSI. Там вы найдёте

  • HTTP на уровне 7
  • TCP на уровне 4
  • IP на уровне 3
  • Ethernet на уровне 2

Ваше отравление ARP влияет на уровень 2.

Если нет отравления ARP, HTTP-сообщение от A к B упаковывается в TCP-поток (направленный на порт 80), который отправляется с использованием IP на IP-адрес B. IP-адрес B ассоциирован с Ethernet-адресом B, и датаграммы проходят напрямую (через хаб или свитч) от A к B и обратно. Нет необходимости в IP-перенаправлении.

Когда вы отравляете кэш ARP A и B, указывая на M, происходит следующее. HTTP-сообщение от A к B упаковывается в TCP-поток (направленный на порт 80), который отправляется с использованием IP на IP-адрес B. IP-адрес B ассоциирован с Ethernet-адресом M, и датаграммы поступают на M. M не является предполагаемым получателем этих датаграмм.

Для работы HTTP-соединения M должен пересылать IP-датаграммы от A к B и обратно. Это может произойти либо через ядро с указанной настройкой, либо с помощью специальной программы, которая прослушивает эти датаграммы и пересылает их снова.

Ответ или решение

Когда вы включаете параметр net.ipv4.ip_forward=1 в Linux, вы по сути делаете ваш компьютер маршрутизатором, позволяя ему пересылать IP-пакеты между различными сетевыми интерфейсами. Это особенно полезно в ситуациях, когда требуется обеспечить межсетевую маршрутизацию, а также может быть критично для проведения атак типа "Man-in-the-Middle" (MITM), как описано в вашей ситуации.

Теория

Для того чтобы понять, что происходит при включении IP-переадресации, необходимо рассмотреть работу сетевого стека в Unix-подобных системах и понять, как функционирует маршрутизация на уровне сетевого слоя (Layer 3 OSI-модели). В обычной ситуации, когда компьютер получает пакет, адресованный не ему (на основании IP-адреса), этот пакет просто отбрасывается. Однако, когда включена IP-переадресация, ядро системы проверяет свое маршрутное дерево и, если найдется подходящий маршрут, перенаправляет пакет по нужному адресу. Это критично для устройств, которые должны действовать как промежуточные узлы в сети, такие как маршрутизаторы.

Пример

Рассмотрим конкретный случай, который вы описали. У вас есть два устройства (A и B), обменивающиеся HTTP-трафиком в локальной сети. Устройство M, на котором выполнена ARP-подмена, становится промежуточным звеном. Когда вы включаете IP-переадресацию на M, система автоматически обрабатывает приходящие пакеты от устройства A, которые направлены к B, и перенаправляет их, корректируя только MAC-адреса на канальном уровне (Level 2). Это позволяет трафику между A и B беспрепятственно проходить через M, не создавая разрывов соединения.

Когда вы отключаете IP-переадресацию, пакеты, приходящие на M, но не предназначенные ему (на уровне IP), не перенаправляются дальше к B, и передача TCP не может быть завершена. Фреймы с правильными MAC-адресами достигают B, но так как M не принимает и не обрабатывает обратные пакеты от B, коммуникация нарушается.

Применение

Это имеет практическое значение в реальном мире не только для сетевых атак, но и при настройке различных сетевых устройств, например, когда требуется чтобы компьютер или сервер выступал в роли шлюза или NAT. В корпоративной среде это может быть использовано для настройки сложных VLAN структур или обеспечения изоляции сетевых сегментов.

Если вы хотите, чтобы одно устройство служило транзитным узлом для других, необходимо активировать IP-переадресацию. На примере, если у вас есть устройство (например, Laptop, имеющий соединение с интернетом через Wi-Fi, и вы хотите, чтобы другой компьютер коммерчески использовал это соединение через проводное подключение), включение net.ipv4.ip_forward станет ключевым шагом.

Чтобы обеспечивать безопасность и управляемость таких соединений, следует также рассмотреть использование брандмауеров и других средств контроля доступа в сеть, чтобы защитить основной транзитный узел от несанкционированного доступа или атак.

Таким образом, включение ip_forward на устройство M заключает в себе различные аспекты — от корректной конфигурации сетевой маршрутизации до обеспечения проведения специализированных сетевых операций, таких как MITM. Это делается путем манипуляции настройками системы таким образом, чтобы устройство выполняло функцию маршрутизатора, обеспечивая плавный обмен данными между различными сетевыми сегментами.

Оцените материал
Добавить комментарий

Капча загружается...