Cách đặt VM hầu như bên cạnh máy chủ trong mạng


0

Tôi đã viết một chương trình mô phỏng một máy đơn giản. Chương trình này có MAC riêng và sử dụng các ổ cắm thô để viết các khung ethernet thô, tự quản lý hiệu quả IP / ARP-Bàn, v.v. Có thể giao tiếp với thế giới bên ngoài, nhưng tôi gặp vấn đề với kết nối chủ-khách và khách-chủ. Hiện tại tôi sử dụng giao diện MacVLan ở chế độ cầu , nhưng các gói được gửi đến máy chủ không bao giờ đến trong macvlan1 ảo hoặc eth0 bên dưới . Ngoài ra các công tắc của tôi không hỗ trợ tính năng kẹp tóc cần thiết cho chế độ vepa .

Tôi đã thử sao chép bài đăng này khi người dùng gặp vấn đề tương tự, nhưng trước tiên, câu trả lời không hiệu quả với tôi và thứ hai là người dùng trả lời xong

Nó sẽ dễ dàng hơn nhiều với một chiếc macvlan, mặc dù ..,

Vậy làm thế nào tôi có thể thiết lập một macvlan để khách có thể giao tiếp với thế giới bên ngoài chủ nhà?

Tôi cũng sẽ sử dụng bắc cầu (như trong bài viết này ) nếu nó sẽ làm việc cho tôi. (Ngoài ra tôi muốn tránh xác định trước IP tĩnh)


Chỉ cần làm rõ: Bạn chạy chương trình sử dụng ổ cắm thô trong không gian tên mạng riêng biệt và bạn đã định cấu hình macvlan bên trong không gian tên này có chủ eth0 trong không gian tên chính và bạn đã bật chuyển tiếp / định tuyến để các gói của bạn chính xác vào giao diện macvlan? Bản thân tôi chưa bao giờ thử sử dụng ổ cắm thô và tôi không hoàn toàn chắc chắn về các chi tiết về cách chúng hoạt động; ở vị trí của bạn, tôi đã sử dụng một tapgiao diện (rất dễ để kết nối).
dirkt

Tôi không biết về các không gian tên, nhưng thực tế là có. Việc chuyển tiếp xảy ra tự động bởi kernel. Tôi đã thử sử dụng giao diện TAP với tính năng bắc cầu. "VM" đã nhận được tất cả các gói, nhưng tất cả các gói được ghi vào TAP bằng cách nào đó đã biến mất. Làm thế nào bạn có thể kết nối đúng giao diện TAP?
Cirromulus

Nếu bạn không đặt nó trong một không gian tên, macvlan về cơ bản là vô dụng. "Chuyển tiếp xảy ra tự động bởi hạt nhân" chính xác là điểm có vấn đề: Tại thời điểm nào chúng được tiêm? Nếu tôi hiểu chính xác, ổ cắm thô / gói về cơ bản có nghĩa là cho các giao thức IP mới, không phải để mô phỏng các máy có phần cứng mạng riêng của chúng. Đó là lý do tại sao QEMU có giao diện nhấn. Bạn kết nối một giao diện nhấn giống như bất kỳ giao diện nào khác: ip link set tap0 master br0vv. Và sử dụng tcpdump -ni tap0để xác minh xem các gói "bằng cách nào đó biến mất".
dirkt

Ngoài ra, có rất nhiều chương trình ví dụ với việc triển khai điều chỉnh / nhấn.
dirkt

Câu trả lời:


0

Ok, bây giờ tôi phải chơi xung quanh với ổ cắm thô.

Tuy nhiên, socket thô ( man 7 raw, socket(AF_INET, SOCK_RAW, ...)) thực sự hoạt động trên lớp 3. Bạn nói rằng bạn viết các khung ethernet thô và thực hiện ARP, vì vậy có thể bạn có nghĩa là socket socket ( man 7 packet, socket(AF_PACKET, SOCK_RAW, ...)).

Đối với cả ổ cắm gói và ổ cắm thô, các gói không được định tuyến chính xác, nhưng được đặt trực tiếp trong phần bên ngoài của một giao diện cụ thể. Giao diện này có thể được xác định bằng cách ràng buộc với nó theo tên hoặc bằng cách tra cứu địa chỉ đích. Vì vậy, "việc chuyển tiếp xảy ra tự động bởi kernel" là không đúng: Không có chuyển tiếp nào xảy ra cả. Cụ thể, nếu đích là một địa chỉ cục bộ, gói không được định tuyến lại qua giao diện loopback.

Điều này làm cho phương pháp này hoàn toàn không phù hợp để mô phỏng một thiết bị có "điểm cuối giao diện bổ sung" vào máy chủ.

Đối với macvlans, chế độ cầu được mô tả là

Macvlan là một cây cầu tầm thường không cần phải học vì nó biết mọi địa chỉ mac mà nó có thể nhận được, vì vậy nó không cần phải thực hiện việc học hoặc stp. Mà làm cho nó đơn giản ngu ngốc và nhanh chóng.

Tôi hiểu điều này có nghĩa là macvlans thực hiện bắc cầu bằng cách kiểm tra địa chỉ MAC của giao diện gốc và từng địa chỉ MAC bổ sung được thêm bởi macvlan. Điều đó có nghĩa là khi bạn đang mô phỏng địa chỉ MAC thông qua các ổ cắm thô, mã macvlan không biết có địa chỉ MAC "bổ sung" và vì vậy nó không thể tìm thấy bất kỳ đích nào cho nó.

Thêm vào đó là ổ cắm thô và gói cần root (không cần thiết cho một ứng dụng mô phỏng một số thiết bị khác), theo tôi, ổ cắm thô và gói hoàn toàn không phù hợp với loại ứng dụng này. Chúng hướng đến việc thực hiện các giao thức IP mới hoặc các công cụ mạng cấp thấp khác trong không gian người dùng và không có gì khác.

Vì vậy, lời khuyên của tôi vẫn là: Đừng sử dụng ổ cắm thô / gói. Sử dụng giao diện nhấn, giống như QEMU hoặc các trình giả lập khác. Điều này sẽ cho phép ứng dụng của bạn chạy dưới dạng không root và bạn sẽ có thể thiết lập bất kỳ cấu hình mạng nào trong máy chủ mà bạn thích (định tuyến trên lớp 3 hoặc kết nối nó trên lớp 2).


Tôi không biết rằng không có định tuyến được thực hiện khi sử dụng ổ cắm gói. Giới thiệu về MacVLan: Thiết bị ảo sử dụng MAC chính xác được liệt kê trong MacVLan bằng lệnh ioctl. Tôi không chắc chắn làm thế nào để đặt các gói thô vào một vòi, nhưng câu hỏi này sẽ lạc đề ở đây. Cảm ơn.
Cirromulus

Tôi vẫn không hoàn toàn chắc chắn nơi các gói thô được đưa vào, nhưng vì chúng dường như bỏ qua hầu hết mã định tuyến thông thường của hạt nhân, nên hoàn toàn có thể họ cũng bỏ qua mã cầu nối macvlan và đi thẳng vào hàng đợi bên ngoài của giao diện được liên kết. Và ngược lại, các gói gửi đến được bắt bởi các hook socket thô / gói có thể không bao giờ nhìn thấy mã cầu nối macvlan. Tôi đoán người ta sẽ phải kiểm tra nguồn kernel để chắc chắn (và tôi quá lười để làm điều đó ngay bây giờ).
dirkt
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.