这是本文档旧的修订版!
用KVM虚拟机模拟网络环境
在KVM环境下,每个虚拟网络就好比是一台网络交换机(参见:CentOS 6下KVM环境的安装和配置),我们可以创建一些虚拟网络,并将虚拟机的一个或多个网络接口映射到相应的虚拟网络,就可以模拟一个网络环境。
本文就依据这个思路来模拟一个较为复杂的网络,用于开发测试。虚拟机操作系统使用slackware 14.0。
网络拓扑
模拟的网络拓扑结构:
图中的交换机就是虚拟网络,包括一个桥接(Bridged)模式的虚拟网络和九个Isolated模式的虚拟网络。
虚拟机slk-router是唯一与桥接网络相连的虚拟机,在整个网络中充当核心路由器的角色,是所有虚拟机与外界联系的唯一通道。
其余的虚拟机分成几组,分别模拟一个机构的网络环境,如slk-home-gate模拟home机构的网关和防火墙,slk-home-work(s)模拟该机构的内网机器,slk-home-server(s)模拟该机构的DMZ服务器,away结构和other机构依此类推。slk-outer-server(s)则模拟一些不隶属于任何机构的公共服务器。
home机构和away机构还可以模拟为一个大机构下的两个异地分支机构,从而可以在两者之间搭建VPN,再模拟出一个虚拟链路来。
下面就讲述具体的配置过程。
虚拟网络
桥接网络与物理网络相连,上游网关地址是192.168.176.1,DNS域名服务器是192.168.176.1,并开启了DHCP服务。
新建九个虚拟网络:
网络名称 | IP地址 | 类型 | DHCP服务 |
---|---|---|---|
home_work | 10.10.10.0/24 | Isolated | 禁用 |
home_server | 10.10.20.0/24 | Isolated | 禁用 |
home_gate | 172.16.0.0/24 | Isolated | 禁用 |
away_work | 10.20.10.0/24 | Isolated | 禁用 |
away_server | 10.20.20.0/24 | Isolated | 禁用 |
away_gate | 172.17.0.0/24 | Isolated | 禁用 |
other_work | 192.168.0.0/24 | Isolated | 禁用 |
other_server | 192.168.1.0/24 | Isolated | 禁用 |
other_gate | 172.18.0.0/24 | Isolated | 禁用 |
所有虚拟网络都禁用了系统提供的DHCP服务,如果需要,由虚拟机自己来实现。
配置完毕的图示:
虚拟机
所有虚拟机的操作系统安装时都选择安装所有软件包,免除在配置过程中再单独安装软件包的过程。
slk-router
网卡映射
slk-router虚拟机配置四块网卡,网卡与虚拟网络的映射关系如下:
- eth0 → br0(桥接)
- eth1 → home_gate
- eth2 → away_gate
- eth3 → other_gate
IP地址
eth0的IP地址通过DHCP从上游获得,其余三个接口的IP地址都是静态地址。
缺省路由和DNS服务器为上游网关192.168.176.1,也通过DHCP获取。
系统配置
作为路由器,自然要开启转发功能:
chmod +x /etc/rc.d/rc.ip_forward
开启NAT,对所有从桥接网络接口出去的数据包进行IP伪装:
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
slk-*-gate
网卡映射
slk-*-gate虚拟机作为各个机构网络的网关,均配置三块网卡,分别与内网、外网、DMZ网络相连。以slk-home-gate为例,网卡与虚拟网络的映射关系如下:
- eth0 → home_work
- eth1 → home_gate
- eth2 → home_server
IP地址
所有接口的IP地址都是静态地址。
缺省路由为slk-router的相应接口地址。
DNS服务器为物理网关192.168.176.1。
系统配置
作为网关,同样要开启转发功能:
chmod +x /etc/rc.d/rc.ip_forward
配置iptables脚本,详情参见iptables脚本,这里选择其中的网关模板,并根据需要进行相应修改。
配置sysctl参数,详情参见sysctl脚本。
配置域名服务器,为内网提供DNS域名查询服务。这里仅配置一个简单的Forward服务器:
编辑/etc/named.conf,在options节添加:
forward only; forwarders { 192.168.176.1; };
启用BIND服务器:
chmod +x /etc/rc.d/rc.bind /etc/rc.d/rc.bind start
当然,还可继续配置DHCP服务,为本网机器动态分配IP地址。
slk-*-work(s)
网卡映射
slk-*-work(s)虚拟机作为内网机器,只配置一块网卡,与本地网关相连。以slk-home-work(s)为例,网卡与虚拟网络的映射关系如下:
- eth0 → home_work
IP地址
接口IP地址为静态地址,如果本地网关开启了DHCP服务,则可动态获得。
缺省路由和DNS服务器均为本地网关的相应接口地址。
系统配置
配置iptables脚本,详情参见iptables脚本,这里选择其中的客户机模板。
配置sysctl参数,详情参见sysctl脚本。
slk-*-server(s)
网卡映射
slk-*-server(s)虚拟机作为服务器,只配置一块网卡,机构内的服务器与本地网关相连,公共服务器则接入other-gate网络。以slk-home-server(s)为例,网卡与虚拟网络的映射关系如下:
- eth0 → home_server
IP地址
接口IP地址为静态地址。
机构内服务器的缺省路由和DNS服务器为本地网关的相应接口地址;公共服务器的缺省路由为slk-router的相应接口地址,DNS服务器为物理网关192.168.176.1。
系统配置
配置iptables脚本,详情参见iptables脚本,这里选择其中的服务器模板,并根据需要作相应修改。
配置sysctl参数,详情参见sysctl脚本。
配置web服务,详情参见HTTP服务器的安装和配置。
配置ftp服务,详情参见FTP服务器的安装和配置。
更多网络服务可继续添加。
测试
配置完毕,就可以进行各种测试了,常用工具:ping、tcpdump、lynx、lftp、ssh、telnet、nc、nmap等。
通过不断调整iptables脚本,可以模拟各种网络行为,从中学习网络知识,同时也对脚本配置正确与否进行验证。当脚本运行与预期不符时,结合tcpdump在相关虚拟机的网络接口上观察,是一个很好的诊断方法。