Created
August 5, 2015 05:47
-
-
Save gotnix/1e3d95d729147c44e2ba to your computer and use it in GitHub Desktop.
qemu 的网络桥接和NAT
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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