Làm cách nào để xác định các NIC được kết nối với cùng một công tắc từ hộp Linux?


15

Thiết lập ban đầu

Là một quản trị viên Linux, bạn đã cài đặt một hộp Linux mới với 6 NIC eth0 đến eth5. Giao diện eth0 được cấu hình chính xác và tất cả các giao diện khác hiện đang hoạt động nhưng không có địa chỉ IP. Những kẻ mạng chỉ đơn giản là gắn bốn dây cáp vào hộp này. Hai cáp LAN được sử dụng để kết nối hộp với mạng sản xuất và hai cáp được sử dụng để kết nối hộp với mạng riêng. Bạn chỉ biết rằng eth0 được kết nối với mạng sản xuất. Nhưng bạn không biết các NIC khác được kết nối với cùng một công tắc vì có các thế hệ máy chủ khác nhau và / hoặc các kẻ mạng sử dụng các NIC sai cho các kết nối của chúng.

Nhiệm vụ trong tầm tay

Vì thiết lập này là điển hình cho cơ sở hạ tầng của bạn, bạn muốn tự động hóa cấu hình của các giao diện liên kết. Bây giờ bạn có nhiệm vụ phát hiện các NIC nào hoàn toàn không được kết nối và các NIC nào được liên kết với cùng một công tắc để chúng có thể được liên kết. Bạn chỉ có quyền truy cập vào các hộp Linux và không thể truy vấn các thiết bị chuyển mạch.

Ý tưởng

Phát hiện trạng thái liên kết rất dễ dàng:

ethtool $device | grep 'Link detected' | cut -d ':' -f 2

Nhưng làm thế nào để khớp với các thiết bị được kết nối với cùng một công tắc?

Trong HP-UX có một công cụ cho mục đích đó gọi là linkloop [1]. Công cụ Linux chính thức bị thiếu (mặc dù có một dự án SourceForce cũ).

Các giải pháp khả thi đã xuất hiện trong đầu tôi là:

  1. Nghe trên tất cả các giao diện với tcpdump. Thủ công và gửi một gói ICMP (quảng bá). Các giao diện thấy gói đó cần được kết nối với cùng một công tắc. -> cần đề xuất của các công cụ đơn giản có thể được sử dụng cho điều đó. Tôi muốn sử dụng các lệnh shell đơn giản hoặc Python cho kịch bản.

  2. Hãy thử nói chuyện với một hộp bên ngoài thông qua một số giao thức dễ dàng (HTTP?) Và xem có phản hồi không. -> Dễ bị lỗi và phụ thuộc vào hộp bên ngoài.

Bạn có thêm ý tưởng hoặc đề xuất làm thế nào để giải quyết nhiệm vụ này?

Cảm ơn bạn trước cho tất cả các ý kiến!

[1] http://linux.die.net/man/1/linkloop


1
Điều này thực sự có mùi giống như bài tập về nhà - Đây có phải là một vấn đề thực tế mà bạn phải đối mặt trong môi trường sản xuất?
voretaq7

2
Vấn đề thực sự và một vấn đề gây phiền nhiễu, tôi có thể thêm. Tôi nghỉ học một thời gian dài ...
Reiner Rottmann

OK - lý do tôi hỏi là cách bạn đặt câu hỏi khiến tôi nhớ đến phong cách của một trong những cuốn sách giáo khoa mạng của tôi :-)
voretaq7

Câu trả lời:


10

Các thiết bị chuyển mạch có thể đã gửi cho bạn thông tin bạn muốn. Nếu chúng là thiết bị chuyển mạch của Cisco, theo mặc định, chúng sẽ sử dụng một quy trình gọi là CDP (Cisco Discovery Protocol) sẽ cung cấp cho bạn thông tin về công tắc nơi nó được kết nối.

Bạn có thể sử dụng tcpdump để xem thông tin này với thông tin sau (thay thế giao diện phù hợp):

tcpdump -nn -v -i eth0 -s 1500 -c 1 'ether[20:2] == 0x2000'

Phiên bản dựa trên tiêu chuẩn của CDP là LLDP (giao thức khám phá lớp liên kết). Một số nhà cung cấp sẽ bật cái này theo mặc định và những cái khác tắt, vì vậy số dặm của bạn sẽ thay đổi. Có một số triển khai LLDP cho Linux, nhưng nếu bạn muốn một cái gì đó tương tự như trên, bạn có thể sử dụng cái này (thiết lập LLDP trên thiết bị chuyển mạch của Cisco và thử nghiệm bên dưới, phù hợp hơn ở trên):

tcpdump -nn -v -i eth0 -s 1500 -c 1 'ether proto 0x88cc'

Chặn rằng, tôi sẽ nói rằng việc sửa đổi tùy chọn 1 mà bạn cung cấp có thể hoạt động, tuy nhiên, thay vì gửi ICMP quảng bá, bạn có thể thử ICMP bình thường (đến máy chủ không có trong bảng ARP) và chụp các gói ARP. Nếu yêu cầu ARP được gửi ra eth0 và bạn nhận được nó trên eth1 và eth3, thì bạn biết rằng những yêu cầu đó nằm trên cùng một Vlan. Lệnh đơn giản nhất cho việc đó như sau:

tcpdump -i eth0 arp

1
Trên thực tế tôi đã đi với giải pháp này và đã viết một đoạn script python nhỏ chạy tcpdumps dưới dạng các luồng trong nền và sau đó tôi gửi các yêu cầu arp và xem giao diện nào nhận các gói arp từ src mac. Hoạt động nhưng với tất cả thời gian chờ thì phải mất một thời gian.
Reiner Rottmann

Tôi giả sử bạn đang nói về thời gian chờ ping? Bạn có thể thử fping hoặc nmap dưới dạng tùy chọn để giảm thời gian chờ xuống dưới một giây. Ví dụ: "fping -c1 -t200 192.168.0.1" hoặc "nmap -sP --max-retries = 1 --host-timeout = 200ms 192.168.0.1".
YLearn

3

Nếu công tắc sẽ liên lạc với bạn bằng LLDP, bạn có thể chạy LLDP và tìm thêm thông tin ở đó.


3

Nếu các thiết bị chuyển mạch là thiết bị cisco, bạn có thể nhận thông tin CDP, miễn là chúng đang thông báo / phát thông tin cdp

ví dụ: công cụ cdp hoặc cdpr


1

Tại sao không chỉ tải xuống và xây dựng linkloopcông cụ? Nó không cũ ...

Nếu không, tôi sẽ chỉ sử dụng một số công cụ sẽ phát trên lớp 2 và xác minh rằng bạn nhận được nó qua tcpdump.

Gửi một gói ICMP quảng bá thật dễ dàng ping -b 192.168.1.255


Tôi mới thử làm điều này và nó đã thất bại ở đây vào năm 2016 trên Ubuntu 14, vì vậy YMMV.
Hack Saw
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.