네트워크에서 사용하지 않는 IP 주소를 찾는 방법은 무엇입니까?


25

네트워크에서 사용하지 않는 IP 주소를 찾고 싶습니다. 나는 nmap으로 가능하다고 생각합니다. 아무도 나에게 pls를 말할 수 있습니까?

노트 :

무료 IP 목록 만 있으면됩니다.


추가 요구 사항이 있습니까?
Sergey

더 이상 추가 요구 사항이 없습니다. 현재 많은 IP 주소 충돌을 발견했으며 네트워크에서 무료 IP 주소를 찾아 할당하고 싶습니다.
karthick87

답변:


26

빠른 스캐너는 ARP 스캔 사용하는 ARP를 네트워크의 "참조"다른 기계. 또한 MAC 주소를 반환하고 네트워크 어댑터 제조업체를 확인하려고합니다.

사용 예제 (교체 wlan0eth0필요한 경우) :

$ 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 서버 (동적 주소의 경우)를 보는 것이 좋습니다.


나는 이것을 좋아하고 싶었지만 그것을 테스트 할 때 몇 호스트를 놓쳤다?!? :(
bumbling fool

@bumblingfool : 다른 호스트가 동일한 서브넷에 있는지 확인 하시겠습니까? 예 : 192.168.2.x가 아닌 192.168.1.x?
Lekensteyn

예, 모든 호스트가 동일한 서브넷에 있습니다. 나는 모든 호스트가 나타 났던 시간의 12 배와 2/3를 더 실행했습니다. 흥미롭게도 (?), 항상 표시되지 않는 동일한 호스트입니다 (있는 경우). 이것은 Wi-Fi 네트워크에 있지만 신호는 확실합니다. 또한 위에서 언급 한 nmap 방법은 일관되게 호스트를 놓치지 않습니다.
bumbling 바보 바보

우리는 몇 명의 호스트에 대해 이야기하고 있습니까? -i매개 변수를 사용하여 패킷을 보내는 간격 ( 예 : -i 55ms)을 지연 시키십시오 .
Lekensteyn

2/5. 지연을 증가시키는 것은 속임수였습니다. 감사!
bumbling 바보 바보

15

sudo nmap -sP -PR 192.168.0.* (또는 네트워크가 무엇이든) 트릭을 수행합니다.

설치하려면을 사용하십시오 sudo apt-get install nmap.

출처 : serverfault.com .

방금 이것을 테스트하고 가려진 호스트를 포함한 매력처럼 작동합니다 -PR. 옵션 을 사용하려면 sudo를 추가해야합니다 .


1
방금 테스트 한 결과 루트로 (예 : 사용 sudo) 루트 입니다. 또한 호스트의 포트도 검색하므로 검색 속도가 느려 방화벽에 의해 차단되었을 수 있습니다.
Lekensteyn

PLZ 원래의 게시물 읽기, 3 주석은 (불필요한) 포트 스캔을 사용하지 않는 방법을 설명합니다)
브루노 페레이라

모든 사람이 출처를 따르기를 원하는 것은 아닙니다. 또한 명령이 실제로 수행하는 작업을 설명하는 것이 도움이됩니다.
Lekensteyn

done;) 정말 잘 작동합니다.
Bruno Pereira

Havent 테스트 (혹은 사용 된) arp-scan, thx the sugestion!
Bruno Pereira

4

나는 fping이 유용하다고 생각한다. 무엇보다도, 그것은 '살아있는'주소와 '연결할 수없는'주소와 목록의 범위를 핑합니다. 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 에코 요청 (일명 핑)에 응답한다고 가정합니다. 모든 호스트가 그렇게하는 것은 아니며, 특히 일부 MS Windows 시스템에서는 그렇지 않습니다. 또한 방화벽은 온라인 상태이고 네트워크에 MAC 주소가 있더라도 일반적으로이 기능을 비활성화합니다. 이것은 빠른 솔루션이지만 모든 상황에 의존해서는 안됩니다.
eaydin

네가 옳아; ICMP 이외의 프로토콜을 사용할 수있는 nmap 또는 ping 대신 사용할 수있는 솔루션이 더 안정적입니다.
bgvaughan

3

나는 그것이 최선의 해결책은 아니지만 당신이 원하는 것을한다고 생각합니다. 이 스크립트는 네트워크를 ping통해 실행 192.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

downvote 후 업데이트

나는 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
컴퓨터가 핑에 응답하지 않으면 어떻게됩니까? IP가 사용 중이 아닙니까?
Bruno Pereira

무료 IP와 전원이 꺼진 호스트를 구별하는 방법을 모르겠습니다.
Sergey

전원이 꺼지지 않으면 컴퓨터 방화벽이 정상적인 핑에 응답하지 않도록 구성 할 수 있습니다. 그렇게하면 응답이 없지만 컴퓨터가 꺼져 있거나 서비스가 실행되고 있지 않다는 의미는 아닙니다. 정상적인 핑은 무시합니다. (질문과 관련된 시나리오는 알지 못하지만) 응답하지 않도록 구성되어 있기 때문에 자신의 핑을 무시하는 방화벽 / 게이트웨이를 핑 (ping)한다고 상상해보십시오. IP 충돌로 인해 다운 된 컴퓨터 수 X!
Bruno Pereira

나는 그것이 이상적이지 않다는 것을 안다. 그것이 바로 "빠르고 더러운"이라고 부르는 이유입니다. :
Sergey

좋은 대답입니다. 그런 대답을 내리는 것이 어떻게 도움이되는지 이해가되지 않습니다.
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

아니, 나는 그것을 테스트하고 나에게 잘 작동합니다. 실제로 당신은 그 ip 주소를 설정 할 수 없습니다 내가 grep을 추가 "is unreachable" 하거나 당신이 그것을 당신을 grep -v time위해 잘 작동하도록 변경하면 살 수 있습니다
user3607303
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.