====== 用KVM虚拟机模拟网络环境 ====== 在KVM环境下,每个虚拟网络就好比是一台网络交换机(参见:[[.:kvm|CentOS 6下KVM环境的安装和配置]]),我们可以创建一些虚拟网络,并将虚拟机的一个或多个网络接口映射到相应的虚拟网络,就可以模拟一个网络环境。 本文就依据这个思路来模拟一个较为复杂的网络,用于开发测试。虚拟机操作系统使用[[http://www.slackware.com|slackware]] 14.0。 ===== 网络拓扑 ===== 模拟的网络拓扑结构: {{:computer:env:net-toplogy.png}} 图中的交换机就是虚拟网络,包括一个桥接(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服务,如果需要,由虚拟机自己来实现。 配置完毕的图示: {{:computer:env:virtual_networks.png }} ===== 虚拟机 ===== 所有虚拟机的操作系统安装时都选择安装所有软件包,免除在配置过程中再单独安装软件包的过程。 ==== 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脚本,详情参见[[..:sec:iptables|iptables脚本]],这里选择其中的网关模板,并根据需要进行相应修改。 配置sysctl参数,详情参见[[..:sec: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脚本,详情参见[[..:sec:iptables|iptables脚本]],这里选择其中的客户机模板。 配置sysctl参数,详情参见[[..:sec: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脚本,详情参见[[..:sec:iptables|iptables脚本]],这里选择其中的服务器模板,并根据需要作相应修改。 配置sysctl参数,详情参见[[..:sec:sysctl|sysctl脚本]]。 配置web服务,详情参见[[..:net:httpd|HTTP服务器的安装和配置]]。 配置ftp服务,详情参见[[..:net:ftpd|FTP服务器的安装和配置]]。 更多网络服务可继续添加。 ===== 测试 ===== 配置完毕,就可以进行各种测试了,常用工具:ping、tcpdump、lynx、lftp、ssh、telnet、nc、nmap等。 通过不断调整iptables脚本,可以模拟各种网络行为,从中学习网络知识,同时也对脚本配置正确与否进行验证。当脚本运行与预期不符时,结合tcpdump在相关虚拟机的网络接口上观察,是一个很好的诊断方法。 {{tag>虚拟化}}