Làm thế nào để tìm Địa chỉ IP không sử dụng trên mạng?


25

Tôi chỉ muốn tìm ra Địa chỉ IP không sử dụng trên mạng. Tôi nghĩ rằng nó có thể với nmap. Có ai có thể nói cho tôi cách xin không?

Chú thích:

Tôi chỉ cần danh sách IP miễn phí một mình.


Có bất kỳ yêu cầu bổ sung?
Serge

Không có thêm yêu cầu. Cho đến bây giờ tôi đã tìm thấy nhiều xung đột địa chỉ IP, tôi chỉ muốn tìm ra địa chỉ IP miễn phí trên mạng và gán nó.
karthick87

Câu trả lời:


26

Một máy quét nhanh là arp-scan sử dụng ARP để "nhìn" các máy khác trên mạng. Nó cũng trả về địa chỉ MAC và cố gắng xác định nhà sản xuất bộ điều hợp mạng.

Ví dụ sử dụng (thay thế wlan0bằng eth0nếu cần):

$ 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

Lưu ý rằng tiện ích này chỉ báo cáo các máy được bật nguồn. pingcó thể bị chặn, nhưng arp-scankhông thể bị chặn vì cần thiết cho một máy tương tác với các máy khác trên mạng. Để chắc chắn rằng IP không được sử dụng, tốt hơn bạn nên xem bộ định tuyến của mình (đối với địa chỉ tĩnh / động) và máy chủ DHCP (đối với địa chỉ động).


Tôi muốn như thế này nhưng nó đã bỏ lỡ một vài máy chủ khi tôi thử nghiệm nó?!? :(
vụng trộm ngu ngốc

@bumbledfool: bạn có chắc chắn rằng các máy chủ khác nằm trên cùng một mạng con không? Ví dụ 192.168.1.x chứ không phải 192.168.2.x?
Lekensteyn

Có, tất cả các máy chủ lưu trữ trên cùng một mạng con. Tôi đã chạy nó hàng chục lần nữa và 2/3 thời gian tất cả các máy chủ xuất hiện. Thật thú vị (?), Nó luôn là cùng một máy chủ không hiển thị (nếu có) ... Đây là trên mạng wifi nhưng tín hiệu rất chắc chắn. Ngoài ra, phương pháp nmap được đề cập ở trên luôn không bỏ lỡ bất kỳ máy chủ nào.
vụng về đánh lừa

Có bao nhiêu máy chủ chúng ta đang nói về? Hãy thử tăng độ trễ giữa việc gửi các gói bằng -itham số, ví dụ -i 5trong 5 ms.
Lekensteyn

2/5. Tăng độ trễ đã làm thủ thuật. Cảm ơn!
vụng về đánh lừa

15

sudo nmap -sP -PR 192.168.0.* (hoặc bất kể mạng của bạn là gì) sẽ thực hiện thủ thuật.

Để cài đặt nó sử dụng sudo apt-get install nmap.

Nguồn: serverfault.com .

Chỉ cần thử nghiệm điều này, hoạt động như một bùa mê bao gồm các máy chủ bị che khuất, bạn cần thêm sudo để có thể sử dụng -PRtùy chọn.


1
Tôi vừa mới thử nó, một cái bạn cần chạy là root (tức là sử dụng sudo). Hơn nữa, nó có thể bị chặn bởi tường lửa vì nó cũng quét các cổng của máy chủ cũng làm chậm quá trình tìm kiếm.
Lekensteyn

Đọc bài đăng gốc plz, bình luận thứ 3 giải thích cách không sử dụng quét cổng (không cần thiết);)
Bruno Pereira

Bạn nên đưa nó vào câu trả lời của bạn sau đó, không phải ai cũng muốn theo dõi các nguồn. Ngoài ra, sẽ rất hữu ích khi mô tả những gì lệnh thực sự làm.
Lekensteyn

thực hiện;) hoạt động thực sự tốt đẹp.
Bruno Pereira

Havent đã thử nghiệm (hoặc đã từng sử dụng) arp-scan, thx cho đường!
Bruno Pereira

4

Tôi thấy fping hữu ích; trong số những thứ khác, nó sẽ ping một loạt địa chỉ và danh sách 'còn sống' và 'không thể truy cập'. fping không được cài đặt theo mặc định.

sudo apt-get install fping

Cách tiếp cận đơn giản là chỉ chạy nó trên một loạt các địa chỉ.

fping -g 192.168.0.2 192.168.0.254 2>/dev/null

Công phu hơn một chút, để tạo ra một danh sách các IP không sử dụng.

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
Đừng quên rằng điều này giả định rằng máy chủ phản hồi yêu cầu ICMP Echo (còn gọi là ping). Không phải mọi máy chủ đều làm điều đó, đặc biệt là một số máy MS Windows không. Ngoài ra tường lửa thường vô hiệu hóa điều này, mặc dù chúng trực tuyến và có địa chỉ MAC trong mạng của bạn. Đây là một giải pháp nhanh, nhưng không nên dựa vào mọi tình huống.
eaydin

Bạn đúng; một giải pháp liên quan đến nmap, hoặc một số thay thế cho ping có thể sử dụng các giao thức khác ngoài ICMP, sẽ đáng tin cậy hơn.
bgvaughan

3

Tôi tin rằng nó không phải là giải pháp tốt nhất nhưng nó làm những gì bạn muốn. Tập lệnh này chạy pingqua 192.168.0.0/24mạng và trả về danh sách các IP không hoạt động nếu không có trong bộ đệm ARP.

Ưu điểm so với các giải pháp trước đây:

  • sử dụng cả hai phương pháp: kiểm tra ping và ARP
  • không cần chạy như rootngười dùng
  • chạy khoảng 1,5 phút trên Core i3-2100 của tôi

Để quét mạng của bạn chạy nó với <first IP> <last IP>các tham số.

#!/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

Cập nhật sau khi tải xuống

Tôi đã viết nó vì nmap -PR 192.168.0.*không làm việc cho tôi:

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

Cập nhật 2

Đã sửa tất cả các sự cố với ARP-cache.


2
Nếu máy không phản hồi ping thì sao? Có nghĩa là IP không được sử dụng?
Bruno Pereira

@ brunopereira81 Tôi không biết cách nào để phân biệt IP miễn phí với máy chủ bị tắt nguồn.
Serge

Không tắt nguồn, tường lửa của máy tính có thể được cấu hình để không phản hồi với các lệnh ping thông thường. Bằng cách đó, bạn không nhận được phản hồi nhưng điều đó không có nghĩa là máy tính bị tắt hoặc nó không có dịch vụ đang chạy, nó chỉ bỏ qua các lệnh ping thông thường. (Tôi không biết kịch bản liên quan đến câu hỏi này X số máy tính vừa bị hỏng do xung đột IP!
Bruno Pereira

@ brunopereira81 Tôi biết nó không lý tưởng. Đó là lý do tại sao tôi gọi nó là "nhanh và bẩn" :)
Sergey

Câu trả lời tốt, tôi không hiểu làm thế nào hạ thấp câu trả lời như vậy giúp.
nikhil

1

Điều này sẽ làm điều đó ngay trong 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

tôi nghĩ nó đơn giản hơn

# 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

Bạn có thể muốn xem mã của bạn. Trong mạng con của tôi, nó hiển thị cho tôi tất cả các IP ngay cả những IP được lấy.
Videonauth

không, tôi kiểm tra nó và hoạt động tốt với tôi, trên thực tế bạn không thể đặt các địa chỉ IP đó còn sống vì tôi thêm grep "is unreachable" hoặc nếu bạn thay đổi nó grep -v timecó thể hoạt động tốt cho bạn
user3607303
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.