写在前面
共享网络的方法:
- 在主机上创建 tap0 虚拟网卡设备,给该设备共享网络;
- qemu 使用主机上 tap0 的网络在虚拟机中创建 eth0 网卡设备;
参考资料:
- 理解 Linux 虚拟网卡设备 tun/tap 的一切
- 《跟唐老师学习云网络》 - 网络命名空间 Network Namespace
- 《跟唐老师学习云网络》 - Veth 网线
- 《跟唐老师学习云网络》 - TUN/TAP 网线
- 《跟唐老师学习云网络》 - Bridge 网桥
- 《跟唐老师学习云网络》 - Docker 网络实现
- 网络分层概述
- Linux网络 - 数据包的接收过程
- Linux网络 - 数据包的发送过程
- Linux虚拟网络设备之tun/tap
- Linux虚拟网络设备之veth
- Linux虚拟网络设备之bridge(桥)
Windows 共享网络
创建 tap0 设备
安装第一个 tap 设备的流程:
-
下载 TAP-Windows
-
安装 TAP-Windows 和驱动
按默认选项安装即可,安装过程会跳出驱动安装界面,点击安装
-
打开 “网络连接” 页面,会发现多出来了一个 “以太网 x” 的设备(驱动是 TAP-Windows Adapter V9),将其更名为 tap0
创建更多 tap 设备的流程:
-
输入
hdwwiz.exe
打开 “添加硬件” 页面 -
手动添加一个网络适配器设备,型号选择 “TAP-Windows Adapter V9”
-
打开 “网络连接” 页面,会发现多出来了一个 “以太网 x” 的设备(驱动是 TAP-Windows Adapter V9 #2)
卸载 tap 设备的流程:
-
打开 “设备管理器”,点击菜单栏 “查看” –> “显示隐藏的设备”;
-
找到网络适配器类别中的 “TAP-Windows Adapter V9”,点击右键 “卸载设备”;
在弹出的窗口中点击 “卸载” 即可,如果后面不再需要用到 tap 设备可以先勾选 “尝试删除驱动”;
qemu 跑一个 armhf 的 debian
下载安装 windows qemu
-
下载 windows qemu 并安装;
-
将 qemu 安装路径添加到用户环境变量 Path 中;
qemu 跑 armhf 的镜像
-
下载 3 个镜像文件到 “D:\armhf_sim”:
-
qemu-img 调整 debian_wheezy_armhf_standard.qcow2 大小:
1
qemu-img resize "D:\armhf_sim\debian_wheezy_armhf_standard.qcow2" 32G
-
powershell 执行 qemu 命令运行下载好的镜像:
1 2 3 4 5 6
qemu-system-arm -M vexpress-a9 ` -kernel "D:\armhf_sim\vmlinuz-3.2.0-4-vexpress" ` -initrd "D:\armhf_sim\initrd.img-3.2.0-4-vexpress" ` -drive if=sd,file="D:\armhf_sim\debian_wheezy_armhf_standard.qcow2" ` -append "root=/dev/mmcblk0p2 console=ttyAMA0" ` -nographic -net nic -net tap,ifname=tap0,script=no,downscript=no
windows 上共享网络给 tap0
-
打开 “网络连接” 页面,在可以上网的适配器上右键 “属性”
-
在共享页面共享网络给 tap0:
共享以后 tap0 设备的 IP 会自动变为 192.168.137.1/24(必须 tap0 在使用的情况下才会有 IP,即开启 qemu 的情况下);
qemu 虚拟机中设置 ip、默认网关、dns
-
登录根文件系统:
用户名/密码为:
root/root
-
设置 ip 和默认网关:
1 2 3
ip address flush dev eth0 ip address add dev eth0 192.168.137.100/24 ip route add default via 192.168.137.1 dev eth0
-
编辑
/etc/resolv.conf
,内容如下:1 2 3
domain mshome.net search mshome.net nameserver 192.168.137.1
-
尝试
ping baidu.com
:
Linux 共享网络
以下内容都是在 WSL2 环境中操作的,虚拟机上也测试过可用(改下网卡名称即可);
创建 tap0 设备
1
2
3
4
5
6
7
8
# 创建一个 tap0 设备
sudo ip tuntap add dev tap0 mode tap
# 开启 tap0 设备
sudo ip link set dev tap0 up
# 设置 tap0 ip 为 192.168.100.1/24
sudo ip address flush dev tap0
sudo ip address add dev tap0 192.168.100.1/24
qemu 跑一个 armhf 的 debian
安装 qemu-system-arm
1
sudo apt install qemu-system-arm
qemu 跑 armhf 的镜像
-
下载 3 个镜像文件:
1 2 3
wget https://people.debian.org/~aurel32/qemu/armhf/vmlinuz-3.2.0-4-vexpress wget https://people.debian.org/~aurel32/qemu/armhf/initrd.img-3.2.0-4-vexpress wget https://people.debian.org/~aurel32/qemu/armhf/debian_wheezy_armhf_standard.qcow2
-
qemu-img 调整 debian_wheezy_armhf_standard.qcow2 大小:
1
qemu-img resize $PWD/debian_wheezy_armhf_standard.qcow2 32G
-
qemu 命令运行下载好的镜像:
1 2 3 4 5 6
qemu-system-arm -M vexpress-a9 \ -kernel $PWD/vmlinuz-3.2.0-4-vexpress \ -initrd $PWD/initrd.img-3.2.0-4-vexpress \ -drive if=sd,file=$PWD/debian_wheezy_armhf_standard.qcow2 \ -append "root=/dev/mmcblk0p2 console=ttyAMA0" \ -nographic -net nic -net tap,ifname=tap0,script=no,downscript=no
linux 上共享网络给 tap0
-
使能 ipv4 内核转发
该命令在机器重启后失效,想要永久生效需要更改 /etc/sysctl.conf 配置;
1 2 3
su - root echo 1 > /proc/sys/net/ipv4/ip_forward exit
-
设置 NAT 转发
1 2 3 4 5
# [可选]清除掉所有的 iptables 规则 sudo iptables -F # 将 192.168.100.0/24 网段数据转发到 eth0 上(出口网卡必须是能上网的接口) sudo iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o eth0 -j MASQUERADE
如果 ubuntu22.04 报 “Chain ‘MASQUERADE’ does not exist” 的问题,可以切换下 iptables 的版本为 “iptables-legacy”,配置命令是
sudo update-alternatives --config iptables
;
qemu 虚拟机中设置 ip、默认网关、dns
-
登录根文件系统:
用户名/密码为:
root/root
-
设置 ip 和默认网关:
1 2 3
ip address flush dev eth0 ip address add dev eth0 192.168.100.100/24 ip route add default via 192.168.100.1 dev eth0
-
编辑
/etc/resolv.conf
,内容如下:1 2
search "" nameserver 8.8.8.8
-
尝试
ping baidu.com
: