Khách và chủ nhà không thể nhìn thấy nhau bằng linux-kvm và macvtap


9

Tôi đang di chuyển một máy ảo kvm từ một máy chủ cũ (cả phần cứng và hệ điều hành) sang một máy chủ mới.

Đối với mạng, virt-manager đề xuất cho tôi một tùy chọn mới: macvtap . Điều này có vẻ là một thay thế tốt để thiết lập một cây cầu trên eth0.

Vì vậy, bây giờ khách khởi động tốt, nhận IP từ máy chủ DHCP mạng cục bộ của tôi, có thể truy cập internet. Khách cũng thấy các máy khác trên mạng cục bộ, tôi có thể ssh chúng, v.v.

Vấn đề là chủ nhà và khách không nhìn thấy nhau. Tôi không thể tiếp cận khách từ máy chủ bằng IP khách, tôi cũng không thể tiếp cận máy chủ từ khách bằng IP máy chủ. Không ping, ssh, http, không có gì.

Đây là route -nlệnh từ máy chủ lưu trữ:

$ /sbin/route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.0.1     0.0.0.0         UG    0      0        0 eth0
192.168.0.0     0.0.0.0         255.255.255.0   U     1      0        0 eth0

(cùng sản lượng từ khách).

Tôi có thể có thể thiết lập một giao diện điều chỉnh / nhấn mới dành riêng cho giao tiếp giữa máy chủ và khách nhưng có vẻ hơi quá mức. Có cách nào để làm cho chủ nhà và khách liên lạc?


Macvtap không phải là sự thay thế hợp lệ cho việc bắc cầu. Nếu bạn muốn chuyển đổi thay vì bắc cầu, hãy nhìn vào openvswitch.
dùng186658

Câu trả lời:


7

Tôi đã hỏi câu hỏi này trên IRC và có vẻ như macvtap

bơm lưu lượng khách vào ngăn xếp mạng quá thấp

Giải pháp sau đó là thêm giao diện mạng để khách và chủ nhà liên lạc hoặc ở lại với giải pháp bắc cầu cũ ...


1
Dưới đây là hướng dẫn từng bước về cách tạo giao diện máy chủ / khách mà không phải tắt trình quản lý mạng: wiki.libvirt.org/page/iêu
HDave

1
Tôi không thể có được những hướng dẫn đó để làm việc ...
HDave

4

virt-manager nói một cách rõ ràng rằng macvtap không hoạt động cho máy chủ để liên lạc với mạng khách khi bạn thiết lập nó. Tôi chỉ cần thêm một giao diện dựa trên nat thứ hai, thiết lập nó trong máy khách và sử dụng giao diện đó để liên lạc với máy chủ của tôi.


1

Giải pháp là cấu hình giao diện macvlan trên máy ảo hóa, có cùng địa chỉ IP so với giao diện phần cứng thực (rất quan trọng) và định cấu hình định tuyến trên máy chủ để sử dụng. Trong Qemu / KVM, sử dụng giao diện macvtap trên giao diện phần cứng như bình thường.

Đối với cấu hình của tôi (mạng 192.168.1.0/24, giao diện phần cứng p10p1 và cổng 192.168.1.1), nó cung cấp (trên bộ ảo hóa):

ip link add link p10p1 address 00:19:d1:29:d2:58 macvlan0 type macvlan mode bridge
ip address add 192.168.1.100/24 dev macvlan0
ip link set dev macvlan0 up

ip route flush dev p10p1
ip route add default via 192.168.1.1 dev macvlan0 proto static

1

Như đã được đề cập trong các câu trả lời trước, một giải pháp cho vấn đề này là thêm bộ điều hợp mạng macvlan trên máy chủ. Tuy nhiên, tôi cảm thấy rằng việc tua lại thủ công các tuyến đến bộ điều hợp macvlan là hơi khó, đặc biệt là vì tôi muốn hỗ trợ IPv6 và đặt tuyến theo cách thủ công có thể trở thành vấn đề khi tiền tố thay đổi. Vì vậy, đây là cấu hình của tôi để hạt nhân kiểm soát bảng định tuyến:

(Cấu hình cụ thể ở đây là Debian và Upstart cụ thể, nhưng các bước cơ bản sẽ hoạt động trên mọi GNU / Linux.)

Tạo bộ điều hợp macvlan khi khởi động

Đầu tiên, bạn cần chọn một địa chỉ MAC cho bộ điều hợp của bạn. Bạn có thể chỉ cần sử dụng một cái ngẫu nhiên, nhưng tôi khuyên bạn nên tự tạo bộ điều hợp macvlan và sử dụng MAC của nó. Theo cách này, MAC bắt buộc phải có bất kỳ quy ước nào có thể có ở đó.

Nên cài đặt MAC cố định, vì nếu không thì không có cách nào để máy chủ DHCP nhận ra máy của bạn sau khi khởi động lại và gán cho nó cùng một địa chỉ IP như trước.

Vì vậy, tạo một bộ chuyển đổi và tìm kiếm MAC:

root@host:~# ip link add link eth0 macvlan0 type macvlan mode bridge
root@host:~# ip addr show dev macvlan0
#: macvlan0@eth0:  mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1
    link/ether 12:34:56:78:90:ab brd ff:ff:ff:ff:ff:ff
...

Số thập lục phân được tô sáng là địa chỉ MAC của bạn.

Bây giờ bạn tạo một tập lệnh init - phải được chạy trước khi kết nối mạng - để tạo bộ điều hợp macvlan mỗi lần khởi động. Lệnh để làm điều này là:

ip link add link eth0 address <MACADDRESS> macvlan0 type macvlan mode bridge

Một ví dụ Upstart init script cho mục đích này sẽ là:

start on starting networking

script
    ip link add link eth0 address <MACADDRESS> macvlan0 type macvlan mode bridge
end script

Chỉ cần đặt điều này trong ví dụ /etc/init/macvlan.conf.

Thiết lập cấu hình mạng

Trong /etc/network/interfaces, đặt bộ điều hợp mạng vật lý của bạn thành thủ công (nhưng để tự động) và di chuyển cấu hình trước đó (thường là DHCP hoặc địa chỉ IP tĩnh) sang bộ điều hợp macvlan của bạn. Ví dụ:

auto eth0
iface eth0 inet manual

auto macvlan0
iface macvlan0 inet dhcp

Vô hiệu hóa IPv6 cho bộ điều hợp vật lý

Cuối cùng, bạn không muốn bộ điều hợp vật lý có được địa chỉ IP. Đối với IPv4, cài đặt bộ điều hợp thành thủ công sẽ ngăn không cho nó lấy địa chỉ. Tuy nhiên, tôi không tìm thấy cấu hình nào ngăn nhân lấy / gán địa chỉ IPv6 cho / cho bộ điều hợp. Khi đó, nó cũng thêm các tuyến đường cho họ, có thể gây ra vấn đề. Vì vậy, cách tốt nhất dường như là vô hiệu hóa IPv6 cho bộ điều hợp vật lý. Bạn có thể làm điều này bằng cách thêm dòng

net.ipv6.conf.eth0.disable_ipv6=1

đến /etc/sysctl.conf, bằng cách tạo một tệp trong /etc/sysctl.d/dòng này hoặc bằng cách thêm

sysctl -w net.ipv6.conf.eth0.disable_ipv6=1

đến tập lệnh init của bạn.

Khi bạn khởi động lại máy, giao tiếp từ máy chủ đến khách sẽ hoạt động với cả IPv4 và IPv6.


Xin lưu ý rằng nếu bạn mắc lỗi trong khi thiết lập điều này, máy chủ của bạn có thể không truy cập được qua mạng ngay cả sau khi khởi động lại. Chỉ làm điều này nếu bạn có quyền truy cập vật lý vào máy hoặc các biện pháp bảo vệ khác để bạn có thể khắc phục các sự cố tiềm ẩn.


1

Bạn muốn kết thúc với một cái gì đó như thế này:

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.0.1     0.0.0.0         UG    0      0        0 macvlan0
192.168.0.0     0.0.0.0         255.255.255.0   U     1      0        0 macvlan0

Lưu ý rằng cột cuối cùng chứa "macvlan0" thay vì "eth0".

Để đạt được điều đó, bạn có thể sử dụng các lệnh này, giả sử 192.168.0.42 làm địa chỉ IP của bạn:

ip link add link eth0 macvlan0 type macvlan mode bridge
ip address add 192.168.0.42 dev macvlan0
ip link set dev macvlan0 up
ip route flush dev eth0
ip route add default via 192.168.0.1

Chủ yếu là tương tự như các giải pháp của npen. Nếu bạn muốn một kịch bản phức tạp hơn, hãy xem trang web của tôi về chủ đề này.


Đừng quên tải macvlanmô-đun:modprobe macvlan
mdd

0

Tôi đã sử dụng những gì Lazzaro đã viết trên Debian, nhưng tôi muốn thêm một vài ghi chú.

Trước hết, giao diện khách cần được đặt thành "Thiết bị nguồn" -> "Thiết bị chủ eth0: macvtap"; "Chế độ nguồn" -> " Cầu ".

Thứ hai, tập lệnh init mà bạn không làm việc cho tôi ( có vẻ như giao diện macvlan0 đã được tạo quá muộn trong quá trình khởi động ), vì vậy tôi đã sử dụng điều này:

nano /etc/init.d/macvlan

Thay đổi mac thành mac được chỉ định khi giao diện được tạo lần đầu tiên:

#!/bin/sh
### BEGIN INIT INFO
# Provides:          macvlan
# Required-Start:    $local_fs
# Required-Stop:     
# Default-Start:     S
# Default-Stop:      
# Short-Description: Set up macvlan
# Description:       This script sets up the macvlan interface
#                    before it can be used by networking.
# X-Start-Before:    networking
### END INIT INFO


PATH=/sbin:/usr/sbin:/bin:/usr/bin
. /lib/init/vars.sh


do_start () {
        ip link add link eth0 address 00:11:22:aa:bb:cc macvlan0 type macvlan mode bridge
###      REPLACE MAC ON EACH HOST ->  ^^ ^^ ^^ ^^ ^^ ^^
}

case "$1" in
  start|"")
        do_start
        ;;
  *)
        echo "Sorry, this only sets up the macvlan interface." >&2
        exit 3
        ;;
esac

Lưu và thiết lập bit thực thi:

chmod +x /etc/init.d/macvlan

và thêm tất cả các liên kết cho init:

update-rc.d macvlan defaults
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.