ICMP theo dõi Python

traceroute là một công cụ bạn có thể sử dụng để theo dõi lộ trình của các gói tin từ máy tính của bạn đến máy tính khác. Nó cho phép bạn xem từng bước mà các gói của bạn thực hiện trên đường đi

Ví dụ, sau đây là kết quả của việc chạy traceroute từ máy tính của tôi ở Massachusetts tới “ví dụ. com”

ICMP theo dõi Python

Bạn có thể thấy rằng phải mất 8 bước để chuyển từ máy tính của tôi đến IP đích (93.184.216.34) và bạn có thể thấy thời gian liên quan cho ba lần thử khác nhau cho mỗi bước. Nếu muốn, chúng tôi có thể lập bản đồ các IP này để xem đường dẫn vật lý sơ bộ của các gói của chúng tôi;

traceroute có thể thực hiện được nhờ tác dụng phụ của các tính năng trong Giao thức Internet (IP). Mỗi bao gồm một số lĩnh vực

ICMP theo dõi Python

Một trong các trường trong tiêu đề là giá trị "Thời gian tồn tại" hoặc TTL. Các

Thời gian để sống là một dấu hiệu của giới hạn trên về thời gian tồn tại của một datagram internet. Nó được thiết lập bởi người gửi gói dữ liệu và giảm tại các điểm dọc theo tuyến nơi nó được xử lý. Nếu thời gian tồn tại bằng 0 trước khi gói dữ liệu internet đến đích, thì gói dữ liệu internet sẽ bị hủy. Thời gian để sống có thể được coi là giới hạn thời gian tự hủy

Về lý thuyết, điều này sẽ được đo bằng giây, đại diện cho bộ hẹn giờ tự hủy thực sự, nhưng trên thực tế, TTL thực sự phản ánh số bước nhảy mà gói vẫn có thể thực hiện trên đường đến đích. Tại mỗi bộ định tuyến dọc theo đường dẫn của gói, giá trị này sẽ giảm đi và nếu nó bằng 0, gói sẽ không đi xa hơn và thông báo lỗi ICMP được trả về cho người gửi. Điều này giúp ngăn chặn hành vi ngoài ý muốn trong một mạng phức tạp, chẳng hạn như vòng lặp vô hạn. Không có TTL, bạn có thể tưởng tượng các gói mồ côi và bị mất sẽ được chuyển tiếp vô thời hạn

Tin nhắn được gửi lại cho người gửi ban đầu bao gồm một số thông tin cơ bản và cùng với tin nhắn, địa chỉ của bộ định tuyến đã gửi nó cũng hiển thị

đường theo dõi

traceroute tận dụng chức năng TTL giảm dần này theo cách thông minh để khám phá mạng. Giả sử chúng ta đang cố theo dõi lộ trình đến C trong mạng sau

ICMP theo dõi Python

traceroute dựa vào thao tác nhân tạo TTL của các gói gửi đi, gửi dần các gói có giá trị TTL tăng dần. Nó bắt đầu với TTL là 1;

ICMP theo dõi Python

Sau đó, traceroute có thể gửi một gói đến đích với chỉ số TTL là 2 và gói này sẽ chuyển đến bộ định tuyến thứ hai dọc theo đường dẫn trước khi ICMP được gửi lại

ICMP theo dõi Python

Mỗi gói sẽ đi xa hơn gói trước một bước nhảy và bằng cách điều chỉnh bộ định tuyến ở độ sâu của mỗi bước nhảy và theo dõi các bộ định tuyến mà nó nhận được tin nhắn trên đường đi, nó có thể xây dựng lại một đường dẫn thô đến máy chủ đích

ICMP theo dõi Python

Triển khai cơ bản sẽ như thế nào?

Để tạo lại điều này, chúng tôi sẽ muốn viết một số mã thực hiện như sau

  • Lấy IP đích của đích mẫu, nói “ví dụ. com”
  • Tạo một ổ cắm cho phép nó gửi các gói UDP
  • Tạo một ổ cắm mà trên đó nó sẽ nghe các thông báo ICMP
  • Khởi tạo các biến vòng lặp để theo dõi bước nhảy hiện tại
  • Trong một vòng lặp khi chúng tôi chưa đến đích
    • Gửi một gói có TTL tăng dần
    • Nhận một gói ICMP đến
    • Theo dõi bước nhảy hiện tại và địa chỉ của thông báo ICMP đã nhận

Điều đó nghe có vẻ không tệ lắm. Tất cả đều khá dễ tiếp cận và trong Python, nó có thể trông giống như thế này


import socket

DESTINATION = 'example.com'
DESTINATION_PORT = 33434
MESSAGE = 'foo'


def main():
    # Get the destination ip address.
    destination_ip = socket.gethostbyname(DESTINATION)
    print('Tracing the route to {0}'.format(destination_ip))

    # Prepare a socket to send UDP packets.
    sending_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    sending_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

    # Prepare a socket to listen for ICMP messages.
    # Note: the middle argument _may_ be SOCK_RAW, but since I'm running this
    # on a mac, I had to use SOCK_DGRAM to avoid needing root privileges.
    # See https://apple.stackexchange.com/questions/312857/how-does-macos-allow-standard-users-to-ping.
    receiving_socket = socket.socket(
        socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_ICMP)

    # Show the ICMP header, since that's where the router address is.
    receiving_socket.setsockopt(socket.SOL_IP, socket.IP_HDRINCL, 1)

    # Initialize the variables we'll use for seeing if we're done and keeping
    # track of the current hop.
    received_ip = None
    current_hop = 1
    while received_ip != destination_ip:
        # Set the socket's TTL to the current hop so that the packet just
        # reaches it before being stopped.
        sending_socket.setsockopt(
            socket.IPPROTO_IP, socket.IP_TTL, current_hop)

        # Attempt to send a UDP packet to the destination ip.
        sending_socket.sendto(bytes(MESSAGE, 'utf-8'),
                              (destination_ip, DESTINATION_PORT))

        # Receive any incoming ICMP packet. We can ignore the first return
        # value from recvfrom, which would be the included data.
        _, addr = receiving_socket.recvfrom(1500)
        received_ip = addr[0]
        print('Current hop {0}: ICMP message received from {1}'.format(
            current_hop, received_ip))
        current_hop = current_hop + 1


if __name__ == '__main__':
    main()

chúng ta đi thôi. Nếu tôi tiếp tục và chạy cái này, tôi sẽ nhận được như sau

blog: $ python3 content/posts/toy-traceroute/toy_traceroute.py
Tracing the route to 93.184.216.34
Current hop 1: ICMP message received from 10.1.10.1
Current hop 2: ICMP message received from 96.120.66.197
Current hop 3: ICMP message received from 24.124.212.221
Current hop 4: ICMP message received from 96.108.45.74
Current hop 5: ICMP message received from 96.110.22.85
Current hop 6: ICMP message received from 69.241.119.54
Current hop 7: ICMP message received from 152.195.232.129
Current hop 8: ICMP message received from 93.184.216.34
blog: $

Điều này khớp chính xác với con đường mà traceroute đã khám phá trước đó, điều này rất thú vị. Chúng tôi đã dò thành công tuyến đường giữa máy tính của tôi và máy chủ đích

Các biến chứng làm cho nó thú vị

Có nhiều cách để cải thiện chương trình cơ bản này, bao gồm ít nhất những cách sau

  • thời gian. mỗi bước nhảy mất bao lâu?
  • Điều gì sẽ xảy ra nếu chúng tôi gửi nhiều lần thử để có nhiều mẫu thời gian hơn?
  • Chúng ta phải làm gì nếu một bước nhảy không phản hồi?

traceroute xử lý những vấn đề này, nhưng thật thú vị khi nghĩ về cách bạn tự giải quyết vấn đề

Cũng có một vài trường hợp thú vị về truy tìm tuyến đường nói chung

  • Điều gì xảy ra nếu một bộ định tuyến bỏ các gói UDP?
  • Điều gì sẽ xảy ra nếu hai yêu cầu tiếp theo đi theo một đường dẫn khác qua mạng?

Xem mọi thứ hoạt động như thế nào thông qua một vấn đề về đồ chơi

traceroute là một trường hợp sử dụng đơn giản nhưng thông minh của một tính năng tích hợp sẵn của internet và thật thú vị khi xem nó hoạt động như thế nào thông qua một ví dụ cơ bản

Traceroute sử dụng ICMP như thế nào?

Traceroute sử dụng lệnh Ping của ICMP để tìm hiểu xem có bao nhiêu thiết bị khác nhau giữa máy tính khởi tạo Traceroute và mục tiêu . Lệnh này hoạt động bằng cách điều chỉnh thời gian của gói thành giá trị trực tiếp hoặc TTL.

Loại ICMP cho theo dõi là gì?

Traceroute được triển khai với thông báo ICMP. Nó hoạt động bằng cách gửi tin nhắn ICMP echo ( ICMP type '8' ) đến cùng một đích với giá trị ngày càng tăng của trường thời gian tồn tại (TTL). Các bộ định tuyến dọc theo đường dẫn theo dõi trả về Thời gian vượt quá ICMP (loại ICMP '11' ) khi trường TTL trở thành 0.

Làm cách nào để sử dụng theo dõi trong Python?

Python Traceroute với Hình ảnh hóa như trong 'Hacker Movie. .
Traceroute là một công cụ để kiểm tra xem gói tin/lưu lượng truy cập của bạn được định tuyến ở đâu trên internet. .
Nhập mô-đun
Nhận vị trí của tôi và vị trí mục tiêu
Chạy theo dõi
Chuẩn bị cho cốt truyện
[End] Vẽ bản đồ bằng plotly

Loại ICMP và mã số là gì?

Tham số Giao thức thông báo điều khiển Internet (ICMP) .
Loại 0 — Trả lời bằng tiếng vang
Loại 1 — Chưa được chỉ định
Loại 2 — Chưa được chỉ định
Loại 3 — Không thể truy cập đích
Loại 4 — Làm nguội nguồn (Không dùng nữa)
Loại 5 — Chuyển hướng
Loại 6 — Địa chỉ máy chủ thay thế (Không dùng nữa)
Loại 7 — Chưa được chỉ định