步骤如下:
1. 创建 tap 设备:
sudo ip tuntap add dev tap0 mode tap
2. 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_forward
6.启动虚拟机:
./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 ms