您的位置:首页 > 运维架构 > Linux

[笔记] UserMode Linux 通过Host的eth0连接外网

2014-09-27 13:00 288 查看
编译了一下UserMode Linux(UML),尝试系统Kernel Module的调试,突然突发奇想想让UML连接到网络。

网上找了很多教程,大多是安装一个套件,然后就可以轻松配置了。不过网络应用调用的系统内核基本相同,所以就想直接用Ubuntu 14.04自带的ip,route,iptables来完成这个任务。

当然,编译UserMode Linux不用多说,下个源码包,ARCH=um make menuconfig然后ARCH=um make tar-pkg得到可执行程序linux和一个启动tar包。

先用tar包做一个Initrd文件,find . | cpio -o -H newc | gzip -c > initrd.img

在这之前,要让Linux启动到命令行,下一个busybox源码,static编译,把可执行文件busybox考出来,用ln把init, sh, ln链出来。在initrd.img中,把/etc/init.d/rcS添上mount和mknod让proc sysfs可见,并关联好各个设备包括null,tty等。

下面就是配置网络了,原本我是建立了一个桥,然后照着LXC的网络配置去配,可是发现UML据说不支持veth,只支持TUN/TAP,没办法,就研究下它的配置吧:

在Host(Ubuntu 14.04)上:

# 添加TUN/TAP
ip tuntap add um0tap mode tap
ifconfig um0tap 10.0.1.1 netmask 255.255.255.0 up

# 靠eth0接入外网
iptables -t nat -A POSTROUTING -s 10.0.1.0/24 -o eth0 -j MASQUERADE
echo 1 > /proc/sys/net/ipv4/ip_forward
route add -host 10.0.1.1 dev um0tap
echo 1 > /proc/sys/net/ipv4/conf/um0tap/proxy_arp
arp -Ds 10.0.1.1 eth0 pub


这样直接启动UML: ./linux initrd=initrd.img mem=64M eth0=tuntap,um0tap,,10.0.1.101

在UML里,ln好ifconfig和route:

ifconfig eth0 10.0.1.101 netmask 255.255.255.0 up
ifconfig lo up
route add default gw 10.0.1.1
然后就可以ping通10.0.1.1,Host的192.168.1.0/24和外网的ip了。

后续是个坑爹的问题,用busybox的nslookup死活查不到DNS,比如nslookup www.baidu.com,就是没有结果,但ping百度的ip可以通,纠结了好半天。

一怒把Ubuntu里的glibc库全部复制到initrd,再把nslookup复制进去,运行,可以nslookup了,看来coreutils和busybox的实现还是不一样的,有空再看看源码好了。

到这里UML可以用busybox的httpd架网站了,也可以连外网,运行运行病毒也没啥。

至此,UML支持网络连接就这么解决了。

J.Y.Liu

2014.09.26
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: