Как-то настала необходимость начать привязывать мак-адреса клиентских компьютеров и прочих девайсов на шлюзе с 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