Chuyển tiếp cổng từ máy chủ đến khách với libvirt 0.8.3 Sử dụng KVM trên Ubuntu


14

Máy chủ lưu trữ có sẵn một IP bên ngoài, vì vậy tôi đã thiết lập các khách KVM của mình với NAT.

Làm cách nào để thiết lập chuyển tiếp cổng để chuyển tiếp một số yêu cầu từ bên ngoài đến khách?

Tôi không thể tìm thấy bất kỳ tài liệu về điều này. Câu trả lời gần nhất có lẽ là câu trả lời này , nhưng sau đó nó cũng được đề cập có cách dễ dàng hơn để làm điều này trong libvirt 0.8.3. Có ai biết một cách hiện tại để làm điều này?


bên ngoài - ý bạn là IP internet? hoặc chỉ mạng LAN của bạn (bên ngoài máy ảo)? Bạn có thể phân bổ các địa chỉ bên ngoài cho máy ảo của mình để thiết lập kết nối mạng không?
Art Shayderov

Tôi chỉ có thể nhận một địa chỉ IP Internet, đó là lý do tại sao tôi không sử dụng chế độ mạng cầu nối.
wei

Câu trả lời:


12

Đây là một cách tốt hơn để thiết lập chuyển tiếp cổng, sử dụng tập lệnh hook ( nguồn ).

Trong /etc/libvirt/hooks/qemu:

#!/bin/sh

GUEST_NAME=
HOST_PORT=
GUEST_IPADDR=
GUEST_PORT=

if [ "$1" = "$GUEST_NAME" ]; then
  if [ "$2" = start ]; then
    iptables -t nat -A PREROUTING -p tcp --dport "$HOST_PORT" \
         -j DNAT --to "$GUEST_IPADDR:$GUEST_PORT"
    iptables -I FORWARD -d "$GUEST_IPADDR/32" -p tcp -m state \
         --state NEW -m tcp --dport "$GUEST_PORT" -j ACCEPT
  elif [ "$2" = stopped ]; then
    iptables -t nat -D PREROUTING -p tcp --dport "$HOST_PORT" \
         -j DNAT --to "$GUEST_IPADDR:$GUEST_PORT"
    iptables -D FORWARD -d "$GUEST_IPADDR/32" -p tcp -m state \
         --state NEW -m tcp --dport "$GUEST_PORT" -j ACCEPT
  fi
fi

Bạn nên đặt bốn biến ở trên cùng để phù hợp với thiết lập libvirt của bạn.

Bạn sẽ cần phải khởi động lại libvirt-bin, điều này trên ubfox được thực hiện với:

sudo sh -c 'service libvirt-bin stop; service libvirt-bin start'

sau đó bạn sẽ cần phải khởi động lại khách. Trên Ubuntu, bạn sẽ cần điều chỉnh /etc/apparmor.d/usr.sbin.libvirtdđể cho phép tập lệnh hook thực thi:

Kế bên

/usr/sbin/* PUx,

chắp thêm

/etc/libvirt/hooks/* PUx,

Sau đó tải lại apparmor:

sudo service apparmor reload

Có lẽ có một cách để tự động cấu hình $GUEST_IPADDRbằng virsh / dumpxml / iface-dumpxml, nhưng tôi không tìm thấy nó. Ngoài ra, IP có thể được đặt tĩnh trong tài liệu xml: mạng .

Theo như tôi có thể nói, các bộ lọc mạng chỉ có thể được sử dụng để hạn chế những gì xảy ra trên mạng ảo và chúng không hữu ích cho việc chuyển tiếp cổng.


1
Trusty có một dòng /etc/libvirt/hooks/** rmix,trong tệp cấu hình apparmor theo mặc định và dường như nó cũng có tác dụng tương tự. Tôi có thể chạy tập lệnh mà không sửa đổi cấu hình apparmor.
Amir Ali Akbari

2

Tôi đang ở trong một tình huống tương tự. Tôi có một Máy chủ Windows chạy trong KVM trong mạng NATed riêng được kết nối trên máy chủ thông qua giao diện virbr0. Tôi muốn truy cập VM thông qua máy tính để bàn từ xa. Vì vậy, tôi phải chuyển tiếp lưu lượng truy cập đến cổng 3389 (RDP) sang cổng VM 3389. Tôi đã đạt được điều này với một số quy tắc có thể xóa được.

/ sbin / iptables -t nat -A PREROUTING -p tcp -d HOST-IP --dport 3389 -j DNAT - đến đích VM-IP: 3389

/ sbin / iptables -I FORWARD -m state -d VM-NET / 24 --state MỚI, LIÊN QUAN, THÀNH LẬP -j CHẤP NHẬN

Tất nhiên HOST-IP, VM-IP và VM-NET phải được thông qua. Tuy nhiên, làm phiền với iptables và libvirt là khó khăn. Ngay bây giờ tôi đang tìm kiếm một giải pháp để có quyền truy cập internet trên máy ảo mà tôi đã mất do làm rối các quy tắc không thể xóa được :-(


Tôi biết nó đã vài tuổi nhưng câu trả lời này có hiệu quả với tôi. Cảm ơn!
mttdbrd

1

Tôi tin rằng câu trả lời bạn tham khảo vẫn hiển thị các quy tắc iptables phù hợp. Tuy nhiên, bây giờ bạn có thể sử dụng một hook script để tạo và hủy các quy tắc khi các máy ảo được khởi động và dừng. Giống như Isaac đã nói trong câu trả lời trước, cũng có các bộ lọc mạng trong libvirt hiện tại nhưng tôi không chắc chắn làm thế nào hoặc thậm chí nếu chúng có thể được sử dụng để mở cổng cho khách NATed.


0

mạng khách được thiết lập như thế nào? nếu nó được bắc cầu, tất cả những gì bạn cần làm là chuyển tiếp các cổng tới IP của khách. Nếu khách của bạn đứng sau một NAT khác, một libvirt được thiết lập, thì nó sẽ trở nên phức tạp

nhưng trong mọi trường hợp, ở đây bạn chỉ cần xử lý các VM như một máy vật lý


Tôi đoán tôi đã không nói rõ ràng. Máy chủ không ở trong NAT, nó có địa chỉ IP bên ngoài. Thật không may, mạng khách là đằng sau NAT được thiết lập bởi libvirt.
wei

ah, sau đó là một vấn đề khác. về cơ bản libvirt quản lý giải pháp NAT của riêng nó, có thể chỉnh sửa.
dyasny

Vâng, đó là những gì tôi đã nói, nó có thể được chỉnh sửa. Nhưng tôi không thể tìm thấy bất kỳ tài liệu tham khảo nào về nó, các tệp cấu hình xml nwfilter trông có vẻ kỳ quái đối với tôi, tài liệu trên trang web libvirt cũng không hữu ích lắm.
wei

Nếu bạn đã kết nối mạng, bạn có thể từ bỏ NAT libvirt mặc định và thiết lập mọi thứ bạn muốn. Như dyasny đã nói, hãy đối xử với VM như một cỗ máy vật lý. Tôi có máy chủ KVM và giao diện với IP bên ngoài được gán cho VM được định cấu hình như một cổng. Nếu phù hợp với nhu cầu của bạn, tôi có thể đăng cấu hình (kiểu ubfox).
Nghệ thuật Shayderov
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.