Как бороться со сменой IP адресов клиентами локальной сети?

В статье рассмотрены методы противодействия смене IP-адресов в локальной сети. Данная проблема часто возникает у Интернет-провайдеров (пусть даже масштаба микрорайона или подъезда), которым необходимо точно знать, какой пользователь "скрывается" за тем или иным IP-адресом, поскольку на основе этой информации рассчитывается плата за трафик. Авторы статьи обсуждают шесть способов защиты - от простых до экзотических.

[Alexander V. Naumochkin и др.]

Keywords: arp mac ethernet ifconfig freebsd limit security From: Alexander V. Naumochkin Newsgroups: http://www.unixfaq.ru Date: Mon, 17 May 2004 18:21:07 +0000 (UTC) Subject: Как бороться со сменой IP адресов клиентами локальной сети

Оригинал: http://www.unixfaq.ru/index.pl?req=qs&id=169

Как бороться со сменой IP адресов клиентами локальной сети?

Оглавление

  • Статический ARP
  • Статический ARP + NOARP
  • Port Security
  • Туннелирование
  • Самописная аутентификация
  • 802.1x
Подобная проблема как правило возникает в локальной сети с платным доступом к интернет, где траффик считается по IP адресам.

Все приведенные ниже способы так или иначе используют аппаратный адрес сетевой карты MAC - Media Access Control. Во время работы машины в локальной сети в ее памяти хранятся пары MAC<->IP, которые обновляются динамически. Если в памяти нет записи для какого-то IP адреса, то посылается широковещательный запрос и машина имеющая этот IP отвечает.

Способ 1 (наиболее примитивный) - на все IP адреса MAC прописывается статически с помощью команды arp(8). На не никем занятые адреса прописывается MAC 0:0:0:0:0:0. Это можно делать приблизительно таким скриптом:

#!/bin/sh

mynet="192.168.0.";
n=1

while ( [ n -lt 255 ]; ); do
 arp -S $mynet$n 0:0:0:0:0:0
 n=$(expr $n \+ 1);
done

arp -f /etc/ethers
Здесь соответственно в переменной mynet задается защищаемая подсеть, в файле /etc/ethers лежат "правильные" пары IP<->MAC.

Однако все современные сетевые карты позволяют легко перепрограммировать MAC адрес. Во всяком случае под FreeBSD, Linux и тп это делается очень легко. Под различными Windows это возможно не всегда, в зависимости от драйвера сетевухи. Поэтому ничего не стоит прописать себе MAC 0:0:0:0:0:0 и спокойно работать с несуществующего IP. Значит данный способ защитит от всяких "умников", которые знают как мастдае меняется IP адрес. А от смены MAC это не спасет.

Способ 2: можно сделать так что бы arp lookup вообще не работал, и записи в таблицу можно было вносить исключительно с помощью arp(8). Тогда не придется присваивать нули всем пустым адресам. Делается это так:

Добавляем флаг -arp на интерфейс:

        ifconfig fxp0 -arp
и в файле /etc/rc.conf:
        ifconfig_fxp0="inet 192.168.1.1 netmask 255.255.255.0 -arp"
Создаем файл, в котором прописываем соответствия ip и MAC-адресов (например, /etc/ether.local) такого вида:
        192.168.1.2    00:80:23:5F:65:8C
        192.168.2.3    00:5C:67:9A:55:5B
        . . .
Очищаем arp-кэш и загружаем статическую таблицу:
        
        arp -ad
        arp -f /etc/ether.local
и добавляем последнюю команду в /etc/rc.local

Теперь на этом интерфейсе arp не работает вообще. То есть не только не принимаются обновления в arp-кэш, но и не отсылаются ответы на запросы arp who-has. А это значит, что и на клиентских машинах необходима статическая запись соответствия ip и MAC-адресов маршрутизатора. На Windows-машинах это делается записью вида:

        arp -s 192.168.1.1 00-79-36-FC-09-0F
В старых версиях FreeBSD поддержки флага -arp для интерфесов не было. Ниже приведен патч к ядру FreeBSD который это делает(возможно подобные патчи существуют и для других ОС).
--- if_ether.c.stdThu Sep 10 18:22:48 1998
+++ if_ether.cFri Sep 11 16:53:22 1998
@@ -482,6 +482,7 @@
 itaddr = myaddr;
 goto reply;
 }
+/*VV*/if (!(ac->ac_if.if_flags & IFF_NOARP)) {
 la = arplookup(isaddr.s_addr, itaddr.s_addr == myaddr.s_addr, 0);
 if (la && (rt = la->la_rt) && (sdl = SDL(rt->rt_gateway))) {
 if (sdl->sdl_alen &&
@@ -501,6 +502,7 @@
 la->la_hold = 0;
 }
 }
+/*VV*/}
 reply:
 if (op != ARPOP_REQUEST) {
 m_freem(m);
В этом patch'е блокируется только обновление arp-кэша, ответы на запросы не блокируются, поэтому статические записи на клиентских машинах не требуются. В версиях FreeBSD старше чем 4.9-RELEASE патч не требуется, такая функциональность есть out of box. Просто нужно сконфигурировать интерфейс с флагом staticarp.

Однако если какой-то пользователь выключит свой компьютер, то "хакер" может включить свой и установить его MAC. К сожалению против этого дешевыми способами защититься нельзя.

Способ 3: (дорогой и надежный) Port Security. Необходимо приобрести свитч, который позволяет сделать привязку MAC к конкретному физическому порту в свитче. А на роутере в свою очередь делается статическая привзяка IP к MAC, как описано в способе 1.Обмануть такую защиту практически невозможно. Однако стоят такие свитчи немало.Один из недостатков данного способа - клиенты будут удивляться, почему не работает интернет после смены сетевой карты.

Способ 4: (В последнее время все более и более популярный) Туннелирование. Для туннелирования в ethernet существует протокол PPPoE. Пример настройки можно посмотреть здесь Cетевая часть->PPP (http://www.unixfaq.ru/index.pl?id=79). Альтернативные протоколы туннелирования PPTP и L2TP требует предварительной выдачи клиенту какого-то IP адреса, поверх которого уже будет ходить реальный.

Способ 5: авторизация пользователей по паролю. При корректной реализации (криптованные пересылки) способ почти такой же непробиваемый, как и "умный" коммутатор. На машинке с firewall'ом ставится сервер и база login:password, у юзеров - соответствующий клиент. Перед началом работы пользователь запускает эту программу, сообщает серверу свои login/password, сервер прописывает в firewall'е разрешающее правило. Юзер работает. Клиентская софтинка у юзера регулярно извещает сервер "Я тут, я жив!". Когда юзер делает logoff или вырубает машину (сервер не получает keep-alive от клиента) - правило в firewall'е сносится.

Пример реализации есть на http://nag.ru.

Способ 6: (идеальный и не достижимый) - 802.1x. Протокол придуманный специально для авторизации в Ethernet. Основная идея состоит в том, что все защищенные порты на свитче находятся в "отключенном" состоянии, в котором они принимают только аутентификационные пакеты. По получении такого пакеты свитч проверяет его подлинность и включает порт. По окончании работы клиента порт снова "отключается". К сожалению свитч поддерживающий этот протокол стоит ~ $350, и поддержка 802.1x операционными системами оставляет желать лучшего.

P.S. Имеет также смысл взглянуть на следующий софт - arpwatch (http://www.Awfulhak.org/arpwatch/), который позволяет мониторить смену MAC адресов клиентами.

Создано: Alexander V. Naumochkin

Последнее обновление: Gleb Smirnoff

Статья взята с сайта OpenNet.

[ опубликовано 31/05/2004 ]

Alexander V. Naumochkin и др. - Как бороться со сменой IP адресов клиентами локальной сети?   Версия для печати