The OpenNET Project / Index page

[ новости/++ | форум | wiki | теги | ]

Заморозка ARP таблицы во FreeBSD (freebsd arp mac)


<< Предыдущая ИНДЕКС Правка src / Печать Следующая >>
Ключевые слова: freebsd, arp, mac,  (найти похожие документы)
From: Сергей Супрунов <amsand@yandex.ru.> Date: Wed, 16 Feb 2006 18:21:07 +0000 (UTC) Subject: Заморозка ARP таблицы во FreeBSD Оригинал:http://amsand.narod.ru/articles/arp.html Статья опубликована в журнале "Системный администратор", Июль 2004 При работе в локальной сети правила безопасности на сервере, как правило, относятся сразу ко всей подсети. Причем вполне обычная практика - оставлять в адресном пространстве резерв для будущего расширения. Да и невозможно в принципе задать подсеть, содержащую ровно 7 адресов - все равно придется выделять 14. То есть практически в любой сети есть неиспользуемые адреса, на которые распространяются общие правила доступа. Конечно, любые поползновения извне можно очень эффективно отсекать пакетными фильтрами и прочими изобретениями изворотливого человеческого разума. Но вряд ли найдется организация, в которой системный администратор может свято верить в грамотность, ответственность и порядочность всех без исключения сотрудников, работающих в сети изнутри. А если политика компании включает еще и попытки учитывать и ограничивать трафик с каждого IP-адреса, то нет никаких гарантий, что никому не придет в голову "случайно" прописать в своих настройках адрес соседа... Данная заметка о том, как решить указанную выше проблему, если роутер, через который локальная сеть выходит в "мир", построен на базе FreeBSD, а сама сеть включает два-три десятка машин, сосредоточенных в одном сегменте (при большем количестве компьютеров эффективность описываемой методики заметно снижается, хотя она и остается вполне работоспособной). Не могу гарантировать, что на всех версиях этой ОС все будет работать так, как описано, но для FreeBSD 5.2 никаких проблем обнаружено не было. Да, собственно, и взяться им неоткуда, настолько все просто. Сначала - немного теории. Для передачи кадра (речь будет идти об Ethernet) другому устройству сетевой адаптер машины должен знать его физический (MAC) адрес. Удаленное устройство будет принимать только кадры, содержащие в заголовке (поле Destination) его адрес, то есть адресованные именно ему. Ну, еще широковещательные кадры, адресованные на специальный адрес ff:ff:ff:ff:ff:ff. Но поскольку работа протоколов верхних уровней основана на IP-адресах, то кто-то должен уметь сопоставлять IP-адрес сетевого устройства с MAC-адресом его адаптера. Этим "кем-то" является протокол ARP (address resolution protocol). Собственно говоря, вся работа ARP заключается в том, чтобы по IP-адресу хоста возвратить MAC-адрес его адаптера, который используется для связи с данной машиной. Для этого ARP формирует в памяти компьютера (или другого устройства, на котором он запущен, например, коммутатора) таблицу соответствия, именуемую далее ARP-таблицей. Если требуемый физический адрес в ARP-таблице существует, то все соответствующие кадры направляются на него. Если нет, то отправляется широковещательный фрейм с IP-адресом искомого хоста. Этот фрейм принимают все адаптеры, и если, обработав этот запрос, удаленный хост видит в нем свой Интернет-адрес, то он отсылает ответ запросившему устройству, в котором, помимо прочего, содержится и MAC-адрес его адаптера. Эта информация добавляется в ARP-таблицу для дальнейшего использования. Формируемые описанным выше способом, то есть динамически, записи в ARP-таблице сохраняются временно. Если в течение 20 минут (значение по умолчанию) обращения к записи не происходит, она удаляется из таблицы. Помимо динамических записей, в ARP-таблице могут быть созданы постоянные (permanent), они же статические, записи. Они хранятся "вечно" (точнее - до перезагрузки), и, кроме того, попытка установить соединение с "чужим" IP-адресом с треском провалится, а в системном журнале появится сообщение об ошибке. К слову сказать, изменение динамической записи также сопровождается соответствующим сообщением, но соединение при этом устанавливается без каких-либо трудностей. Кроме того, если на момент подмены IP-адреса динамической записи с его участием в ARP-таблице не существует, то и никаких разоблачающих сообщений не появится. Управлять записями ARP-таблицы позволяет одноименная утилита arp. Ее полный синтаксис доступен в man arp(8). Нам понадобятся следующие команды: arp -a выводит содержимое таблицы ARP. arp <host> выводит ARP-запись для заданного хоста. arp -d <host> удаляет запись, соответствующую хосту. arp -d -a удаляет все записи таблицы. arp -s <host> <MAC-address> добавляет запись. arp -f <file> добавляет записи из файла соответствия <file>. Таким образом, дальнейшие действия понятны - для всех "критических" (а если сеть небольшая - то просто для всех) IP-адресов можно создать статические записи в ARP-таблице, тем самым исключив их подмену. Для этого существует два пути: * Использовать команду arp -s для создания каждой записи; * Создать файл соответствия и выполнить команду arp -f . Первый способ слишком трудоемкий, поэтому возьмем на вооружение второй вариант. В этом случае файл соответствия требуется создать один раз, и в дальнейшем будет очень легко обеспечить автоматическое заполнение ARP-таблицы статическими записями при перезагрузке компьютера. Формат файла соответствия продемонстрирован на следующем примере: # Host MAC-address 192.168.0.1 00:05:5d:ce:d6:3f 192.168.0.2 00:05:5d:29:ec:f4 То есть в каждой строке записывается IP-адрес хоста (либо его каноническое имя) и через пробелы или символы табуляции - соответствующий ему MAC-адрес. Заполнить его достаточно просто - включите все машины сегмента и обратитесь с них к серверу (или с сервера к ним) любым способом, например, запустите на них браузер или выполните обычный пинг. Это обновит ARP-таблицу, после чего достаточно будет сохранить в файл результат выполнения команды "arp -an" и немного его подправить, удалив все лишнее и добавив нужное. Сократить необходимые правки позволит следующая команда: # arp -an | awk -v OFS="\t" '{print(substr($2, 2, length($2)-2), $4)}' > ethers Теперь файл ethers будет заполнен нужным образом. Останется только удалить записи, которые мы хотим оставить динамическими (например, маршрутизаторы CISCO при перезагрузке могут менять MAC-адрес своих интерфейсов, выбирая их из некоторого пула, а добираться среди ночи на работу, чтобы подправить ARP-таблицу - занятие не из приятных). Для адресов, которые не задействованы в подсети, можно создать статические записи с фиктивными физическими адресами (например, 00:11:22:33:44:55). Это исключит возможность использования кем-либо данных IP-адресов. Далее очищаем ARP-таблицу и заполняем ее из сформированного файла: # arp -d -a # arp -f /usr/local/etc/ethers Естественно, имя и местоположение файла соответствия может быть любым удобным для Вас. Теперь осталось занести указанные команды в сценарий автозапуска, например, с именем /usr/local/etc/rc.d/statarp.sh: #!/bin/sh # Static ARP-table loader case $1 in start) arp -d -a > /dev/null arp -f /usr/local/etc/ethers > /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/local/etc/ethers > /dev/null echo 'Static ARP-table is reloaded' ;; status) arp -an ;; *) echo "Usage: `basename $0` {start|stop|restart|status}" >&2 ;; esac exit 0 Осталось не забыть сделать данный файл исполняемым. Итак, мы получили статическую таблицу соответствия между IP- и MAC-адресами. Теперь выход в Интернет через FreeBSD-сервер с "чужого" IP-адреса станет невозможным, если, конечно, заодно не подменить и MAC-адрес (с последним явлением можно бороться разве что организационными методами). Но любая палка, как известно, о двух концах. За повышение защищенности сети придется платить дополнительными заботами по администрированию, поскольку теперь добавление новой машины в сеть, замена сетевого адаптера, смена IP-адреса должны сопровождаться правкой и перезагрузкой ARP-таблицы. Хотя это все равно лучше, чем бегать по этажам, "вычисляя" недобросовестного пользователя. © Amsand <amsand@yandex.ru.>, 2005 (вер. от 21.11.2005)

<< Предыдущая ИНДЕКС Правка src / Печать Следующая >>

Обсуждение [ Линейный режим | Показать все | RSS ]
 
  • 1.1, 123 (??), 10:08, 19/03/2006 [ответить] [показать ветку] [···]    [к модератору]
  • +/
    arp blabla 00:00.... pub

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

    очень полезная вещь т.к. машина не только не пускает дальше себя(допустим в инет) но и не даёт работать в L2 сегменте

     
     
  • 2.3, Chyvak (?), 00:23, 22/03/2007 [^] [ответить]    [к модератору]
  • +/
    А это как?Как он как определит что комп выключен.
     
     
  • 3.13, AdVv (ok), 01:22, 09/12/2011 [^] [ответить]    [к модератору]
  • +/
    Грубо говоря сервер начинает отвечать на arp запросы вместо тех машин, которые есть в его списке статических arp записей. Соответственно эти arp записи попадают в таблицы всх машин в локальной сети. Если кто-то сменит IP, то его машина и сервер будут отвечать на один и тот же мак в arp запросе двумя разными IP, и у сменившего возникнут проблемы с коммуникацией не только с сервером, но и с другими машинами локальной сети. Что собственно и требуется.

    P.S. Да, я знаю что ответил через 4 года, но глядишь кому-то пригодится :)

     
  • 1.2, Alet (ok), 12:01, 18/08/2006 [ответить] [показать ветку] [···]    [к модератору]
  • +/
    Небольшое дополнение: чтобы не делать в файле фиктивные записи для  адресов,
    которые  не  задействованы  в  подсети
    нужно в rc.conf прописать для интерфейса локальной сети вот это -
    ifconfig_vr0="staticarp".
    Т.е. сервер твой не будет делать arp запросы на этом интерфейсе, и те машины
    которые не окажутся в файле, видеть его не смогут.

    (С) не моё. Чесно стянуто с рассылки

     
  • 1.4, Lion_Ua (ok), 01:31, 16/07/2007 [ответить] [показать ветку] [···]    [к модератору]
  • +/
    staticarp ето не тоже что и ключ -arp для ifconfig ?
    и еще если я допустим захочу обратиться к хосту не прописаному в файле меня пропустит или нет? (помоему нет)
     
     
  • 2.19, Haha (?), 17:56, 23/10/2013 [^] [ответить]    [к модератору]  
  • +/
    > staticarp ето не тоже что и ключ -arp для ifconfig ?
    > и еще если я допустим захочу обратиться к хосту не прописаному в
    > файле меня пропустит или нет? (помоему нет)

    Нет не то. -arp отключает арп вообще, то есть клиенты не смогут найти гетевей по запросам арп.
    arp оставляйте, делайте staticarp

     
  • 1.5, RexaleX (?), 22:38, 11/09/2007 [ответить] [показать ветку] [···]    [к модератору]  
  • +/
    Ест-но не пустит ;)
     
  • 1.6, Saykhan (?), 07:41, 05/06/2009 [ответить] [показать ветку] [···]    [к модератору]  
  • +/
    а как сделать обратное, у меня сеть после этих действии падает каждые пять минут
    хочу избавится от этих действии? как мне это сделать?Какой командой сделать не запрещение по маку?
     
  • 1.7, samba (?), 02:16, 22/12/2009 [ответить] [показать ветку] [···]    [к модератору]  
  • +/
    #!/bin/sh
    # Static ARP loader

    case $1 in
            start)
                    arp -f /usr/local/etc/ethers > /dev/null
                    echo 'Static ARP-table is loaded'
                    ;;
            stop)
                    arp -an | grep permanent | grep -v ff:ff:ff:ff:ff:ff | cut -d'(' -f2 | cut -d')' -f1 | xargs -n1 arp -d > /dev/null
                    echo 'Static ARP-table is unloaded'
                    ;;
            restart)
                    $0 stop
                    $0 start
                    ;;
            status)
                    echo 'Current static ARP-table:'
                    arp -an | grep permanent | grep -v ff:ff:ff:ff:ff:ff
                    ;;
            *)
                    echo "Usage: 'basename $0' {start|stop|restart|status}" >&2
                    ;;
    esac

    exit 0

     
  • 1.8, net_toxic (ok), 13:19, 05/05/2010 [ответить] [показать ветку] [···]    [к модератору]  
  • +/
    Что это такое:
    ? (192.168.0.133) at (incomplete) on rl0 [ethernet]
     
  • 1.9, Сергей (??), 23:01, 01/07/2010 [ответить] [показать ветку] [···]    [к модератору]  
  • +/
    В моей сети встречались таки записи- означает что сервер не определил мак адрес устройства (возможно кто то пытается его скрыть....  
     
  • 1.10, alexy (ok), 08:52, 20/07/2010 [ответить] [показать ветку] [···]    [к модератору]  
  • +/
    А как запускать указанный скрипт при старте через rc.d?
     
     
  • 2.11, zizmo (??), 12:12, 06/10/2010 [^] [ответить]    [к модератору]  
  • +/
    Вот эта статья мне помогла
    http://www.freebsd.org.ua/doc/ru_RU.KOI8-R/articles/rc-scripting/rcng-hookup.
     
  • 1.12, AdVv (ok), 01:11, 09/12/2011 [ответить] [показать ветку] [···]    [к модератору]  
  • +/
    С некоторых пор для этих целей в rc.conf появилась пара директив:
    static_arp_pairs="blah bleh bloh"
    static_arp_blah="1.2.3.4 11:22:33:44:55:66"
    static_arp_bleh="1.2.3.5 22:33:44:55:66:77"
    static_arp_bloh="1.2.3.6 33:44:55:66:77:88"
    так что самопальные скрипты городить больше не нужно.
     
     
  • 2.14, universite (ok), 01:13, 12/12/2011 [^] [ответить]    [к модератору]  
  • +/
    А что делать, если таких MAC'ов больше тысячи?
     
     
  • 3.15, AdVv (ok), 13:50, 12/12/2011 [^] [ответить]    [к модератору]  
  • +/
    > А что делать, если таких MAC'ов больше тысячи?

    Ответ 1, очевидный - пишите 1000, если нет других вариантов.
    Ответ 2, напрашивающийся - вам, видимо, необходимо поделить сеть на сегменты и переходить на специализированные аппаратные решения.

     
  • 3.17, Haha (?), 17:26, 23/10/2013 [^] [ответить]    [к модератору]  
  • +/
    rc.conf это всего лишь SH скрипт.
    Создайте диру /etc/static.arp/
    в ней файлы с названиями Ваших staticarp ключей, далее делаете
    static_arp_pairs='echo /etc/static.arp/*'
    for i in $static_arp_pairs
    do
    name="static_arp_"${i}
    data='cat /etc/static.arp/${i}'
    eval ${name}=${data}
    done
     
     
  • 4.18, Haha (?), 17:31, 23/10/2013 [^] [ответить]    [к модератору]  
  • +/
    > rc.conf это всего лишь SH скрипт.
    > Создайте диру /etc/static.arp/
    > в ней файлы с названиями Ваших staticarp ключей, далее делаете
    > static_arp_pairs='echo /etc/static.arp/*'
    > for i in $static_arp_pairs
    > do
    >  name="static_arp_"${i}
    >  data='cat /etc/static.arp/${i}'
    >  eval ${name}=${data}
    > done

    Хотя чего парится, просто добавьте в rc.local
    /usr/sbin/arp -f /etc/ethers или как у Вас там

     
  • 1.16, Артур (??), 14:42, 28/08/2012 [ответить] [показать ветку] [···]    [к модератору]  
  • +/
    Сделал всё как в статье, но при добавлении записи (arp -s xxx.xxx.xxx.xxx  xx.xx.xx.xx.xx.xx) не записывает эти данные в файл /usr/local/etc/ethers. Как это исправить?
    И как сделать чтобы IP адрес которого нет в arp табилице, тоже не возможно было использовать?
     
     
  • 2.20, Haha (?), 17:57, 23/10/2013 [^] [ответить]    [к модератору]  
  • +/
    > Сделал всё как в статье, но при добавлении записи (arp -s xxx.xxx.xxx.xxx
    >  xx.xx.xx.xx.xx.xx) не записывает эти данные в файл /usr/local/etc/ethers. Как это
    > исправить?
    > И как сделать чтобы IP адрес которого нет в arp табилице, тоже
    > не возможно было использовать?

    arp не писатель, arp читатель.

     

    Ваш комментарий
    Имя:         
    E-Mail:      
    Заголовок:
    Текст:





      Закладки на сайте
      Проследить за страницей
    Created 1996-2017 by Maxim Chirkov  
    ДобавитьРекламаВебмастеруГИД  
    Hosting by Ihor