Привязка по mac-адресу в FreeBSD

Как-то настала необходимость начать привязывать мак-адреса клиентских компьютеров и прочих девайсов на шлюзе с FreeBSD.

Делается это не сложно, но руками делать это минимум неудобно.   Автоматизируем этот процесс с помощью Shell-a.

Задача —

Имеем сеть с диапазоном адресов 10.0.0.0/24 или 255.255.255.0 (как пример)

Необходимо автоматически добавлять статические записи в файл и добавлять их в arp-таблицу,  когда клиент обращается к шлюзу, вида 11:11:11:11:11:11 pub

pub заставляет машину быть ARP сервером
если даже комп ip и mac которого привязаны выключен,
то хацкер не сможет работать в сети.

Выполнить сканирование сети и добавить все отвечающие адреса в статическую arp-таблицу

Менять эти записи «на ходу» из файла

Реализация

Что нам понадобится —

maca — скрипт поиска новых arp-адресов и записывания их в файл
statarp.sh — скрипт запуска и перезагрузки статических записей в arp-таблицу из файла
arp_restart.sh — скрипт автоприменения при изменении

Создаем каталог в котором будут наши скрипты и файлы со статическими данными

mkdir /usr/home/macs

Пишем скрипт поиска новых arp-адресов и записывания их в файл статики /usr/home/macs/macs1

ee /usr/home/macs/maca
#!/bin/sh

arp -an | awk '{print$2,$4,$8}' | grep -v pub | grep -v ff:ff:ff:ff:ff:ff | \

grep -v incomplete | grep -v -w '10.0.0.28' | grep -v -w '10.0.0.16' | \

grep -v '10.0.0.200' | grep -v '10.0.0.201' | \

awk '{print$1,$2,"pub"}'| sed 's/(//' | sed 's/)//' > /usr/home/macs/macs2

if test -s /usr/home/macs/macs2

then

   cat /usr/home/macs/macs2 >> /usr/home/macs/macs1

   /usr/home/macs/./statarp.sh restart

fi

Что он делает —
arp -an просматривает текущую arp-таблицу на предмет маков
awk ‘{print$2,$4,$8}’ — выбирает нужные нам значения для записи в файл
grep -v pub — исключает уже существующие статические записи, если они есть
grep -v ff:ff:ff:ff:ff:ff — исключаем широковещательные запросы
grep -v incomplete — убираем маки, которые не нашлись
grep -v -w ’10.0.0.28′ — и исключаем по своему усмотрению адреса, маки которых мы не хотим привязывать
awk ‘{print$1,$2,»pub»}’| sed ‘s/(//’ | sed ‘s/)//’ > /usr/home/macs/macs2 — Дальше убираем кавычки, результат записываем в буферный файл /usr/home/macs/macs2, по которому мы проверяем что есть новые адреса для привязки.
Потом собственно проверяем, что если файл /usr/home/macs/macs2 НЕ пуст, значит, есть новые адреса.
Добавляем (не перезаписываем) новые адреса и маки с пометкой «pub» в основной файл статики cat /usr/home/macs/macs2 >> /usr/home/macs/macs1
И перегружаем arp-таблицу /usr/home/macs/./statarp.sh restart — скриптом который мы сейчас напишем)

Рисуем скрипт запуска и перезагрузки  statarp.sh, он будет перегружать arp-таблицу автоматически и вручную когда необходимо.

ee /usr/home/macs/statarp.sh
##!/bin/sh

# Static ARP-table loader

case $1 in

             start)

                     arp -d -a > /dev/null

                     arp -f /usr/home/macs/macs1 > /dev/null

                     echo 'Static ARP-table is loaded'

                     ;;

             stop)

                     arp -d -a > /dev/null

                     echo 'Static ARP-table is unloaded'

                     ;;

             restart)

                     arp -d -a > /dev/null

                     arp -f /usr/home/macs/macs1 > /dev/null

                     echo 'Static ARP-table is reloaded'

                     ;;

             status)

                     arp -an

                     ;;

         *)

                     echo "Usage: `basename $0` {start|stop|restart|status}" >&2

                     ;;

esac

exit 0

Как видно из скрипта, при запуске с опциями например ./statarp.sh start или ./statarp.sh restart — удаляет все записи arp-таблицы и загружает статические записи из файла /usr/home/macs/macs1
при запуске с опцией stop — ./statarp.sh stop — он просто удаляет все записи из arp-таблицы и ничего не подгружает.
Этот скрипт будет у нас вызываться из другого скрипта arp_restart.sh

ee /usr/home/macs/arp_restart.sh
#!/bin/sh

if test -s /usr/home/macs/macs1

then /usr/home/macs/statarp.sh restart

fi

Который просто проверяет наличие файла /usr/home/macs/macs1 и перезапускает наш statarp.sh с опцией restart

После этого добавляем скрипт maca в CRON для автозапуска раз в минуту (можно сделать его в цикле, но это по желанию уже)

echo "*/1 * * * * root /usr/home/macs/./maca" >> /etc/crontab

Через минуту файл /usr/home/macs/macs1 начнет заполняться привязанными адресами, выполните команду arp -an и вы должны увидеть записи типа

? (10.0.0.11) at 00:19:5b:fa:76:ba on em0 permanent published [ethernet]

? (10.0.0.12) at 00:15:f2:a5:5a:0c on em0 permanent published [ethernet]

? (10.0.0.13) at 00:1e:0b:5a:11:12 on em0 permanent published [ethernet]

? (10.0.0.14) at 02:bf:0a:00:00:0e on em0 permanent published [ethernet]

? (10.0.0.15) at 00:15:99:1e:7c:7f on em0 permanent published [ethernet]

? (10.0.0.16) at 50:e5:49:20:df:0c on em0 permanent published [ethernet]

published — и показывает что выполнена статическая привязка.

Когда вам нужно сбросить конкретный мак-адрес и привязать автоматически новый (например сменилась сетевая карта в компьютере пользователя) —
Отредактируйте файл /usr/home/macs/macs1

mcedit /usr/home/macs/macs1

найдите нужную строку вида 10.0.0.13 00:1e:0b:5a:11:12 pub
удалите ее
и просто выполните скрипт

sh /usr/home/macs/arp_restart.sh

который перезапустит arp-таблицу. Через минуту новый мак-адрес этого айпишника будет привязан снова автоматически.
И крайний момент, что бы в случае перезагрузки сервера, наши статически записи сразу применились, просто скопируйте скрипт перезапуска в /usr/local/etc/rc.d

cp /usr/home/macs/arp_restart.sh /usr/local/etc/rc.d/arp_restart.sh

и после ребута он загрузит из файла вашу arp-таблицу

На этом, в принципе, все. Привязка работает автоматически.

#########################################################################

Но я бы предложил обезопасить адреса, которые в данный момент не используются.
Например, если у вас в фаерволле разрешено форвардить любые адреса из внутренней сети и вы не хотите что бы кто-то присвоил себе IP-адрес, который у вас не используется и, соответственно, не записан в статической таблице ARP.

Принцип — нам нужно, ОДИН только раз, просканировать всю сеть (наш диапазон) на предметов мак-адресов и привязать неотвечающие хосты мак-адресом вида 11:11:11:11:11:11 — что бы никто не смог добавить свободный айпишник.
Во FreeBSD есть чудесная вещь для такого сканирования arp-scan. Ей и воспользуемся, пишем еще один скрипт —

ee /usr/home/macs/maca.new
#!/bin/sh

############## Установка mac-адресов на незадействованные айпишники

###

###   проверяет айпишники из файла /usr/home/macs/macs1, все айпишники, которых

###   нет в файле (и нет в исключениях!) добавляет с маком 11:11:11:11:11:11

###   выполнять один раз!

###

##############

# x -lt y        "x" меньше "y",

# -n строка существует

# "!" знак отрицания

# Сканируем нашу сеть, результатом будет все ответившие

# хосты - динамические записи в arp-таблице

arp-scan -I em0 -l > /dev/null 2>&1

### 10.0.0.x

n=0

while [ $n -lt 254 ] # выполняется пока n<254

do

    n=`expr $n + 1` # Вычисление выражения / expr выражение

    # Присваиваем другой переменной то, что получилось

    a=10.0.0.$n

    # Проверяем что бы такого адреса не было уже в статическом файле и

    # если его нет - записываем в буферный файл результат

    b=`cat /usr/home/macs/macs1 | grep -w $a`

        if !(test -n "${b}")

            then echo $a 11:11:11:11:11:11 pub >> /usr/home/macs/maca_temp2

        fi

done

###

    # Читаем буферный файл, исключаем нужные нам исключения,

    # добавляем результат в наш статический файл и применяем для arp-таблицы

    cat /usr/home/macs/maca_temp2 | grep -v -w '10.0.0.28' | \

    grep -v -w '10.0.0.16' | grep -v '195.8.40' | \

    grep -v '10.0.0.200' | >> /usr/home/macs/macs1

    rm -f /usr/home/macs/maca_temp2

    /usr/home/macs/./statarp.sh restart

### сортировка файла (опционально)

#cat /usr/home/macs/macs1 | sort -r > /usr/home/macs/macs_temp

#cat /usr/home/macs/macs_temp > /usr/home/macs/macs_temp1

#rm -f /usr/home/macs/macs_temp

Выполним наш скрипт один раз

sh /usr/home/macs/maca.new

После этого у вас весь ваш диапазон 10.0.0.0/24 будет привязан на шлюзе.

Источник http://www.soulbrat.org.ua/?p=127

Запись опубликована в рубрике *Lan&Wan, *Unix,*Linux, FreeBSD. Добавьте в закладки постоянную ссылку.

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Я не спамер This plugin created by Alexei91