Skip to content

Instantly share code, notes, and snippets.

@gotnix
Created August 5, 2015 05:47
Show Gist options
  • Save gotnix/1e3d95d729147c44e2ba to your computer and use it in GitHub Desktop.
Save gotnix/1e3d95d729147c44e2ba to your computer and use it in GitHub Desktop.
qemu 的网络桥接和NAT
chaos 的 qemu 技巧 (一) 网络桥接
http://ycool.com/post/sgeq9sf
原始的linux网络桥接 brctl 是很不错的技术,可以将虚拟机的网络和物理网络完好的桥接起来,
但是这个方法在服务器上应该是好的,然而,在桌面环境中,却会遇到一个大问题:
桥接设备如br0 不能跟network manager之类良好兼容,而且桌面机更多时候会跑wifi,这个brctl就更苦了。
所以,经过详细研究,现整理出一套用parprouted + vdeswitch + dhcp-helper +qemu的解决方案。
本方案中,出了 vde_tunctl , parprouted , dhcp-helper几个命令必须有root权限,其他任何步骤不需要root权限,
而且,在虚拟机里面也不会看到发到host machine的数据,基本上来说,安全模型还是比较清晰的。
vde是一个虚拟以太网,通常来说,可以模拟一个交换机,并且可以通过vdetaplib给一个用户进程模拟出一个tap设备出来。
parprouted基本上是一个arp proxy,但这玩意不能代理dhcp请求;
dhcp-helper是一个dhcp relay,可以代理dhcp的。所以要把这俩结合起来。
具体步骤如下:
1. 虚拟机用qemu
export LD_PRELOAD=/usr/lib/vde2/libvdetap.so
export tap0=/home/chaos/kVMs/vde1
kvm -M pc\
-S\
-cpu athlon\
-pidfile kvm.pid\
-net nic\
-net tap,ifname=tap0,script=/bin/true\
-hda /home/chaos/kVMs/toolinux/hda.img\
-m 256M\
-vnc unix:vncsock,server \
-monitor unix:./mntrsock,server\
-daemonize\
-cdrom "/tmp/mini.iso"&
2. 虚拟机的网卡接到一个vde虚拟交换机上
vde_switch -s /home/chaos/kVMs/vde1 -p /home/chaos/kVMs/vde1.pid -daemon -M /home/chaos/kVMs/vde1.mgmt
3. 将tap0 设置给普通用户
vde_tunctl -u chaos -t tap0
4. 将tap0设备tap0接到交换机上
vde_plug2tap -s /home/chaos/kVMs/vde1 tap0
5. 给tap0一个ip地址(理论上应该跟wlan0一样)
6. 用parprouted将tap0和wlan0桥起来
parprouted -d tap0 wlan0
7. 用dhcp-helper转发 dhcp请求
dhcp-helper -d -b wlan0 -i tap0
启动虚拟机后,在虚拟机里面就直接拿到ip地址并ping的通了。
------ 分割线 ------
chaos 的 qemu 技巧 (二)NAT及其他
http://ycool.com/post/th2rtyt
首先鄙视一下jamguo, 这blog居然不支持 chrome.
==我是分隔线==
经过反复实验,发现parprouted 在做arp-proxy的时候,有个小问题,就是在Host Machine上时常不能自动设置路由,导致虚拟机对外不通。
经过详细研究,现确信只要在 tap0设备上设好ip并做好路由,就可以了:
route add -net xxx.xxx.xxx.xxx netmask yyy.yyy.yyyy.yyy dev tap0
这里 xxx.xxx.xxx.xxx/yyy.yyy.yyy.yyy是虚拟机所在子网。
今天要研究是 如何像vmware那样,设好三个网络: bridged, nated, host-only,还要在虚拟机运行时能够手工切换,今天就把在bridge和nat之间切换弄了。
还是用vde。
在上次的vde_swich上,把slirpvde连上来:
slirpvde -D -s ./vde1
接着用 unixterm这个命令连接到 vde的管理端上(这是个unixsocket, unixterm 等价于 sockat - UNIX:sockpath),首先创建两个 vlan :
vlan/create 10
vlan/create 20
然后看一下应该有三个端口:
port/print
会有 例如 0001 是 vde_plug 这其实就是tap0了
0002 是tuntaplib 这就是虚拟机
0003 是slirpvde 就是那个nat的主
然后事情就简单了
port/setvlan 1 10
port/setvlan 3 20
把 tap0和slirpvde放到两个vlan里面去
然后只要
port/setvlan 2 10
就可以让虚拟机通过arpproxy上网
port/setvlan 2 20
就是让虚拟机用slirpvde的nat上网
最后, slirpvde在nat的时候,只能转发tcp/udp数据,rap ip是不能转发的,所以这时候虚拟机ping不出去。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment