ネットワーク上の未使用のIPアドレスを見つける方法


25

ネットワーク上の未使用のIPアドレスを見つけたいだけです。nmapで可能だと思います。誰かが私に方法を言うことができますか?

注意:

無料のIPリストだけが必要です。


追加の要件はありますか?
セルゲイ

これ以上の追加要件はありません。今のところ、私は多くのIPアドレスの競合を発見しました、私はネットワーク上の空きIPアドレスを見つけてそれを割り当てたいだけです。
karthick87

回答:


26

速いスキャナがあるARPスキャン使用するARPをネットワーク上の他のマシンを「見る」こと。また、MACアドレスを返し、ネットワークアダプターの製造元を特定しようとします。

使用例(必要に応じて置き換えwlan0てくださいeth0):

$ sudo arp-scan -I wlan0 192.168.1.0/24
Interface: wlan0, datalink type: EN10MB (Ethernet)
Starting arp-scan 1.6 with 256 hosts (http://www.nta-monitor.com/tools/arp-scan/)
192.168.1.10    00:90:f5:33:e2:f2       CLEVO CO.
192.168.1.254   00:14:7f:72:cd:05       Thomson Telecom Belgium

2 packets received by filter, 0 packets dropped by kernel
Ending arp-scan 1.6: 256 hosts scanned in 1.406 seconds (182.08 hosts/sec).  2 responded

このユーティリティは、電源がオンになっているマシンのみを報告することに注意してください。pingブロックすることはできますがarp-scan、マシンがネットワーク上の他のマシンと対話する必要があるため、ブロックすることはできません。IPが使用されていないことを確認するには、ルーター(静的/動的アドレス用)およびDHCPサーバー(動的アドレス用)を確認することをお勧めします。


私はこれを好きになりたかったのですが、テストしたときにいくつかのホストを見逃しましたか?!?:(
ばかげた愚か者

@bumblingfool:他のホストが同じサブネット上にあると確信していますか?たとえば、192.168.2.xではなく192.168.1.x?
レーケンシュタイン

はい、すべてのホストは同じサブネット上にあります。さらに数十回実行し、すべてのホストが表示された時間の3分の2でした。興味深いことに(?)、表示されないのは常に同じホストです(存在する場合)...これはwifiネットワーク上にありますが、信号はしっかりしています。また、上記のnmapメソッドは常にホストを見逃しません。
愚か者

何人のホストについて話していますか?-iパラメータを使用して、たとえば-i 55ミリ秒の間、パケットを送信する間の遅延を増やしてみてください。
レーケンシュタイン

2/5。遅延を大きくすることでうまくいきました。ありがとう!
愚か者

15

sudo nmap -sP -PR 192.168.0.* (またはネットワークが何であれ)トリックを行います。

それをインストールするには、を使用しますsudo apt-get install nmap

出典:serverfault.com

これをテストしただけで、隠されたホストを含​​む魅力のように機能し-PRます。オプションを使用するには、sudoを追加する必要があります。


1
実行する必要があるのはrootとして(つまりを使用してsudo)テストしただけです。さらに、ホストのポートもスキャンするため、ファイアウォールによってブロックされている可能性があり、これも検索速度を低下させます。
レーケンシュタイン

元の投稿plzを読んで、3番目のコメントは(不要な)ポートスキャンを使用しない方法を説明しています;)
ブルーノペレイラ

回答にそれを含める必要があります。誰もがソースをフォローしたいとは限りません。また、コマンドが実際に行うことを説明しておくと役立ちます。
レーケンシュタイン

完了;)本当に素晴らしい作品。
ブルーノペレイラ

Haventテスト(またはこれまで使用された)arp-scan、thgestionのthx!
ブルーノペレイラ

4

fpingは便利です。とりわけ、「生きている」アドレスと「到達できない」アドレスの範囲をpingします。fpingはデフォルトではインストールされません。

sudo apt-get install fping

簡単なアプローチは、アドレスの範囲で実行することです。

fping -g 192.168.0.2 192.168.0.254 2>/dev/null

少し精巧に、未使用のIPのリストを作成します。

fping -g 192.168.0.2 192.168.0.254 2>/dev/null | grep 'is unreachable' | cut -d ' ' -f 1 | sort -t '.' -k 4 -n

1
これは、ホストがICMPエコー要求(別名ping)に応答することを前提としていることを忘れないでください。すべてのホストがそれを行うわけではありません。特に一部のMS Windowsマシンはそうではありません。また、ファイアウォールはオンラインであり、ネットワーク内にMACアドレスを持っている場合でも、通常これを無効にします。これは高速なソリューションですが、すべての状況で信頼すべきではありません。
イーディン

あなたが正しい; nmapを含むソリューション、またはICMP以外のプロトコルを使用できるpingの代替手段の方が信頼性が高くなります。
bgvaughan

3

私はそれが最善の解決策ではないと信じていますが、あなたが望むことをします。このスクリプトはネットワーク上で実行さping192.168.0.0/24、ARPキャッシュにない場合は非アクティブなIPのリストを返します。

以前のソリューションに対する利点:

  • pingとARPチェックの両方の方法を使用します
  • rootユーザーとして実行する必要はありません
  • Core i3-2100で約1.5分実行します

ネットワークをスキャンするには、<first IP> <last IP>パラメーターを指定して実行します。

#!/usr/bin/env python
from threading import Thread
import subprocess
from Queue import Queue

verbose = False

num_threads = 8
queue = Queue()
inactive_ips = [0 for i in range(256)]

lines = open("/proc/net/arp", "r").readlines()
arp_cache = [l.split()[0] for l in lines[1:] if l.split()[2] == "0x2"]

def ip_str_to_int(ip):
    ip = ip.rstrip().split('.')
    ipn = 0
    while ip:
        ipn = (ipn << 8) + int(ip.pop(0))
    return ipn

def ip_int_to_str(ip):
    ips = ''
    for i in range(4):
        ip, n = divmod(ip, 256)
        ips = str(n) + '.' + ips
    return ips[:-1] ## take out extra point


#wraps system ping command
def pinger(i, q):
    while True:
        ip_num = q.get()
        ip = ip_int_to_str(ip_num)
        if ip not in arp_cache:
            ret = subprocess.call("ping -c 1 %s" % ip,
                  shell=True,
                  stdout=open('/dev/null', 'w'),
                  stderr=subprocess.STDOUT)
            if ret != 0:
                  inactive_ips[ip_num % 256] = ip
        q.task_done()


if __name__ == '__main__':
    from optparse import OptionParser
    usage = "usage: %prog [options] [first IP] [last IP]"
    parser = OptionParser(usage=usage)
    parser.add_option("-v", "--verbose", action="store_true", dest="verbose", help="make lots of noise")
    parser.add_option("-q", action="store_false", dest="verbose", help="print only IP adresses")
    (options, args) = parser.parse_args()
    verbose = options.verbose

    first = ip_str_to_int(args[0] if len(args) > 0 else "192.168.0.1")
    last = ip_str_to_int(args[1] if len(args) > 1 else "192.168.0.254")

    if verbose:
        print "Scanning inactive network addresses from %s to %s" % (
            ip_int_to_str(first),
            ip_int_to_str(last))

    for i in range(num_threads):
        worker = Thread(target=pinger, args=(i, queue))
        worker.setDaemon(True)
        worker.start()

    for ip in range(first, last + 1):
        queue.put(ip)

    queue.join()
    for ip in inactive_ips:
        if ip:
            print ip

ダウン投票後の更新

私のためにnmap -PR 192.168.0.*働いていなかったので、私はそれを書いた:

Starting Nmap 5.21 ( http://nmap.org ) at 2011-10-06 15:34 EEST
Nmap done: 256 IP addresses (0 hosts up) scanned in 0.03 seconds

更新2

ARPキャッシュに関するすべての問題を修正しました。


2
マシンがpingに応答しない場合はどうなりますか?IPが使用されていないということですか?
ブルーノペレイラ

@ brunopereira81私は、無料のIPと電源がオフのホストを区別する方法を知りません。
セルゲイ

電源を切らずに、コンピューターのファイアウォールを通常のpingに応答しないように構成できます。そうすれば返事はありませんが、それはコンピューターがオフになっていたり、サービスを実行していないという意味ではなく、通常のpingを無視しているだけです。(質問に関連するシナリオはわかりませんが)応答しないように構成されているため、pingを無視するファイアウォール/ゲートウェイをpingすると想像してください。 IPの競合が原因で停止したX台のコンピューター!
ブルーノペレイラ

@ brunopereira81私はそれが理想的ではないことを知っています。それが私がそれを「素早く汚い」と呼ぶ理由です:)
セルゲイ

良い答えです、そのような答えを下げることがどのように役立つか理解していません。
-nikhil

1

これはbashで正しく実行する必要があります。

#!/bin/bash

#setting language variables for subshell making sure we grep for the right word
LC_ALL=C
LANG=C

# retrieve IP from user input
read -p "Input your network (example: 192.168.0): " my_net

for i in $(seq 1 254);
do 
  ip="$my_net.$i"
  check="$(ping -c1 "$ip")"
  if [ "$(grep "Unreachable" <<<"$check")" != "" ]
  then
    echo "$ip is unreachable"
  fi
done

0

もっと簡単だと思う

# my_net define my Net_ID
my_net=192.168.1.
for i in `seq 1 254`;
do 
  ip="$my_net$i"
  ping -c2  $ip | grep "is unreachable" | cut -d" " -f1 &
done

あなたのコードを見たいかもしれません。サブネットでは、取得されたものも含めてすべてのIPが表示されます。
Videonauth

いいえ、私はそれをテストし、私のためにうまくいきます。実際には、grepを追加する"is unreachable" か、あなたのためにそれを変更することがgrep -v timeできます
-user3607303
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.