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

问题描述 投票:0回答:1

我有一个在端口

28009
运行的 Python 服务器:

python3 -m http.server 28009

现在,运行服务器后,我调用 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 

它会产生一个错误:

qemu-system-aarch64: Could not set up host forwarding rule 'tcp::28009-:28009'

同样,如果我先运行上面的 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

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

virtual-machine qemu portforwarding
1个回答
12
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.