
Недавно я с помощью Tcpdump прослушал пакет «ARP, Request who-has 192.168.2.3 tell 192.168.2.2, length 28».
Я хотел бы воспроизвести это сообщение и отправить ARP-запрос с моего ноутбука на любой IP, который я выберу. Как я могу это сделать?
Мне было бы интересно также принудительно обновить всю таблицу ARP. Я знаю, что удаление таблицы обновит ее, но только на ноутбуке эта операция очень медленная и может занять до 1/2/5 минут, чтобы перестроить всю таблицу ARP. Есть ли способ принудительно перестроить таблицу, отправив широковещательный запрос ARP?
Я использую Mac с последней версией ОС Yosemite 10.10.4.
Спасибо.
решение1
nmap
— это универсальный инструмент для сканирования сетей, который может использоваться только для сканирования ARP:
nmap -PR 10.0.1.0/24 -sn
Отключает -sn
сканирование портов, поэтому выполняются только запросы ARP, и -PR
выполняется сканирование ARP.
решение2
Есть инструмент с открытым исходным кодом, arping
который позволяет отправлять пользовательские запросы ARP. Вы можете получить его из вашего любимого менеджера пакетов OS X с открытым исходным кодом, например Homebrew или MacPorts.
ARP-запросы обычно передаются широковещательно (потому что вы не знаете, на какой MAC-адрес их отправлять, иначе вам бы не пришлось их отправлять). Однако они неподстановочный; то есть вы не можете отправить один запрос, который просит все хосты в сети отправить вам ответы ARP. Протокол не предоставляет способа указать подстановочный знак вместо целевого IP-адреса.
решение3
ARP-пакеты отправляются ОС по требованию — по сути, когда ей нужно связаться с другим IP-адресом в той же подсети, и она еще не знает MAC-адрес этого хоста, она отправляет ARP-запрос. Это означает, что перестроение таблицы на самом деле не является четко определенным процессом, поскольку вы на самом деле не знаете, какие еще хосты существуют, пока ваш компьютер впервые не попытается с ними связаться.
Обновление записей для IP-адресов, которые в данный момент находятся в таблице, не так уж и сложно. Просто создайте список текущих записей, используйте sudo arp -da
для удаления всех текущих записей, затем используйте что-то вроде того, ping
чтобы заставить ОС повторно выполнить ARP для каждой из удаленных записей:
ip_addresses=$(arp -an | grep -Ev '\(incomplete\)|ff:ff:ff:ff:ff:ff'| sed -n 's/? (\([0-9.]*\)) at .*$/\1/p')
sudo arp -da
for ip in $ip_addresses; do ping -c1 -t1 $ip & disown; done &>/dev/null
Обратите внимание, что последняя команда запускает все ping
s в фоновом режиме, поэтому они практически все запускаются одновременно, и таблица должна перестроиться довольно быстро.
Если вы хотите удалить и повторно выполнить ARP только одну запись, сделайте следующее:
sudo arp -d 10.0.0.1
ping -c1 -t1 10.0.0.1