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内のネットワークは2つの部分で構成されています。

  • ゲストに提供される仮想ネットワークデバイス(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でこのアドレスを受信し、eth010.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ネットワークインターフェースの使用に関するコマンドラインの例をご覧ください。

これを行うには、仮想マシン自体を実行しているハイパーバイザーシステムに正しいネットワークが設定されている必要があるため、これらのリソースの一部を仮想マシンに提供できる必要があります(十分なネットワークオプションを含む)。

たとえば、rootとしてこのコマンドを実行すると、仮想マシンに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

その後、2番目のNICをホスト上の既存のブリッジに接続できます。たとえば、LXCも使用されている場合は、次のことができますlxcbr0

ip link set tapn2 master lxcbr0

他の一部のQEMUオプションは、単一のコマンド呼び出しでこれを実行できます。同様に、特権を持つ一部のQEMUヘルパーを使用すると、root以外のユーザーとしてコマンドを再実行できます。

LXCではDHCP(およびDNS)がすでに提供されているため、lxcbr0VMではDHCPが許可されます。

udhcpc -i eth1

ping 8.8.8.8ホストが接続を提供する限り、このような操作も機能します。前の例のようにDNSを手動で設定する必要があります。

もちろん、OpenWRT独自の構成方法を使用する必要があります。

おすすめ記事