Работа с подсетями при помощи Прокси-ARP |
---|
Пред. | | След. |
Как использовать Прокси-ARP при работе с подсетями
На самом деле Прокси-ARP необходим только для передачи пакетов из сети 1 в
сеть 0. Обратно пакеты идут при помощи стандартной IP-маршрутизации.
В данном случае у сети 1 была 8-битная маска (255.255.255.0). Для сети 0 я
использовал 4-битную маску (255.255.255.240), тем самым получив возможность
иметь в ней 14 адресов (2 ^ 4 = 16, минус 0-ой и 15-ый). Заметьте что эта
подсеть может иметь любое количество бит, которое должно быть меньше
количества бит главной сети (т.е. 2, 3, 4, 5, 6 или 7 бит в моем случае)
Все IP-адреса сети 0 (всего их 16) являются подмножеством адресов сети 1.
Очень важно, чтобы ни у одной машины в сети 1 не было адреса, входящего в
пространство сети 0! В моем случае я "зарезервировал" для сети 0
адреса сети 1, оканчивающиеся на 64 .. 79. В данном примере, адреса 64 и 79
не могут использоваться машинами: 64 - этой адрес сети 0, а 79 - это
широковещательный адрес сети 0.
Машине A выделены два IP-адреса, один в адресном пространстве сети 0 для
настоящего Ethernet-интерфейса (eth0), а второй в пространстве сети 1 (не
сети 0) для интерфейса радио-карты (eth1).
Предположим, что машине C (в сети 1) необходимо послать пакет машине B (в
сети 0). Машина C, считая что находится в одной подсети с машиной B,
посылает в сети 1 широковещательный запрос с целью узнать Ethernet-адрес
машины B. Машина B не получит этот запрос - она не находится в одной
физической сети с машиной C - но этот запрос увидит машина A.
Вот здесь и начинается волшебство. Код arp в ядре Linux в машине A, будучи
правильно настроен (Прокси-ARP для подсетей), определяет, что ARP-запрос
идет из интерфейса сети 1 (eth1), а соответствующий IP-адрес находится в
сети 0. В этом случае машина A в ответе на запрос укажет свой собственный
Ethernet-адрес.
Машина C сделает запись в своем ARP-кэше, в котором укажет, что IP-адресу
машины B соответствует Ethernet-адрес машины A (в данном случае, адрес
радио-Ethernet карты). После этого машина C сможет послать пакет машине B
на этот Ethernet-адрес, и его получит машина A.
Получив такой пакет, машина A определит, что его получатель не она, а
машина B. Код IP-маршрутизации ядра Linux машины A попытается передать
пакет машине B в соответствии со своей таблицей маршрутизации (в которой
указано, какому интерфейсу, какая сеть соответствует). Однако, IP-адрес
машины B соответствует одновременно и сети 0, и сети 1.
Вот здесь происходит вторая часть волшебства. Маска подсети на интерфейсе 0
имеет в двоичном представлении больше единиц (то есть, более
конкретизирована), чем маска подсети интерфейса 1. Вследствие этого, код
маршрутизации сопоставит этот пакет с интерфейсом eth0, игнорируя
соответствие адреса в пакете сети 1 (из которой, собственно, этот пакет и
пришел).
Теперь машине A необходим "настоящий" физический (Ethernet) адрес
машины B (предположим, что его нет в ARP-кэше). Машина A посылает
ARP-запрос, но, в этот раз, код arp в ядре Linux определяет, что запрос идет
не из сети 1, и не посылает в ответ прокси-адрес интерфейса eth1. Вместо
этого, запрос производится в сети 0 (интерфейс eth0) - этот запрос увидит
машина B и пошлет в ответ свой (настоящий) физический (Ethernet) адрес.
Теперь машина A может переслать пакет (шедший от машины C) машине B.
Машина B получает пакет от машины C (через машину A) и ей надо послать
ответ. В этот раз машина B определяет, что машина C находится в другой
подсети (маска 255.255.255.240 подсети машины B исключает из ее адресного
пространства все машины, не входящие в сеть 0). В машине B маршрут по
умолчанию указывает на машину A - она посылает пакет через машину A. Теперь
код маршрутизации пакетов машины A определяет, что IP-адрес получателя
(машины C) находится в сети 1, и она посылает этот пакет машине C
через радио-Ethernet-интерфейс eth1.
Аналогично (и даже немного проще) происходит с пакетами
любых машин обеих сетей, предназначенными для машины A.
Очевидно, что, если другая машина (D) в сети 0 пошлет ARP-запрос
относительно физического адреса машины B, машина A получит этот запрос с
сети 0 и не пошлет в ответ прокси-адрес интерфейса eth1, определив, что
запрос идет из сети 0.
Заметьте, что в машинах B и C (и D) не требуется каких-то специальных
IP-настроек. В моем случае - это была дикая смесь из Sun, Macintosh и
PC-машин в сети 0, подключенных к остальному миру через Linux-машину
A.
Маленькое дополнение: заметьте, что физические (Ethernet) адреса,
полученные машинами A, B, C (и D), помещаются в ARP-кэш, и последующие
пакеты не вызовут повторной процедуры ARP-запрос-ответ. ARP-кэш обычно
удаляет записи с адресами после 5 минут их бездействия.
Пред. | Начало | След. |
Зачем при работе с подсетями нужен Прокси-ARP? | | Настройка Прокси-ARP |