我们如何将端口转发到端口上已运行服务器的 QEMU?

sho*_*dan 5 qemu virtual-machine portforwarding

我有一个在端口运行的Python服务器28009

python3 -m http.server 28009
Run Code Online (Sandbox Code Playgroud)

现在,在运行服务器后,我调用 QEMU 来转发端口28009

qemu-system-aarch64 -nographic -machine virt,gic-version=max -m 512M -cpu max -smp 4 \
-netdev user,id=vnet,hostfwd=tcp::28009-:28009 -device virtio-net-pci,netdev=vnet \
-drive file=ubuntu-image.img,if=none,id=drive0,cache=writeback -device virtio-blk,drive=drive0,bootindex=0 \
-drive file=flash0.img,format=raw,if=pflash -drive file=flash1.img,format=raw,if=pflash 

Run Code Online (Sandbox Code Playgroud)

它会产生一个错误:

qemu-system-aarch64: Could not set up host forwarding rule 'tcp::28009-:28009'
Run Code Online (Sandbox Code Playgroud)

同样,如果我首先运行上面的 QEMU 脚本,它会正常启动。然而,Python 服务器现在抛出一个错误:

Traceback (most recent call last):
  File "/usr/lib/python3.6/runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "/usr/lib/python3.6/runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "/usr/lib/python3.6/http/server.py", line 1211, in <module>
    test(HandlerClass=handler_class, port=args.port, bind=args.bind)
  File "/usr/lib/python3.6/http/server.py", line 1185, in test
    with ServerClass(server_address, HandlerClass) as httpd:
  File "/usr/lib/python3.6/socketserver.py", line 456, in __init__
    self.server_bind()
  File "/usr/lib/python3.6/http/server.py", line 136, in server_bind
    socketserver.TCPServer.server_bind(self)
  File "/usr/lib/python3.6/socketserver.py", line 470, in server_bind
    self.socket.bind(self.server_address)
OSError: [Errno 98] Address already in use
Run Code Online (Sandbox Code Playgroud)

如何让服务器运行并允许 QEMU 访问该服务器?我无法使用TUN连接,因为我需要让主机的 localhost 与 QEMU 通信,反之亦然。

Pet*_*ell 14

hostfwd 选项用于将来自外部世界的连接转发到在guest虚拟机上运行的服务器。“hostfwd=tcp::HOSTPORT-:GUESTPORT”表示“QEMU 应该在端口 HOSTPORT 上监听主机;每当连接到达那里时,它应该将其转发到来宾的端口 GUESTPORT(希望有一个服务器在那里监听)”。

您似乎正在主机上运行服务器。一台机器上的特定端口上不能有多个设备侦听,因此 python3 服务器程序可以侦听端口 28009 并响应那里的连接,或者 QEMU 可以侦听端口 28009 以响应那里的连接(转发它们)给客人),但不能同时两者兼而有之。无论哪个第二个启动都会抱怨有东西已经在使用该端口。

如果您想在主机上运行服务器并从来宾连接到它,则根本不需要任何 QEMU 选项。QEMU 的“用户模式”网络将允许访客程序向外连接到任何 IP 地址(包括更广泛的互联网,但也可以直接连接到主机),因此,如果您尝试在访客上运行客户端并在主机上运行服务器,则应该只是工作。您可以告诉访客客户端连接到主机的真实 IP 地址,也可以使用特殊的“网关”IP 地址 10.0.2.2,这就是主机在访客看到的虚假网络上的显示方式。

  • 这是人们提问的地方,所以这就是我回答他们的地方。如果您想将它们移至其他地方并且有相应的机制,请随意。 (4认同)
  • 我认为这对那些需要帮助的人以及未来可能有类似问题的人来说都是无益的。请不要这样做。 (4认同)