步骤如下:
1. 创建 tap 设备:
sudo ip tuntap add dev tap0 mode tap2. enable tap0接口:
sudo ip link set tap0 up 3. 添加路由: sudo ip route add 192.168.0.10/32 dev tap0或者用旧的命令: sudo route add -host 192.168.1.10 tap0 $ route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 192.168.0.1 0.0.0.0 UG 0 0 0 wlp3s0 169.254.0.0 0.0.0.0 255.255.0.0 U 1000 0 0 wlp3s0 192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 wlp3s0 192.168.0.1 0.0.0.0 255.255.255.255 UH 50 0 0 wlp3s0 192.168.0.10 0.0.0.0 255.255.255.255 UH 0 0 0 tap0 $ ip link show 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 2: enp0s25: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000 link/ether 00:21:cc:5d:29:ee brd ff:ff:ff:ff:ff:ff 3: wlp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DORMANT group default qlen 1000 link/ether ec:55:f9:bf:7c:16 brd ff:ff:ff:ff:ff:ff 15: tap0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN mode DEFAULT group default qlen 1000 link/ether da:47:87:2c:25:4d brd ff:ff:ff:ff:ff:ff $ ip address show 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: enp0s25: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000 link/ether 00:21:cc:5d:29:ee brd ff:ff:ff:ff:ff:ff 3: wlp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000 link/ether ec:55:f9:bf:7c:16 brd ff:ff:ff:ff:ff:ff inet 192.168.0.101/24 brd 192.168.0.255 scope global wlp3s0 valid_lft forever preferred_lft forever inet6 fe80::ee55:f9ff:febf:7c16/64 scope link valid_lft forever preferred_lft forever 15: tap0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000 link/ether da:47:87:2c:25:4d brd ff:ff:ff:ff:ff:ff这样,任何目标地址为 192.168.1.10的包都会被 route到tap0.4. 使用 ARP proxy:
sysctl net.ipv4.conf.tap0.proxy_arp=1 sysctl net.ipv4.conf.wlp3s0.proxy_arp=1或者: echo 1 > /proc/sys/net/ipv4/conf/tap0/proxy_arp echo 1 > /proc/sys/net/ipv4/conf/wlp3s0/proxy_arp 5. Enable IP forwarding sysctl net.ipv4.ip_forward=1 或者: echo 1 > /proc/sys/net/ipv4/ip_forward6.启动虚拟机:
./qemu-2.8.0/arm-softmmu/qemu-system-arm -M vexpress-a9 -m 1024 -smp 4 -kernel ./linux-4.9.13/arch/arm/boot/zImage -sd rootfs.img -append "root=/dev/mmcblk0 rw rootfs=ext4 rootdelay=3 physmap.enabled=0 console=ttyAMA0 console=tty0" -dtb ./linux-4.9.13/arch/arm/boot/dts/vexpress-v2p-ca9.dtb -netdev tap,id=mytest,ifname=tap0,scripts=no,downscript=no -device virtio-net-device,netdev=mytest -nographic 然后,设置虚拟机IP地址: ip addr add 192.168.0.10 dev eth0添加路由: ip route add default via 192.168.0.101 dev eth0设置和主机一样的nameserver: cat >> /etc/resolv.conf nameserver 192.168.0.1 Ctrl-D #ping www.baidu.com PING www.baidu.com (112.80.248.73): 56 data bytes 64 bytes from 112.80.248.73: seq=0 ttl=58 time=11.177 ms 64 bytes from 112.80.248.73: seq=1 ttl=58 time=10.293 ms ^C --- www.baidu.com ping statistics --- 2 packets transmitted, 2 packets received, 0% packet loss round-trip min/avg/max = 10.293/10.735/11.177 mshttps://forums.gentoo.org/viewtopic-t-987790-start-0.html