【问题标题】:Cannot SSH into QEMU virtual machine running dropbear sshd无法通过 SSH 连接到运行 dropbear sshd 的 QEMU 虚拟机
【发布时间】:2019-09-12 09:41:57
【问题描述】:

我已经设置了一个模拟 vexpress-a9 机器的 QEMU 虚拟机。我使用 buildroot 来创建 initrd 系统,并使用 buildroot 下载的 codesourcery 交叉编译器作为编译 Linux 内核的设置的一部分。这就是我调用 qemu 的方式

qemu-system-arm -m 512 -M vexpress-a9 -dtb linux-4.4.192/arch/arm/boot/dts/vexpress-v2p-ca9.dtb -kernel linux-4.4.192/arch/arm/boot/zImage -initrd buildroot/output/images/rootfs.cpio -append "console=ttyAMA0,ip=dhcp" -net nic,model=lan9118 -net user,hostfwd=tcp::2222-:22 -nographic

它启动得很好。与网络相关的启动消息,表明网络已初始化并且 dropbear sshd 已启动并运行:

Starting network: OK Starting dropbear sshd: random: dropbear: uninitialized urandom read (32 bytes read, 1 bits of entropy available) OK

但是,eth0 接口必须手动分配 IP。我在与我的 Linux 主机相同的子网中为其分配了一个未使用的 C 类地址,如下所示:

# ifconfig eth0 192.168.160.150 up smsc911x 4e000000.ethernet eth0: SMSC911x/921x identified at 0xa12a0000, IRQ: 31

所以ifconfig 现在显示:

# ifconfig
eth0      Link encap:Ethernet  HWaddr 52:54:00:12:34:56
          inet addr:192.168.160.150  Bcast:192.168.160.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
          Interrupt:31

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

netstat 告诉我我们正在监听 22 端口:

# netstat -tln
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN

我什至可以像这样通过 ssh 进入本地主机:

# ssh root@127.0.0.1
random: ssh: uninitialized urandom read (32 bytes read, 24 bits of entropy available)
random: dropbear: uninitialized urandom read (32 bytes read, 24 bits of entropy available)
random: dropbear: uninitialized urandom read (32 bytes read, 24 bits of entropy available)
random: dropbear: uninitialized urandom read (32 bytes read, 24 bits of entropy available)

Host '127.0.0.1' is not in the trusted hosts file.
(ecdsa-sha2-nistp256 fingerprint sha1!! de:cf:f8:b3:ac:4d:96:47:22:d7:76:a1:ea:11:3d:bc:ec:c6:71:9a)
Do you want to continue connecting? (y/n) y
root@127.0.0.1's password:
random: dropbear: uninitialized urandom read (32 bytes read, 26 bits of entropy available)

当我尝试从 linux 主机通过 SSH 连接到这个虚拟机时,我在主机上看到了这个:

$ ssh -vvv root@192.168.160.150
OpenSSH_7.4p1 Debian-10+deb9u7, OpenSSL 1.0.2s  28 May 2019
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 19: Applying options for *
debug2: resolving "192.168.160.150" port 22
debug2: ssh_connect_direct: needpriv 0
debug1: Connecting to 192.168.160.150 [192.168.160.150] port 22.
debug1: connect to address 192.168.160.150 port 22: No route to host
ssh: connect to host 192.168.160.150 port 22: No route to host

我很高兴能得到一些关于这方面的建议,因为我找不到其他可以尝试的方法

更新 1: 在配置 buildroot 时包含 dhcpd。现在无论我使用 dropbear 还是 openssh,日志消息都会显示到

Starting dhcpcd...
no interfaces have a carrier <--- the problem
forked to background, child pid 746
smsc911x 4e000000.ethernet eth0: SMSC911x/921x identified at 0xa12a0000, IRQ: 31
Starting dropbear sshd: random: dropbear: uninitialized urandom read (32 bytes read, 2 bits of entropy available)
OK
random: dhcpcd: uninitialized urandom read (120 bytes read, 2 bits of entropy available)

此时它只是停止了,我看不到登录提示。删除dhcpd 并使用dropbear 或openssh 后,我可以再次看到登录提示(意味着所有初始化脚本都运行完成)但再次没有任何类型的连接。我不明白为什么 dhcpd 认为我们没有载体(当它能够枚举和识别模拟的 NIC 卡时)

UPDATE2:我尝试手动调用 udhcpc 以通过 DHCP 获取地址,它确实获得了地址

# udhcpc -S -a100
udhcpc: started, v1.31.0
udhcpc: sending discover
udhcpc: sending select for 10.0.2.15
udhcpc: lease of 10.0.2.15 obtained, lease time 86400
deleting routers
adding dns 10.0.2.3
# ifconfig
eth0      Link encap:Ethernet  HWaddr 52:54:00:12:34:56
          inet addr:10.0.2.15  Bcast:10.0.2.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:4 errors:0 dropped:0 overruns:0 frame:0
          TX packets:5 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:2360 (2.3 KiB)  TX bytes:1428 (1.3 KiB)
          Interrupt:31

但是主机仍然无法访问该机器。我是否需要从主机添加到此 VM 的手动路由?如果是,我该怎么做? QEMU 是否在主机上创建虚拟接口(像工作站一样)?

【问题讨论】:

    标签: arm embedded embedded-linux qemu dropbear


    【解决方案1】:

    如果您使用 QEMU 的“用户”模式网络,那么尝试在主机网络中为访客分配 IP 地址是错误的。用户模式网络使用自己的 DHCP 服务器创建一个小型模拟网络——您可以在 https://wiki.qemu.org/Documentation/Networking#User_Networking_.28SLIRP.29 看到这个图表

    默认情况下来宾所在的网络是 10.0.2.x,但您可以使用命令行参数进行更改。

    配置来宾最简单的方法是让它运行一个 DHCP 客户端,它应该能够找到 QEMU 为其提供的内置 DHCP 服务器,并通过这种方式获得模拟网络上的 IP 地址。

    关于用户模式网络的重要一点是,它确实允许您通常直接从主机连接到来宾虚拟机。连接到它的唯一方法是,如果您的 QEMU 命令行指定要从主机转发到来宾的特定端口 - 如果您这样做,那么您可以连接到您在命令行转发选项中指定的主机 IP 地址和端口并将其转发到模拟网络上的访客 IP 地址和端口。

    如果这还不够,并且您需要虚拟机出现在桥接到主机网络的真实虚拟接口上,那么您应该停止使用用户模式网络并改为查看 TAP 网络选项。然而,TAP 的设置更加复杂。

    【讨论】:

    • 在内核命令行参数中没有传递'ip=dhcp'来告诉客户从内置的dhcp服务器(在这种情况下由qemu提供)寻找地址??那么为什么 dmesg 不告诉我们任何相关信息呢?还有为什么界面还没有地址呢??
    • 请查看更新,如果我的方向正确,请告诉我
    • ip=dhcp 是否正常工作或接口是否默认出现是客户操作系统/发行版配置问题——由客户内部的软件使用 QEMU 提供的模拟硬件做正确的事情它。
    • 根据我的更新 2,接口通过内置的 qemu dhcp 服务器获取 IP 地址。它仍然无法从外部访问。你知道如何让虚拟机可以访问吗??
    • 我在回答中添加了几段关于此的内容——基本上,如果您在命令行中有正确的 hostfwd 选项,那么主机上的 'ssh -p 2222 localhost' 应该将您连接到端口 22在客人身上。
    【解决方案2】:

    我昨天花了几个小时尝试使用 qemu-system-arm 的不同选项(即 -net-netdev),但最终起作用的是这个选项:-nic user,hostfwd=::2222-:22 我从 removed features page 列表中学到的(查看替换-redir 选项)。我还必须在主机的 SSH 配置文件中添加以下 3 行:/etc/ssh/ssh_config

    Host localhost
    PreferredAuthentications=password
    PubkeyAuthentication=no
    

    【讨论】:

      猜你喜欢
      • 2022-01-13
      • 2013-07-01
      • 1970-01-01
      • 2016-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多