У каждого кабельного провайдера наступает момент, когда в сети появляются «сознательные» пользователи, к подключению которых сам оператор не имел никакого отношения, а также не менее «сознательные» пользователи, использующие чужие 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. В заключение хочу добавить, что в независимости от избранного метода, необходимо не забывать добавлять данные о новых пользователях, иначе это грозит «труднодиагностируемыми проблемами».