单机搭建学习网络

User Mode Linux

Version 1.0

 

 

 

 

 

 

 

 

 

 

 

 

 

Copyleft@ysmonk

20101


目录

... 12
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     常见错误
1      系统简介

如下图所示的网络环境, 最少需要5台工作站才可以搭建起来, 这给网络学习带来极大的障碍, 但是利用User Mode Linux的特性, 就可以在一台工作站上模拟出这个环境.

本文基于Ubuntu Intrepid环境.

 

单机搭建学习网络_休闲
2      快速搭建

文件系统的制作有些繁琐,因此可以直接使用已经创建好的文凭系统和脚本进行测试.

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      准备工作

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, tuntapuml_switch.

slirp方式最简单, 只要安装slirp软件,在启动时指定eth0=slirp,并将UMLip设置为10.0.2.15即可, 但是这个方法只支持TCPUDP,不支持ICMP,因此ping不能主机.

tuntap方式稍微复杂一些, 启动时指定eth0=tuntap,,,192.168.1.201, 这样会在主机上安装一个IP192.168.1.201tap设备,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


4      开始搭建

首先使用uml_switch命令创建三个虚拟交换机, 同时自动在host上生成有一个tap,然后启动五个User Mode Linux,同时连接到虚拟交换机上.

4.1    虚拟交换机

使用uml_switch命令虚拟三台交换机:switch1, switchAswitchB, 其中:

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则通过tap1switch1内的工作站连入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

serverAping serverB, ping 10.0.0.20

serverAping host, ping 10.0.0.1

serverBping serverA, ping 10.0.0.10

serverBping host, ping 10.0.0.1

hostping serverA, ping 10.0.0.10

serverAping Internet, ping www.baidu.com

5.1.2    测试switchA

clientAping serverA, ping 192.168.11.3

serverAping clientA, ping 192.168.11.5

clientAping serverB, ping 10.0.0.20

clientAping host, ping 10.0.0.1

clientAping Internet, ping www.sina.com

5.1.3    测试switchB

serverBping clientB1, ping 192.168.22.3

clientB1ping serverB, ping 192.168.22.1

clientB2ping clientB1, ping 192.168.22.3

clientB2ping serverA, ping 10.0.0.10

clientB1ping host, ping 10.0.0.1

clientB2ping 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内的工作站了

首先在clientB1ping 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上连接serverApptpd服务

sudo pppd call myserver

ifconfig

如果发现ppp0连接,表示×××服务创建成功,然后从clientB1ping clientA成功. clientAping clientB1也成功, clientB1已经成功潜入switchA的网络.


1      常见错误

1)     创建文件系统失败

2)     连接网络失败

3)     NAT转换失败