ARP - Nag.ru

advertisement
У каждого кабельного провайдера наступает момент, когда в сети появляются
«сознательные» пользователи, к подключению которых сам оператор не имел никакого
отношения, а также не менее «сознательные» пользователи, использующие чужие IPадреса.
Единственным доступным для большинства операторов методом, к сожалению, с не
100% эффективностью, является идентификация пользователей по зарегистрированным
аппаратным адресам сетевых интерфейсов и ведение статической ARP-таблицы.
Статические записи в ARP гарантируют, что зарегистрированному IP адресу не будет
соответствовать иной аппаратный адрес, но абсолютно не гарантируют, что не появится
динамическая пара «неизвестный MAC + неизвестный IP” или «известный MAC +
неизвестный IP”. Для того чтобы не пропускать трафик с таких адресов есть несколько
способов.
Классический:
заполнение
ARP-таблицы
аппаратными
адресами
00:00:00:00:00:00 для неиспользуемых адресов IP. Также возможен вариант использования
ARP в режиме reply-only или применение фильтра пакетов srm-mac-address (или подобной).
Каждый из способов имеет свои достоинства и недостатки. Общее между ними –
необходимость иметь на каждом маршрутизаторе данные по MAC и IP адресам
существующих клиентов. В случае если над возможностью возникновения данной
проблемы изначально не задумывались, именно это может стать основной трудностью. На
мой взгляд, при решении данной проблемы, необходимо исходить из того, что в
большинстве случаев пользователи используют свои адреса и являются легально
подключенными, а данные, полученные на основе динамических записей ARP-таблицы, в
большинстве случаев будут идентифицировать обычного пользователя. В таком случае,
возможно использование этих данных с последующей проверкой на соответствие
зарегистрированным. Ниже приведен листинг console script для MikroTik Router OS,
создающий статические записи в ARP-таблице на основе динамических, а также
отчитывающийся в системный лог.
#------------------------Протестировано на MikroTik Router OS 2.6.13------------------------------:local dmac
:local smac
:local ipaddress
:local iface
:local exist
:set exist false
:foreach i in [/ip arp find dynamic=yes ] do={
:set dmac [/ip arp get $i mac]
:set ipaddress [/ip arp get $i address]
:set iface [/ip arp get $i interface]
:foreach j in [/ip arp find dynamic=no ] do={
:set smac [/ip arp get $j mac]
:if ($dmac=$smac) do {
:set exist true
}
}
:if ($exist!=true) do {
:log message=( "Automatic adding new ARP entry with MAC " . $dmac)
/ip arp add copy-from=$i
}
}
Если данный скрипт будет запускаться sceduler в течение некоторого времени с
промежутком, например, в 5 минут, через некоторое время ARP-таблица будет содержать
статические записи по всем MAC адресам, которые появлялись в сети.
Далее необходимо остановить работу скрипта и проверить все записи в ARP-таблице
на соответствие имеющемуся длинному списку соответствий ARP-IP. Лишнее, естественно,
необходимо удалить.
Дальнейшие действия будут зависеть от избранного варианта борьбы с данной
категорией пользователей.
Если избрать способ, при котором все неиспользуемые адреса подсети будут
занесены в ARP-таблицу с аппаратными адресами 00:00:00:00:00:00, то необходимо
воспользоваться следующим скриптом.
#------------------------Протестировано на MikroTik Router OS 2.6.13------------------------------:local ipaddressdesclist
:local ipaddressdesc
:local ipaddress
:local bcast
:local iface
:local arplist
:local arp
:local arpipaddress
:local exist
:set ipaddressdesclist [/ip address find]
:set arplist [/ip arp find]
:set exist false
:foreach ipaddressdesc in $ipaddressdesclist do {
:set ipaddress [/ip address get $ipaddressdesc network]
:set bcast [/ip address get $ipaddressdesc broadcast]
:set iface [/ip address get $ipaddressdesc interface]
:set ipaddress ($ipaddress+1)
:while ($ipaddress < $bcast) do {
:foreach arp in $arplist do {
:set arpipaddress [/ip arp get $arp address]
:if ($ipaddress = $arpipaddress) do {
:set exist true
}
}
:if ($exist != true) do {
/ip arp add address = $ipaddress mac-address=00:00:00:00:00:00 interface=$iface
}
:set exist false
:set ipaddress ($ipaddress+1)
}
}
При использовании данного метода необходимо не забыть добавить в ARP-таблицу
соответствия ARP-IP для диагностического оборудования. В противном случае, при
возникновении проблем не представится возможным подключится к маршрутизатору.
Если воспользоваться возможностью MikroTik Router OS использовать ARP в режиме
reply-only, то необходимо сконфигурировать соответствующим образом все интерфейсы
маршрутизатора:
[admin@MikroTik] > interface ethernet set ether№ arp reply-only
Точно так же, как и при использовании MAC адресов 00:00:00:00:00:00, необходимо
не забыть о добавлении соответствий ARP-IP для диагностического оборудования.
К сожалению, описанные выше
способы могут усложнить процесс замены
вышедших из строя сетевых интерфейсов (например, во время грозы) соседних
маршрутизаторов. Если при обычных обстоятельствах необходимо было просто заменить
сгоревший интерфейс, то в данном случае необходимо будет еще и добавить его
аппаратный адрес в ARP-таблицу смежного маршрутизатора.
Так же, если пользователь сменит себе IP адрес для того, чтобы «нарушать правила
пользования сетью» в пределах одного сегмента, то не будет возможности отследить
данный прецедент. Так как динамическая запись о неизвестном IP адресе не появится в
ARP-таблице.
Последний предлагаемый вариант – использование опции ”src-mac-address” фильтра
пакетов. Для того чтобы использовать данный метод, необходимо одновременно с
созданием статической ARP-таблицы, добавлять разрешающие правила в цепочку forward
firewall. Это можно сделать, несколько модифицировав приведенный ранее скрипт для
создания статических записей в ARP-таблице.
#------------------------Протестировано на MikroTik Router OS 2.6.13------------------------------:local dmac
:local smac
:local ipaddress
:local iface
:local exist
:set exist false
:foreach i in [/ip arp find dynamic=yes ] do={
:set dmac [/ip arp get $i mac]
:set ipaddress [/ip arp get $i address]
:set iface [/ip arp get $i interface]
:foreach j in [/ip arp find dynamic=no ] do={
:set smac [/ip arp get $j mac]
:if ($dmac=$smac) do {
:set exist true
}
}
:if ($exist!=true) do {
:log message=( "Automatic adding new ARP entry with MAC " . $dmac)
/ip arp add copy-from=$i
:log message=("Automatic adding rule in forward chain with MAC address " . $dmac . "
and IP address " . $ipaddress )
/ip firewall rule forward add src-mac-address=$dmac src-address=$ipaddress srcnetmask=255\.255\.255\.255 in-interface=$iface action=accept
/ip firewall rule forward add dst-address=$ipaddress dst-netmask=255\.255\.255\.255
out-interface=$iface action=accept
}
}
В данном скрипте добавление статических записей в ARP-таблицу кажется
избыточным, но в данном случае ARP-таблица исполняет роль массива, хранящего данные
о тех адресах, которые были добавлены. Также, это может оказаться полезным
впоследствии.
Дальнейшие действия идентичны действиям при использования скрипта без
добавления правил в цепочку forward firewall, с той лишь разницей, что лишнее придется
удалять не только из ARP-таблицы, но и из правил firewall.
Далее необходимо добавить правила для прохождения пакетов из других сетей (в
случае, если данный маршрутизатор является промежуточным для других сетей), и
установить policy для цепочки forward в drop. Желательно, опять-таки, не забыть о
диагностическом оборудовании и добавить соответствующие записи в цепочку forward
firewall, иначе это будет необходимо делать перед диагностикой, в отдельно взятом случае.
Если говорить о недостатках данного метода, то есть очень существенные:
использование фильтра пакетов увеличит загрузку центрального процессора
маршрутизатора, а также задержки при передаче пакетов. Последнее, возможно, не будет
явно заметно, но увеличение загрузки центрального процессора может стать серьезной
проблемой при использовании в качестве аппаратной платформы компьютеров класса
Pentium I.
В заключение хочу добавить, что в независимости от избранного метода, необходимо
не забывать добавлять данные о новых пользователях, иначе это грозит
«труднодиагностируемыми проблемами».
Download