Làm thế nào để SSH từ máy chủ đến khách bằng cách sử dụng QEMU?


29

Làm cách nào để thiết lập ssh từ máy chủ đến khách bằng cách sử dụng qemu? Tôi có thể sử dụng chuyển hướng cổng khi khởi động VM mà không cần bất kỳ tham số đặc biệt nào, như sau:

/usr/bin/qemu-system-x86_64 -hda ubuntu1204 -m 512 -redir tcp:7777::8001

Nhưng khi tôi cố gắng khởi động bằng cách sử dụng như sau:

/usr/bin/qemu-system-x86_64 \
-m 1024 \
-name vserialtest \
-hda ubuntu1204 \
-chardev socket,host=localhost,port=7777,server,nowait,id=port1-char \
-device virtio-serial \
-device virtserialport,id=port1,chardev=port1-char,name=org.fedoraproject.port.0 \
-net user,hostfwd=tcp:7777::8001

Tôi gặp lỗi sau và VM không khởi động:

qemu-system-x86_64: -net user,hostfwd=tcp:7777::8001: invalid host
forwarding rule 'tcp:7777::8001'
qemu-system-x86_64: -net user,hostfwd=tcp:7777::8001: Device 'user'
could not be initialized

Xin lưu ý rằng tôi có thể khởi động VM mà không cần -nettham số mà không gặp vấn đề gì, tuy nhiên, tôi muốn thiết lập ssh từ máy chủ đến máy khách. ssh từ khách đến máy chủ hoạt động tốt như mong đợi.

Chỉnh sửa

Tôi đã thử sử dụng

-net user,hostfwd=tcp::7777-:8001

cũng như

-net user,hostfwd=tcp::7777:8001

nhưng vẫn còn lỗi và VM không khởi động.


Câu trả lời:


37

Tôi nghĩ rằng lỗi không đến từ câu lệnh -net, mà đến từ:

-chardev socket,host=localhost,port=7777,server,nowait,id=port1-char

Câu lệnh đã sử dụng cổng 7777. Để chuyển tiếp cổng, với

-net user,hostfwd=tcp::7777-:8001

nó hoạt động tốt khi không thiết lập kênh nối tiếp virtio.

Nếu tôi hiểu đúng, bạn muốn thiết lập một kênh nối tiếp virtio để giao tiếp từ máy chủ đến VM bằng cách sử dụng Ổ cắm tên miền Unix?

Trong trường hợp này, những điều sau đây có thể thực hiện công việc:

/usr/bin/qemu-system-x86_64 \
-m 1024 \
-name vserialtest \
-hda ubuntu1204 \
-chardev socket,path=/tmp/port1,server,nowait,id=port1-char \
-device virtio-serial \
-device virtserialport,id=port1,chardev=port1-char,name=org.fedoraproject.port.0 \
-net user,hostfwd=tcp::7777-:8001

CHỈNH SỬA:

Một ví dụ về cách kết nối từ máy chủ bằng ssh với VM:

-net user,hostfwd=tcp::10022-:22
-net nic

Máy chủ lưu trữ này sẽ ánh xạ cổng localhost (máy chủ) 10022 sang cổng 22 trên VM. Khi VM đã được khởi động như thế này, bạn có thể truy cập nó từ localhost như sau:

ssh vmuser@localhost -p10022

Lệnh -net nic khởi tạo thẻ giao diện mạng ảo rất cơ bản.


Vâng, bạn đã đúng, tôi đang cố gắng sử dụng virtio-serial để thiết lập giao tiếp từ máy chủ đến khách. VM đã khởi động đưa ra cảnh báo tại bảng điều khiển máy chủ: Warning: vlan 0 with no nicsnhưng khi tôi làm ifconfigkhách, tôi chỉ thấy lovà tôi vẫn nhận được ssh: connect to host 10.0.2.15 port 22: Connection timed outkhi tôi cố gắng ssh; IP tôi sử dụng cho ssh là 10.0.2.15, theo man qemu-system-x86_64IP được gán cho VM đầu tiên được khởi động nếu IP tĩnh không được chỉ định. Và bây giờ không có kết nối internet trên khách.
việc

Những gì bạn có thể muốn làm là ánh xạ cổng 22 được sử dụng cho ssh trên một cổng khác và sau đó kết nối với nó từ máy chủ để truy cập VM. Tôi đã chỉnh sửa câu trả lời của mình bằng một ví dụ.
mas_kur1

Câu trả lời chỉnh sửa hoạt động hoàn hảo!
dbernard

19

Hãy thử điều này khi khởi chạy qemu -redir tcp:2222::22

$ ssh -p 2222 localhost

Cờ tcp: 2222 :: 22 trong lệnh khởi chạy qemu ánh xạ cổng 2222 của máy chủ sang cổng 22 (cổng ssh mặc định) trên máy ảo.

Sau đó, chỉ cần sshing đến cổng 2222 trên localhost (máy chủ) sẽ chuyển hướng bất kỳ lưu lượng truy cập nào sang cổng ssh 22 trong máy ảo, điều này sẽ cho phép bạn ssh như bình thường so với bất kỳ máy nào khác.


3
Chào mừng bạn đến với Unix & Linux! Chúng tôi đang tìm kiếm câu trả lời dài cung cấp một số giải thích và bối cảnh. Đừng chỉ nói "Hãy thử cái này ..."; giải thích tại sao câu trả lời của bạn là đúng, lý tưởng với trích dẫn. Câu trả lời không bao gồm giải thích có thể được gỡ bỏ.
G-Man nói 'Phục hồi Monica'

3
Tôi chỉ cảm thấy cần phải nói rằng câu trả lời này đã giúp tôi nhiều hơn tất cả các câu trả lời khác ở trên. Không có thông tin thừa và trên hết, nó hoạt động. Hoàn hảo khi hạ cánh từ một truy vấn google "làm thế nào để tôi ssh vào qemu".
Tháng Một

1
Câu trả lời này làm những gì 99,9% mọi người thực sự muốn. Máy chủ nghĩa là có quyền truy cập ssh vào máy ảo, bao gồm khả năng máy chủ sao chép các tệp đến và từ máy ảo bằng scp hoặc tương tự.
null Người dùng

1
Rực rỡ! Lệnh Raspberry Pi của tôi bây giờ trông giống nhưqemu-system-arm -kernel kernel-qemu -cpu arm1176 -m 256 -M versatilepb -no-reboot -append "root=/dev/sda2 panic=1 rootfstype=ext4 rw console=ttyAMA0,115200" -hda 2014-01-07-wheezy-raspbian.img -nographic -redir tcp:2222::22
hăng hái

2
man qemu-system-x86_642.5.0: Lưu ý: Các tùy chọn độc lập cũ -tftp, -bootp, -smb và -redir vẫn được xử lý và áp dụng cho người dùng -net.
Ciro Santilli 心 心

4

Cấu hình OpenSSH được thử nghiệm trên Buildroot 2016.05, máy chủ QEMU 2.5.0, Ubuntu 16.04

Bên cạnh việc chuyển tiếp mạng QEMU, bạn cũng cần thiết lập SSH đúng cách, điều mà tôi sẽ đề cập ở đây.

Bắt đầu với qemu_x86_64_defconfigvà kích hoạt gói openssh:

make qemu_x86_64_defconfig
echo 'BR2_PACKAGE_OPENSSH=y' >> .config
make BR2_JLEVEL=$(nproc)

Sau đó bắt đầu QEMU với:

qemu-system-x86_64 \
  -M pc \
  -append root=/dev/vda \
  -drive file=output/images/rootfs.ext2,if=virtio,format=raw \
  -enable-kvm \
  -kernel output/images/bzImage \
  -m 512 \
  -net nic,model=virtio \
  -net user,hostfwd=tcp::2222-:22

Sau đó vào khách:

vi /etc/ssh/sshd_config

Sửa đổi các cài đặt sau:

PermitRootLogin yes
PermitEmptyPasswords yes

Và khởi động lại máy chủ:

/etc/init.d/S50sshd restart

Đó là vì tệp này tồn tại mà sshd bắt đầu theo mặc định, đây là nguồn: https://github.com/buildroot/buildroot/blob/2018.02/package/openssh/S50sshd và các hoạt động khởi động chính là:

/usr/bin/ssh-keygen -A
/usr/sbin/sshd
touch /var/lock/sshd

Sau đó từ máy chủ:

ssh root@localhost -p 2222

Trong trường hợp thất bại, đầu tiên kiểm tra rằng chuyển tiếp mạng đang hoạt động với một công cụ cấp thấp hơn so với sshd: eg nc -l như được mô tả ở đây .

đồng thời kiểm tra nhật ký máy chủ trên máy khách:

less /var/log/messages

Sau đó, trên hệ thống cuối cùng, bạn nên tự động hóa việc tạo tệp nhật ký đó bằng BR2_ROOTFS_OVERLAYhoặc BR2_ROOTFS_POST_BUILD_SCRIPT: Tùy chỉnh hệ thống tệp đích được tạo | buildroot.org


-1

Tôi tin rằng bạn cần phải sử dụng hostfwd=tcp::7777-:8001hoặchostfwd=tcp::7777:8001

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.