QEMU에서 인터넷 연결을 전달하는 방법은 무엇입니까?

QEMU에서 인터넷 연결을 전달하는 방법은 무엇입니까?

시작 방법에 대한 설명을 따르세요.QEMU를 사용하는 OpenWrt 가상 머신, 다운로드했습니다MIPS 코어다음으로 시작하세요.

qemu-system-mips -kernel openwrt-22.03.3-malta-be-vmlinux-initramfs.elf -nographic -m 256

그러나 가상 머신에는 인터넷 연결이 없습니다.

root@(none):/# ping google.com
ping: bad address 'google.com'

QEMU로 호스트 인터넷 연결을 사용하는 방법은 무엇입니까?

편집하다

의견에서 제안한 대로 pingICMP를 사용하므로 작동하지 않습니다. 그러나 wget사용시 다음과 같은 오류가 발생합니다.

root@OpenWrt:~# wget http://google.com/
Downloading 'http://google.com/'
Failed to send request: Operation not permitted

네트워크 구성은 다음과 같습니다.

root@OpenWrt:~# ifconfig
br-lan    Link encap:Ethernet  HWaddr 52:54:00:12:34:56
          inet addr:192.168.1.1  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: fe80::5054:ff:fe12:3456/64 Scope:Link
          inet6 addr: fd02:a553:49cb::1/60 Scope:Global
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:3 errors:0 dropped:0 overruns:0 frame:0
          TX packets:17 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:1248 (1.2 KiB)  TX bytes:2822 (2.7 KiB)

eth0      Link encap:Ethernet  HWaddr 52:54:00:12:34:56
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:3 errors:0 dropped:0 overruns:0 frame:0
          TX packets:17 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:1290 (1.2 KiB)  TX bytes:2822 (2.7 KiB)
          Interrupt:10 Base address:0x1060

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:528 errors:0 dropped:0 overruns:0 frame:0
          TX packets:528 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:40288 (39.3 KiB)  TX bytes:40288 (39.3 KiB)

답변1

OP는 네트워크 설정을 제공하지 않았기 때문에:

qemu-system-mips -kernel openwrt-22.03.3-malta-be-vmlinux-initramfs.elf -nographic -m 256

그러면 에 설명된 대로 최소 사용자 모드가 선택됩니다.QEMU의 네트워크 기본:

QEMU 내의 네트워크는 두 부분으로 구성됩니다.

  • 게스트에게 제공되는 가상 네트워크 장치(예: PCI 네트워크 카드)입니다.
  • 에뮬레이트된 NIC와 상호 작용하는 네트워크 백엔드입니다(예: 호스트 네트워크에 패킷 넣기).

각 섹션에는 일련의 옵션이 있습니다.-net nic -net user기본적으로 QEMU는 명령줄에 입력하는 대로 게스트를 위한 SLiRP 사용자 네트워크 백엔드와 적절한 가상 네트워크 장치(예: 대부분의 x86 PC 게스트용 E1000 PCI 카드)를 생성합니다.

이것사용자 모드 네트워크VM의 관점에서 보면 다음과 같습니다.

guest (10.0.2.15)  <------>  Firewall/DHCP server <-----> Internet
                      |          (10.0.2.2)
                      |
                      ---->  DNS server (10.0.2.3)
                      |
                      ---->  SMB server (10.0.2.4)

QEMU는 TCP, UDP 및 일부 서버를 처리할 수 있지만 DHCP 및 DNS 서버는 처리할 수 없습니다. 특히 이것은 ICMP를 처리하지 않습니다.

참고 - (기본) SLiRP 사용자 네트워크를 사용하는 경우 ping (ICMP)는 작동하지 않지만 TCP 및 UDP는 작동합니다.ping QEMU 네트워크 구성을 테스트 하려고 시도하지 마십시오 .!

이는 패킷을 추적하고 호스트의 소켓을 사용하여 가상 머신의 동작을 에뮬레이트함으로써 이를 수행합니다. 가상 머신이 패킷을 보낼 때 QEMU는 소켓을 열어 동일한 패킷을 보냅니다(물론 더 복잡한 것은 TCP입니다). 실제로 가상 머신의 소스 IP 주소는 대부분 무시됩니다.

가상 머신의 운영 체제는 라우터를 실행하도록 설계되었기 때문에 이를 인식하지 못하고 다음과 같은 기본 설정을 따릅니다.

  • DHCP를 사용하지 않음
  • eth0브리지 포트로 설정br-vlan
  • 고정 IP 주소 할당 br-vlan: 192.168.1.1/24

기본 경로가 없기 때문에 가상 머신은 통신을 시도하지 않습니다. 즉, 사용 가능한 경로가 없다는 것을 알고 있습니다.

DHCP를 사용하는 경우 10.0.2.15/24에서 이 주소를 수신 eth0하고 10.0.2.2를 게이트웨이에 대한 기본 경로로 사용합니다. 이는 사용자 모드 네트워크 스택 에뮬레이션에서 사용되는 기본값입니다.

따라서 현재 설정에서 올바른 게이트웨이를 사용하여 이러한 기본 경로를 실행하는 최소한의 해당 명령은 다음과 같습니다.

ip route add default via 10.0.2.2 dev br-lan onlink

( onlink먼저 10.0.2.2에 경로를 추가하는 단계를 건너뜁니다.) eth0을 먼저 삭제하면 동일한 작업을 수행할 수 있습니다 br-lan.

ip link del br-lan

그런 다음:

root@OpenWrt:/# udhcpc -i eth0
udhcpc: started, v1.35.0
udhcpc: broadcasting discover
udhcpc: broadcasting select for 10.0.2.15, server 10.0.2.2
udhcpc: lease of 10.0.2.15 obtained from 10.0.2.2, lease time 86400
udhcpc: ip addr add 10.0.2.15/255.255.255.0 broadcast + dev eth0
udhcpc: setting default routers: 10.0.2.2

이것은 DNS를 구성하지 않습니다( udhcpc너무 제한적인 것 같습니다). 추가로:

echo nameserver 10.0.2.3 > /etc/resolv.conf

이제 다음 작업이 허용됩니다.

root@OpenWrt:/# wget http://google.com/
Downloading 'http://google.com/'
Connecting to 142.250.76.110:80
Redirected to / on www.google.com
Writing to 'index.html'

이것은 그리 멀리 가지 않을 것입니다. 이렇게 하면 라우터 기능을 테스트할 수 없습니다.


더 중요한 것은 네트워크의 모든 부분이 완벽하게 구성되어 있어야 하며, 전체 사용을 위해 가상 머신에 여러 개의 네트워크 카드를 제공할 수도 있다는 것입니다. QEMU 문서에서 자세한 내용을 읽어보세요. 반드시 사용해야 합니다TAP 네트워크 백엔드. 이건 이해가 필요해구성 방법:

바라보다기도하다TAP 네트워크 인터페이스 사용에 대한 명령줄 예시를 확인하세요.

이를 위해서는 가상 머신 자체를 실행하는 하이퍼바이저 시스템에 올바른 네트워크가 구성되어 있어야 하며, 따라서 이러한 리소스 중 일부를 가상 머신에 제공할 수 있어야 합니다(충분한 네트워크 옵션 포함).

예를 들어 루트로 이 명령을 실행하면 가상 머신에 2개의 NIC가 제공됩니다.

qemu-system-mips \
    -kernel openwrt-22.03.3-malta-be-vmlinux-initramfs.elf \
    -netdev tap,id=n1,ifname=tapn1 -device pcnet,netdev=n1 \
    -netdev tap,id=n2,ifname=tapn2 -device pcnet,netdev=n2 \
    -nographic -m 256

그런 다음 두 번째 NIC를 호스트의 기존 브리지에 연결할 수 있습니다. 예를 들어 LXC도 사용되는 경우 다음을 수행할 수 있습니다 lxcbr0.

ip link set tapn2 master lxcbr0

일부 다른 QEMU 옵션은 단일 명령 호출로 이를 수행할 수 있습니다. 마찬가지로 권한이 있는 일부 QEMU 도우미를 사용하면 루트가 아닌 사용자로 명령을 다시 실행할 수 있습니다.

LXC에서는 DHCP(및 DNS)가 이미 제공되므로 lxcbr0VM에서는 DHCP가 허용됩니다.

udhcpc -i eth1

ping 8.8.8.8호스트가 연결을 제공하는 한 이와 같은 작업도 작동합니다. 이전 예와 같이 DNS를 수동으로 구성해야 합니다.

물론 OpenWRT 고유의 구성 방법을 사용해야 합니다.

관련 정보