单机搭建学习网络
User Mode Linux
Version 1.0
Copyleft@ysmonk
2010年1月
1 系统简介... 1
2 快速搭建... 2
2.1 准备工具和软件... 2
2.2 运行... 2
3 准备工作... 3
3.1 预备知识... 3
3.1.1 user-mode-linux. 3
3.1.2 uml_net 3
3.1.3 screen命令... 3
3.2 安装软件... 3
3.3 制作文件系统... 3
4 开始搭建... 5
4.1 虚拟交换机... 5
4.2 定制文件系统... 5
4.2.1 serverA. 5
4.2.2 serverB. 5
4.2.3 clientA. 6
4.2.4 clientB1. 6
4.2.5 clientB2. 6
4.3 实现NAT. 7
4.3.1 设置serverA. 7
4.3.2 设置serverB. 7
4.3.3 设置host 7
5 测试... 9
5.1 测试交换机... 9
5.1.1 测试switch1. 9
5.1.2 测试switchA. 9
5.1.3 测试switchB. 9
5.2 测试NAT. 9
5.2.1 clientA. 9
5.2.2 clientB. 10
5.3 高级测试... 10
5.3.1 测试×××.. 10
6 常见错误
如下图所示的网络环境, 最少需要5台工作站才可以搭建起来, 这给网络学习带来极大的障碍, 但是利用User Mode Linux的特性, 就可以在一台工作站上模拟出这个环境.
本文基于Ubuntu Intrepid环境.
文件系统的制作有些繁琐,因此可以直接使用已经创建好的文凭系统和脚本进行测试.
2.1 准备工具和软件
sudo apt-get install uml_utilities user-mode-linux
wget ftp://cbib.cnkk.org/incomming/hank-fs-AS
wget ftp://cbib.cnkk.org/incomming/hank-fs-BS
wget ftp://cbib.cnkk.org/incomming/hank-fs-A1
wget ftp://cbib.cnkk.org/incomming/hank-fs-B1
wget ftp://cbib.cnkk.org/incomming/hank-fs-B2
wget ftp://cbib.cnkk.org/incomming/simnet.sh
chmod +x simnet.sh
2.2 运行
sudo –i
./simnet.sh
现在网络已经启动,可以通过以下命令进入相应的模拟设备操作界面.从而进行第5节的测试.
命令 |
虚拟设备 |
screen –r sw1 |
Switch 1 |
screen –r swA |
Switch A |
screen –r swB |
Switch B |
screen –r vmAS |
Server A |
screen –r vmBS |
Server B |
screen –r vmA1 |
Client A |
screen –r vmB1 |
Client B1 |
screen –r vmB2 |
Client B2 |
3.1 预备知识
3.1.1 user-mode-linux
User-mode-linux (UML) 是让一个Linux作为一个独立进程运行在另一个linux上。
UML 是一种在同一时间运行多Linux 的安全方式。每个进程都是独立去其他的,这非常安全,例如在同一机器上进行多种测试和研发而不互相干扰。如果一些测试进程损坏并不会影响宿主系统或研发用进程。
3.1.2 uml_net
User Mode Linux连接网络有三种方式,分别是slirp, tuntap和uml_switch.
slirp方式最简单, 只要安装slirp软件,在启动时指定eth0=slirp,并将UML的ip设置为10.0.2.15即可, 但是这个方法只支持TCP和UDP,不支持ICMP,因此ping不能主机.
tuntap方式稍微复杂一些, 启动时指定eth0=tuntap,,,192.168.1.201, 这样会在主机上安装一个IP为192.168.1.201的tap设备,UML中设置同一网段的IP即可.
uml_switch的方法最为强大, uml_switch命令会创建一个虚拟交换机,并在主机上安装一个tap设备, 如uml_switch –tap tap1 –unix /tmp/switch1, 将会生成tap1设备和虚拟交换机/tmp/switch1, UML只要指定eth0=daemon,,unix,/tmp/switch1即可连上指定的交换机.
3.1.3 screen命令
使用screen命令,可以在一个putty上完成所有这些操作,下面这个命令的意思是:
在后台启动一个screen, 名称为<screenName>, 并在启动的screen上执行<command>命令
screen –S <screenName> -d –m <command>
例如
screen –S vmA1 –d –m linux ubd0=hank-fs-A1 eth0=daemon,,unix,/tmp/switchA
3.2 安装软件
sudo apt-get install uml_utilities user-mode-linux iptables
3.3 制作文件系统
#以下命令都使用root帐户操作
#1. 创建映像文件,并格式文件系统
dd if=/dev/zero of=hank-fs bs=1024K count=400
mkfs.ext3 hank-fs
#2.1 加载基本文件
mount -o loop hank-fs /mnt
debootstrap --arch=i386 intrepid /mnt http://debian.ustc.edu.cn/ubuntu
#2.2. 拷贝modules到文件系统
cp -r /usr/lib/uml/modules/* /mnt/lib/modules/
#3. 定制网络 文件系统 终端 用户
chroot /mnt
#3.1 网络 /etc/network/interface
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
address 192.168.1.2
netmask 255.255.255.0
gateway 192.168.1.1
#3.2 文件 /etc/fstab
/dev/ubda / ext3 defaults 0 1
proc /proc proc defaults 0 0
#3.3 终端 /etc/default/console-setup, 注释掉这下面一句
#ACTIVE_CONSOLE=tty[1-6]
cd /etc/event.d/
rm tty[2-6]
mv tty1 tty0
#/etc/event.d/tty0 的最后一行,将tty1改为tty0
exec /sbin/getty 38400 tty0
#3.4 创建用户,并加入sudoers
adduser hankjin
#修改/etc/sudoers
root ALL=(ALL) ALL
hankjin ALL=(ALL) ALL
首先使用uml_switch命令创建三个虚拟交换机, 同时自动在host上生成有一个tap,然后启动五个User Mode Linux,同时连接到虚拟交换机上.
4.1 虚拟交换机
使用uml_switch命令虚拟三台交换机:switch1, switchA和switchB, 其中:
switch1的网络为10.0.0.0/24,启动方式为
sudo uml_switch –tap tap1 –unix /tmp/switch1
switchA的网络为192.168.11.0/24,启动方式为
sudo uml_switch –tap tapA –unix /tmp/switchA
switchB的网络为192.168.22.0/24,启动方式为:
sudo uml_switch –tap tapB –unix /tmp/switchB
4.2 定制文件系统
User Mode Linux支持Copy On Write技术, 可以xxx,但是这里为了简化环境,直接将上面制作的hank-fs拷贝一个复本即可, 因此, 对每个User Mode Linux,我们都先拷贝一个复本出来.
4.2.1 serverA
首先从hank-fs拷贝一个复本 cp hank-fs hank-fs-AS
serverA有两个网卡,一个连接switch1(eth0),一个连接switchA(eth1),因此启动serverA的命令为
linux ubd0=hank-fs-AS eth0=daemon,,unix,/tmp/switch1 eth1=daemon,,unix,/tmp/switchA
启动后设置serverA的网络, sudo vi /etc/network/interface:
auto eth0
iface eth0 inet static
address 10.0.0.10
netmask 255.255.255.0
gateway 10.0.0.1
auto eth1
iface eth1 inet static
address 192.168.11.3
netmask 255.255.255.0
4.2.2 serverB
首先从hank-fs拷贝一个复本 cp hank-fs hank-fs-BS
serverB有两个网卡,一个连接switch1(eth0),一个连接switchA(eth1),因此启动serverB的命令为
linux ubd0=hank-fs-BS eth0=daemon,,unix,/tmp/switch1 eth1=daemon,,unix,/tmp/switchB
启动后设置serverB的网络, sudo vi /etc/network/interface:
auto eth0
iface eth0 inet static
address 10.0.0.20
netmask 255.255.255.0
gateway 10.0.0.1
auto eth1
iface eth1 inet static
address 192.168.22.1
netmask 255.255.255.0
4.2.3 clientA
首先从hank-fs拷贝一个复本 cp hank-fs hank-fs-A1
clientA有一个网卡,连接switchA(eth0),因此启动clientA的命令为
linux ubd0=hank-fs-A1 eth0=daemon,,unix,/tmp/switchA
启动后设置clientA的网络, sudo vi /etc/network/interface:
auto eth0
iface eth0 inet static
address 192.168.11.5
netmask 255.255.255.0
gateway 192.168.11.3
4.2.4 clientB1
首先从hank-fs拷贝一个复本 cp hank-fs hank-fs-B1
ClientB1有一个网卡,连接switchB(eth0),因此启动clientB1的命令为
linux ubd0=hank-fs-B1 eth0=daemon,,unix,/tmp/switchB
启动后设置clientB1的网络, sudo vi /etc/network/interface:
auto eth0
iface eth0 inet static
address 192.168.22.3
netmask 255.255.255.0
gateway 192.168.22.1
4.2.5 clientB2
首先从hank-fs拷贝一个复本 cp hank-fs hank-fs-B2
ClientB2有一个网卡,连接switchB(eth0),因此启动clientB2的命令为
linux ubd0=hank-fs-B2 eth0=daemon,,unix,/tmp/switchB
启动后设置clientB2的网络, sudo vi /etc/network/interface:
auto eth0
iface eth0 inet static
address 192.168.22.5
netmask 255.255.255.0
gateway 192.168.22.1
4.3 实现NAT
Server A负责将switchA内的工作站连入switch1的网络.
Server A负责将switchA内的工作站连入switch1的网络
Host则通过tap1将switch1内的工作站连入host的网络
4.3.1 设置serverA
编辑serverA的启动脚本,sudo vi /etc/rc.local,sudo /etc/rc.local
iptables -F INPUT
iptables -F OUTPUT
iptables -F FORWARD
iptables -t nat -F POSTROUTING
iptables -t nat -F PREROUTING
iptables -t nat -A POSTROUTING -o eth0 -s 192.168.11.0/24 -j MASQUERADE
4.3.2 设置serverB
编辑serverB的启动脚本,sudo vi /etc/rc.local,sudo /etc/rc.local
iptables -F INPUT
iptables -F OUTPUT
iptables -F FORWARD
iptables -t nat -F POSTROUTING
iptables -t nat -F PREROUTING
iptables -t nat -A POSTROUTING -o eth0 -s 192.168.22.0/24 -j MASQUERADE
4.3.3 设置host
有host系统上设置tap1的转发功能,从而使学习网络的所有主机都可以连入互联网.
#!/bin/bash
sudo ifconfig tap1 10.0.0.1 netmask 255.255.255.0
echo "echo 1 > /proc/sys/net/ipv4/ip_forward" | sudo sh
sudo iptables -F INPUT
sudo iptables -F OUTPUT
sudo iptables -F FORWARD
sudo iptables -t nat -F POSTROUTING
sudo iptables -t nat -F PREROUTING
sudo iptables -t nat -A POSTROUTING -o eth0 -s 10.0.0.0/24 -j MASQUERADE
5 测试
5.1 测试交换机
5.1.1 测试switch1
在serverA上ping serverB, ping 10.0.0.20
在serverA上ping host, ping 10.0.0.1
在serverB上ping serverA, ping 10.0.0.10
在serverB上ping host, ping 10.0.0.1
在host上ping serverA, ping 10.0.0.10
在serverA上ping Internet, ping www.baidu.com
5.1.2 测试switchA
在clientA上ping serverA, ping 192.168.11.3
在serverA上ping clientA, ping 192.168.11.5
在clientA上ping serverB, ping 10.0.0.20
在clientA上ping host, ping 10.0.0.1
在clientA上ping Internet, ping www.sina.com
5.1.3 测试switchB
在serverB上ping clientB1, ping 192.168.22.3
在clientB1上ping serverB, ping 192.168.22.1
在clientB2上ping clientB1, ping 192.168.22.3
在clientB2上ping serverA, ping 10.0.0.10
在clientB1上ping host, ping 10.0.0.1
在clientB2上ping Internet, ping www.sina.com
5.2 测试NAT
5.2.1 clientA
clientA-serverB
clientA-host
clientA-internet
5.2.2 clientB
clientB1-serverA
clientB1-host
clientB2-internet
5.3 高级测试
5.3.1 测试×××
例如我们想让clientB连入switchA的网络,可以在serverA上安装pptpd服务, 在clientB上安装pptp客户端,然后clientB就可以访问switchA内的工作站了
首先在clientB1上ping clientA, 不能ping通, 接下来开始配置×××
首先在serverA上配置×××服务器:
在serverA上, sudo apt-get install pptpd, 然后配置分配的IP和用户帐户:
sudo vi /etc/pptpd.conf
localip: 192.168.11.20
remoteip: 192.168.11.21-29
sudo vi /etc/ppp/chap-secrets
hankjin * hjz *
sudo /etc/init.d/pptpd restart
然后在clientB1上配置×××客户端
sudo apt-get install pptp-linux
sudo vi /etc/ppp/chap-secrets
hankjin mypptp hjz *
sudo vi /etc/ppp/peers/myserver
pty "pptp 10.0.0.10 --nolaunchpppd"
#mppe required,stateless
name hankjin
remotename mypptp
require-pap
refuse-mschap
require-mschap-v2
require-mppe-128
proxyarp
lock
nobsdcomp
novj
novjccomp
nologfd
debug
#ipparam pptp:XXXX
# do not require the server to authenticate to our client
noauth
persist
最后在clientB1上连接serverA的pptpd服务
sudo pppd call myserver
ifconfig
如果发现ppp0连接,表示×××服务创建成功,然后从clientB1上ping clientA成功. 从clientA上ping clientB1也成功, clientB1已经成功潜入switchA的网络.
1 常见错误
1) 创建文件系统失败
2) 连接网络失败
3) NAT转换失败