NAT under Qemu
When using user-net Qemu behaves as if it was behind a firewall which blocks all incoming connections. You can use a DHCP client to automatically configure the network for the guest OS. Under QEMU 0.7.2 and below using the option
-user-net
or QEMU 0.8.0 and above (you don’t need to specify this any more because it’s actually the default)
-net nic -net user
or if you have no tun/tap init script, Qemu uses a completely user mode network stack (you don’t need root privileges to use the virtual network). The virtual network configuration is the following:
Qemu Virtual Machine <------> Firewall/DHCP server <-----> Internet (10.0.2.x) | (10.0.2.2) | ----> DNS server (10.0.2.3) | ----> SMB server (10.0.2.4)
In order to check that the user mode network is working, you can ping the address 10.0.2.2 and verify that you got an address in the range 10.0.2.x from the Qemu virtual DHCP server. Note that ping is not supported reliably to the internet as it would require root priviledges. It means you can only ping the local router (10.0.2.2). When using the built-in TFTP server, the router (10.0.2.2) is also the TFTP server.
When using the -redir
option, TCP or UDP connections can be redirected from the host to the guest. It allows for example to redirect X11, telnet or SSH connections.
Qemu Bridged Networking
In bridged networking Qemu appears as another host on your LAN, so it has access to the resources on your LAN, and other machines can access services provided by the guest OS. This is in contrast to the above section where the guest is “firewalled” off from your LAN. In the following scenario there is no firewall, so be careful installing potentially vulnerable operating systems (ahem) in a guest where your LAN provides public access, or where you think there may be other compromised machines ‘nearby’.
I use the following script – ran as root – to setup my environment for running Qemu. It starts by turning on IP forwarding so that the guest can traverse the host to the network. Next it creates a bridge device which is called br0. You can see the device using standard tools such as ifconfig. I then add the eth0 device to the bridge. eth0 on my laptop is my standard ethernet network port. Once that’s done I drop the IP address assigned to my eth0 by giving it 0.0.0.0 as an IP address. Finally br0 gets an IP from the DHCP server on my LAN with the dhclient command. I then fudge the rights on the tun device and finally load the kqemu acceleration module and we’re almost ready to run a Virtual Machine.
# Allow IP forwarding echo 1 > /proc/sys/net/ipv4/ip_forward # Setup the bridge brctl addbr br0 # Add host ethernet adapter to the bridge brctl addif br0 eth0 # Remove IP address from host ethernet device ifconfig eth0 0.0.0.0 up # Grab an IP address from DHCP for the bridge dhclient br0 # Allow user access to tun device chmod 666 /dev/net/tun # Create the device for the binary kqemu module mknod /dev/kqemu c 250 c # Make it accessible by all chmod 666 /dev/kqemu # Add the kqemu module modprobe kqemu
Note: If you are using udev, then instead of doing ” chmod 666 /dev/net/tun
” as per the script above, you can add a udev rule to ensure that this mode is set each time you boot. To do this on ubuntu:-
- As root, create a file, called
/etc/udev/local_permission.rules
and add the single line shown here:
KERNEL=="tun", MODE="0666"
cd /etc/udev/rules.d
- Link to the file you created above:
ln -s ../local_permission.rules 010_local_permission.rules
- Issue the
udevstart
command to re-read the udev rules and apply them to your system - Finally
ls -l /dev/net/tun
should confirm that the mode is now set to 666
I start my vm using the command line below QEMU 0.7.2 and below (see further below for QEMU 0.8.0 and above):
qemu -hda win98sehd -enable-audio -boot c -m 64 -localtime -n ./qemu-ifup
Note the mention of qemu-ifup, which is actually a script in the directory where I keep all my virtual disk images. Here it is:
sudo /sbin/ifconfig $1 0.0.0.0 promisc up sudo /usr/sbin/brctl addif br0 $1
The above gets called by Qemu upon startup, so make sure that it’s in place, you should get this message upon starting Qemu:
Connected to host network interface: tun0
If you get this next message then it could be you haven’t specified the -n ./qemu-ifup, or that the permissions on /dev/net/tun are wrong (see above) or something else I haven’t thought of yet.
warning: could not open /dev/net/tun: no virtual network emulation
Under QEMU 0.8.0 and above that might look like this:
qemu -boot c -localtime -m 96 -net nic,vlan=0 -net tap,vlan=0,ifname=tap0,script=./win98if win98sehd
Where the win98if script looks like this:
sudo /sbin/ifconfig $1 0.0.0.0 promisc up sudo /usr/sbin/brctl addif br0 $1
Leave a Reply
You must be logged in to post a comment.