Я веб-разработчик, который пытается лучше справиться с безопасностью. Я пытаюсь найти способ (в дистрибутивах на основе Linux/Debian) перечислить все компьютеры в той же локальной сети, где находится мой нетбук. Я попробовал "arp -n", но я не чувствую, что это полный список, так как мой iPhone находится на том же Wi-Fi-маршрутизаторе, что и мой нетбук, и это не помогло. Есть ли какой-нибудь лучший способ получить полный список машин, которые используют один и тот же шлюз?
10 ответов
Это то, что я использую, nmap и адрес, используя блочную нотацию CIDR для сети, которую вы хотите сканировать. Для начала вам нужно установить nmap, так как он может не поставляться с предустановленным дистрибутивом. На Ubuntu:
sudo apt-get install nmap
Затем выясните ваш сетевой адрес, используя ifconfig:
ifconfig
вывод ifconfig для интерфейса, который я хочу сканировать:
wlan1 Link encap:Ethernet HWaddr 00:1f:3b:03:d2:bf
inet addr:192.168.1.104 Bcast:192.168.0.255 Mask:255.255.255.0
inet6 addr: fe80::21f:3bff:fe03:d2bf/64 Scope:Link
...
Используйте inet addr и Mask для определения сетевого адреса в нотации CIDR, подробнее о CIDR здесь. Адрес:
192.168.1.0/24
Запустите nmap, используя параметр -sP, который будет сканировать только после проверки, подключен ли хост:
sudo nmap -sP 192.168.1.0/24
Вывод nmap будет выглядеть примерно так:
Starting Nmap 5.21 ( http://nmap.org ) at 2014-12-09 10:52 EST
Nmap scan report for 192.168.1.1
Host is up (0.013s latency).
MAC Address: -MAC ADDRESS- (Cameo Communications)
...
Nmap done: 256 IP addresses (5 hosts up) scanned in 3.26 seconds
Вот и все, если вам нужна дополнительная помощь по nmap, посмотрите официальную документацию по nmap или запустите:
nmap --help
arp -n
показывает только те машины в вашей локальной сети, с которыми ваша машина уже общалась. Вы можете получить этот список для лучшего заполнения, отправив эхо-запросы на широковещательные и многоадресные адреса всех хостов:
"Все единицы" (в двоичном формате) широковещательный адрес. Обратите внимание, что большинство IP-стеков преобразует это в широковещательные адреса подсетей для всех подсетей, к которым вы подключены:
ping 255.255.255.255
Широковещательный адрес подсети для вашей текущей подсети. Итак, если вы на 192.168.1.0/24:
ping 192.168.1.255
Адрес многоадресной рассылки "все хосты". Мне это очень нравится, потому что больше шансов найти хосты, настроенные для других IP-подсетей, которые подключены к той же локальной сети Ethernet, что и вы:
ping 224.0.0.1
Обратите внимание, что этот метод, а также другие методы, о которых я уже упоминал в других ответах, ищут только хосты с IP-достижимостью в текущей сети. Это, вероятно, все, что вам нужно заботиться, но злоумышленник может отслеживать или совершать плохие действия в сети, не будучи видимым через IP.
ip neigh
и hosts
Не требуется nmap / не требуется sudo.
Основываясь на этом, вы можете создать скрипт на Python:
#!/usr/bin/env python
"""List all hosts with their IP adress of the current network."""
import os
out = os.popen('ip neigh').read().splitlines()
for i, line in enumerate(out, start=1):
ip = line.split(' ')[0]
h = os.popen('host {}'.format(ip)).read()
hostname = h.split(' ')[-1]
print("{:>3}: {} ({})".format(i, hostname.strip(), ip))
Скачать через
wget https://gist.githubusercontent.com/MartinThoma/699ae445b8a08b5afd16f7d6f5e5d0f8/raw/577fc32b57a7f9e66fdc9be60e7e498bbec7951a/neighbors.py
(или просто arp
... Я не видел этого раньше)
Например, вы можете попробовать пропинговать всю подсеть с помощью небольшого сценария оболочки Linux.
$ for ip in $(seq 1 254); do ping -c 1 192.168.1.$ip>/dev/null; [ $? -eq 0 ] && echo "192.168.1.$ip UP" || : ; done
Я не нашел существующие ответы достаточно удовлетворительными, поэтому я решил попробовать. В конце концов, FAQ предлагает предоставить контекст для ссылок.
nmap
отлично, если немного запутать в использовании. Вот кое-что, что я запускаю, чтобы обнаружить локальные сетевые устройства, которые в основном можно копировать и вставлять. nmap -sP
(или nmap -sn
) сканирует с помощью команды ping Существуют и другие варианты «обнаружения хоста», например, с помощью nmap -sL
или nmap -Pn
.
Способ № 1.
ehtesh@x200arch:~$ # my wireless interface is listed as wlp3s0. Yours could be wlan0 or eth1.
ehtesh@x200arch:~$ ip addr show wlp3s0 | grep "inet "
inet 172.18.72.53/22 brd 172.18.75.255 scope global wlp3s0
ehtesh@x200arch:~$ arp -a
? (172.18.72.1) at c8:4c:75:76:bd:74 [ether] on wlp3s0
ehtesh@x200arch:~$ nmap -sP 172.18.72.0/24
Starting Nmap 6.41SVN ( http://nmap.org ) at 2013-12-17 20:08 EST
Nmap scan report for 172.18.72.2
Host is up (0.017s latency).
<... 15 IP addresses snipped ...>
Nmap scan report for 172.18.72.253
Host is up (0.13s latency).
Nmap done: 256 IP addresses (17 hosts up) scanned in 5.74 seconds
ehtesh@x200arch:~$ arp -a | sort -n -k 1,1
? (172.18.72.126) at ec:35:86:4a:37:d2 [ether] on wlp3s0
? (172.18.72.148) at 10:9a:dd:b8:79:71 [ether] on wlp3s0
? (172.18.72.178) at 9c:20:7b:7b:08:ba [ether] on wlp3s0
? (172.18.72.1) at c8:4c:75:76:bd:74 [ether] on wlp3s0
? (172.18.72.253) at b8:78:2e:19:05:0b [ether] on wlp3s0
? (172.18.72.2) at 00:14:1c:da:e1:c2 [ether] on wlp3s0
? (172.18.72.40) at d8:c7:c8:ca:f9:88 [ether] on wlp3s0
? (172.18.72.43) at d8:c7:c8:ce:0f:60 [ether] on wlp3s0
? (172.18.72.44) at d8:c7:c8:ce:0f:68 [ether] on wlp3s0
? (172.18.72.45) at 6c:f3:7f:c6:71:16 [ether] on wlp3s0
? (172.18.72.46) at 6c:f3:7f:c4:4c:b3 [ether] on wlp3s0
? (172.18.72.47) at d8:c7:c8:ca:f9:88 [ether] on wlp3s0
? (172.18.72.48) at 24:de:c6:c6:b6:78 [ether] on wlp3s0
? (172.18.72.49) at 24:de:c6:c6:b6:e6 [ether] on wlp3s0
? (172.18.72.51) at 00:9c:02:d0:4c:4e [ether] on wlp3s0
? (172.18.72.54) at 00:23:76:99:99:bf [ether] on wlp3s0
? (172.18.72.62) at 8c:70:5a:0d:06:18 [ether] on wlp3s0
? (172.18.72.63) at 7c:e9:d3:51:86:55 [ether] on wlp3s0
? (172.18.72.64) at a0:88:b4:47:eb:c8 [ether] on wlp3s0
Способ № 2. Я знаю, что это работает, но я не могу сказать, если это правильный путь.
ehtesh@x200arch:~$ #ifconfig | grep broadcast
ehtesh@x200arch:~$ ip address show wlp3s0 | grep brd
link/ether 00:1e:65:bf:1b:42 brd ff:ff:ff:ff:ff:ff
inet 172.18.72.53/22 brd 172.18.75.255 scope global wlp3s0
ehtesh@x200arch:~$ ping -b -c 3 -i 20 172.18.75.255
<... similar output to above ...>
Буду рад узнать, есть ли более эффективные способы. До тех пор я придерживаюсь этого.
Для сканирования состояния диапазона IP-адресов это удобно и просто:
sudo nmap -sn 192.168.1.2-20
Куда:
-sn: Ping Scan - disable port scan
Замечания:
- В предыдущих выпусках Nmap
-sn
был известен как-sP
Я сделал это на Mac OS X (которая основана на BSD). Я не уверен, если версия для Linux имеет какие-либо различия.
Hunt - это инструмент командной строки, способный создавать список машин, передаваемых по сети для получения информации. Он использует данные TCP, UDP, ICMP и ARP для создания списка активных MAC-адресов в сети. Это пассивный инструмент, который работает, слушая по проводам.
Для более компактного списка подключенных устройств:
nmap -sL 192.168.0.* | grep \(1
Объяснение.
nmap -sL 192.168.0.*
перечислит все IP-адреса в подсети и отметит те, которые имеют имя:
Nmap scan report for 192.168.0.0
Nmap scan report for Dlink-Router.Dlink (192.168.0.1)
Nmap scan report for 192.168.0.2
...
Nmap scan report for android-473e80f183648322.Dlink (192.168.0.53)
...
Nmap scan report for 192.168.0.255
Поскольку все интересные записи начинаются с круглых скобок (
и цифры 1
, мы фильтруем их с помощью | grep \(1
(для удаления скобок требуется обратный слеш))
Галтель
Помните, что если два устройства имеют одинаковое имя, nmap
покажет только то, что было подключено к маршрутизатору последним
1. Альтернативное решение, если трансляции и nmap
недоступны:
seq 254 | xargs -iIP -P255 ping -c1 192.168.2.IP |grep time=
arp -a
2а. или просто спросите свой сервер доменных имен:
seq 254| awk '{print "192.168.2."$1}' |nslookup | grep name
2b. без awk
echo -e 192.168.2.{1..10}"\n" |nslookup |grep name
пингует все проверяемые сетевые устройства в подсети 192.168.2.0/24 параллельно (для сокращения времени выполнения). После этого
arp
должен отобразить каждое устройство, которое ответило.не проверяет наличие активных или текущих соединений, но перечисляет все соединения, которые хранит служба локального домена, даже действительно старые.
Более подробное объяснение:
seq 254
для создания всех чисел от 1 до 254 (для всех чисел от 100 до 150:seq 100 150
)xargs
называетping
и заменяет "IP"-iIP
с числомseq
uence из стандартного ввода, так 192.168.2.Изменения IP к 192.168.2.1 для первого числаseq
-P
указывает количество одновременныхping
процессовxargs
должны начать, я выбрать такое же количество , как адреса +1 (= 254) - им интересно.ping
с ip-адресом, измененным xargs (192.168.2.IP
) и пинговать только один раз (-c1
); Вы должны использовать тот же идентификатор, который указан для xargs, в аргументе-i
в этом случаеIP
grep time=
удалить каждую строку, содержащую лишнюю информацию, нас интересуют только ответы, которые предоставляют время туда-обратно (= получил ответ)arp -a
для отображения правильных пар имен (ip)
Я назвал это моей командой pingall и сделал ее доступной через псевдоним в ~/.bashrc
:
alias pingall='seq 254 | xargs -iIP -P255 ping -c1 192.168.2.IP |grep time='