57

Я веб-разработчик, который пытается лучше справиться с безопасностью. Я пытаюсь найти способ (в дистрибутивах на основе Linux/Debian) перечислить все компьютеры в той же локальной сети, где находится мой нетбук. Я попробовал "arp -n", но я не чувствую, что это полный список, так как мой iPhone находится на том же Wi-Fi-маршрутизаторе, что и мой нетбук, и это не помогло. Есть ли какой-нибудь лучший способ получить полный список машин, которые используют один и тот же шлюз?

10 ответов10

58

Получите Nmap. Это программа Trinity, используемая в The Matrix, и вы можете выполнить сканирование, чтобы найти все устройства, которые подключены к вашей локальной сети, и многое другое.

Вот справочник.

35

Это то, что я использую, 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 
18

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.

8

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 ... Я не видел этого раньше)

4

Например, вы можете попробовать пропинговать всю подсеть с помощью небольшого сценария оболочки 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
4

Я не нашел существующие ответы достаточно удовлетворительными, поэтому я решил попробовать. В конце концов, 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 ...>

Буду рад узнать, есть ли более эффективные способы. До тех пор я придерживаюсь этого.

2

Для сканирования состояния диапазона IP-адресов это удобно и просто:

sudo nmap -sn 192.168.1.2-20

Куда:

         -sn: Ping Scan - disable port scan

Замечания:

  • В предыдущих выпусках Nmap -sn был известен как -sP

Я сделал это на Mac OS X (которая основана на BSD). Я не уверен, если версия для Linux имеет какие-либо различия.

2

Hunt - это инструмент командной строки, способный создавать список машин, передаваемых по сети для получения информации. Он использует данные TCP, UDP, ICMP и ARP для создания списка активных MAC-адресов в сети. Это пассивный инструмент, который работает, слушая по проводам.

1

Для более компактного списка подключенных устройств:

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

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
  1. пингует все проверяемые сетевые устройства в подсети 192.168.2.0/24 параллельно (для сокращения времени выполнения). После этого arp должен отобразить каждое устройство, которое ответило.

  2. не проверяет наличие активных или текущих соединений, но перечисляет все соединения, которые хранит служба локального домена, даже действительно старые.

Более подробное объяснение:

  • 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='

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .