web-dev-qa-db-ja.com

LinuxでLAN上のコンピュータのリストを表示する

私はWeb開発者であり、セキュリティについてよりよく対処しようとしています。私のネットブックがあるのと同じLAN上にあるすべてのコンピュータを一覧表示する方法を見つけようとしています(Linux/Debianベースのディストリビューション)。私は "arp -n"を試しましたが、私のiPhoneは私のネットブックと同じWi-Fiルーターに接続されているので、それが完全なリストであるとは思いません。すべて同じゲートウェイを共有しているマシンの完全なリストを取得するためのより良い方法はありますか?

60
CaptSaltyJack

nmap を入手してください。これは、The Matrixで使用されているTrinityプログラムです。スキャンを実行すると、接続しているLANに接続されているすべてのデバイスを見つけることができます。

これが のリファレンスガイドです。

58
Tyler Faile

これは私が使っているもの、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 here を参照してください。アドレスは:

192.168.1.0/24

-sPパラメーターを使用してnmapを実行します。このパラメーターは、ホストがオンラインであるかどうかを確認するだけです。

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 
37
radtek

arp -nはあなたのLAN上であなたのマシンがすでに話しているマシンを表示するだけです。ブロードキャストアドレスと全ホストマルチキャストアドレスをpingすることで、このリストを追加することができます。

「すべて1」(2進数)ブロードキャストアドレス。ほとんどのIPスタックはこれをあなたが接続しているすべてのサブネットのサブネットブロードキャストアドレスに変換することに注意してください:

ping 255.255.255.255

現在のサブネットのサブネットブロードキャストアドレス。だからあなたは192.168.1.0/24にいると仮定します。

ping 192.168.1.255

「全ホスト」マルチキャストアドレス。私はこれが大好きです。なぜなら、あなたと同じイーサネットLANに接続されている他のIPサブネット用に設定されたホストを見つける可能性が高いからです。

ping 224.0.0.1

この方法、そして私がこれまでに他のAnswersで述べた他の方法は現在のネットワーク上のIP到達可能なホストだけを探すことに注意してください。それだけで大丈夫ですが、攻撃者がIPを介して表示されることなくネットワークをスヌープしたり、悪いことをしたりする可能性があります。

17
Spiff

ip neighhostsNO 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 ...以前には見たことがありませんでした)

8
Martin Thoma

たとえば、小さなLinuxシェルスクリプトを使って、特定のサブネットすべてにpingを試すことができます。

$ 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
dmn8

既存の答えが十分に満足できるものではなかったので、試してみることにしました。結局、FAQはリンクに コンテキストを提供することを提案します

少し混乱して使用するならばnmapは素晴らしいです。これは私がローカルネットワークデバイスを発見するために実行しているもので、ほとんどコピー&ペースト可能です。 nmap -sP(またはnmap -sn)は ping でスキャンします。 nmap -sLnmap -Pnのように、 'Host discovery'には他のオプションがあります。

方法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 ...>

もっと効果的な方法があるかどうか私は知りたいです。それまでは、これにこだわっています。

4

IPアドレスの範囲のステータスをスキャンするには、これはいいと簡単です:

Sudo nmap -sn 192.168.1.2-20

どこで:

         -sn: Ping Scan - disable port scan

注意:

  • Nmapの以前のリリースでは、-sn-sPとして知られていました

私はこれをMac OS X(BSDをベースにしている)でやった。 Linuxのバージョンに違いがあるかどうかわかりません。

2

接続されているデバイスのよりコンパクトなリストについては、

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でそれをフィルタリングします(括弧をエスケープするにはバックスラッシュが必要です)。

気まぐれ
2つのデバイスが同じ名前を持っている場合、nmapはルータに最後に接続されたものだけを表示します

2

Hunt は、情報をネットワーク経由でブロードキャストするときにマシンのリストを作成できるコマンドラインツールです。 TCP、UDP、ICMP、およびARPデータを使用して、ネットワーク上のアクティブなMACアドレスのリストを作成します。それはワイヤーで聞くことによって働く受動的な道具です。

2
Sean C.

fping Sudo apt-get install fpingを使うことができます(debian風OSの場合)。

fping はpingに似ていますが、複数のホストにpingを実行するときのパフォーマンスがはるかに優れています。 -r 1 フラグは、fpingに1ラウンドだけ実行するように指示します。 2> 1 の部分は、grepが出力をフィルタリングすることを可能にします。

$ fping -g -r 1 192.168.1.0/24 2>1 | grep "alive"

次のように表示されます。

192.168.1.1 is alive
192.168.1.10 is alive
192.168.1.15 is alive
192.168.1.27 is alive

nmapのための/ /おもしろいフラグもあります それはあなたがMACベンダーを見ることを可能にするでしょう - 知られているなら - MACアドレスを見るために Sudo と共に使用して下さい。

$ Sudo nmap -sP 192.168.1.0/24

あなたは例えば得るでしょう:

Starting Nmap 7.40 ( https://nmap.org ) at 2019-05-23 18:49 CEST
Nmap scan report for 192.168.1.14
Host is up (-0.036s latency).
MAC Address: 20:F4:1B:E5:8F:7B (Shenzhen Bilian electronic)
Nmap scan report for 192.168.1.15
Host is up (-0.084s latency).
MAC Address: A4:31:35:E8:58:9E (Apple)
Nmap scan report for 192.168.1.27
Host is up (-0.15s latency).
MAC Address: 34:8A:7B:38:E3:14 (Samsung Electronics)
Nmap scan report for 192.168.1.29
Host is up (0.010s latency).
MAC Address: 80:2B:F9:75:F8:FF (Unknown)
Nmap scan report for 192.168.1.10
Host is up.
Nmap done: 256 IP addresses (5 hosts up) scanned in 25.52 seconds
1
user1183098

1。ブロードキャストおよびnmapが利用できない場合の代替ソリューション:

seq 254 | xargs -iIP -P255 ping -c1 192.168.2.IP |grep time=
arp -a

2a。orただ尋ねるドメインネームサーバー

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. pings allpingable192.168.2.0/24サブネット内のネットワークデバイスを並行して実行します(実行時間を短縮するため)。その後、arpは、応答したすべてのデバイスを表示する必要があります。

  2. アクティブな接続または現在の接続はチェックしませんが、ローカルドメインサービスがエントリを保持しているすべての接続をリストします(実際に古い接続であっても)。

より詳細な説明:

  • seq 254は、1〜254のすべての数値を作成します(100〜150のすべての数値の場合:seq 100 150
  • xargspingを呼び出し、 "IP"(-iIP)をstdinのsequence番号に置き換えます。したがって、192.168.2.IPは最初のseq number、-Pは、同時実行の数を指定しますpingプロセスxargsは、開始する必要があります。興味のあるアドレス(= 254)と同じ量+1を選択します。
  • ping xargsによって変更されたIPアドレス(192.168.2.IP)で、pingを1回だけ実行する(-c1); -i引数でxargsに指定したものと同じ識別子を使用する必要があります。この場合はIP
  • grep time=は余分な情報を含むすべての行を削除するため、往復時間を提供する回答のみに関心があります(=応答を取得します)
  • arp -aは、有効な名前(IP)ペアを表示します

これをpingallコマンドと呼び、~/.bashrcのエイリアスを介して使用できるようにしました。

alias pingall='seq 254 | xargs -iIP -P255 ping -c1 192.168.2.IP |grep time='
1
Don Question