实验条件:创建一台Redhat Linux 9.0的虚拟机和一台Windows XP虚拟机,Linux虚拟机有两块网卡(eth0和eth1),eth0实现和Internet连接,eth1实现和内网的连接。它们的资料如下:
eth0: IP(192.168.0.133) MASK(255.255.255.0)Gateway(192.168.0.2) DNS(和主机一样)
eth1: IP(192.168.132.128) MASK(255.255.255.0)Gateway(无)
实验目的:将Linux虚拟机搭建成一台软路由器,使Windows XP虚拟机(在192.168.132.0/24网段)能通过这台软路由上网。所以Windows XP的IP地址如下:
IP(192.168.132.129) MASK(255.255.255.0)Gateway(192.168.132.128,其实就是eth1的IP)
DNS(和主机一样)
实验原理:Windows XP虚拟机向Linux虚拟机发送报文,Linux虚拟机检验报文的目的地址,然后根据路由表选择路由。但是这样发送出去是不行的,因为它的源地址是192.168.132.0/24网段的,不是192.168.0.0/24网段的,所以网关192.168.0.2(eth0的网关)不会把它发出去,所以还要伪装一下地址,也就是我们经常看到的NAT(网络地址转换)。而NAT的转换很多都是用防火墙的NAT功能来完成的,所以呆会我们还会用到防火墙iptables(Redhat 9.0自带)
实验步骤:
(一)Linux虚拟机中
1、配置网络:
在图形界面下,点击左下角的红帽,然后“系统设置――网络”,输入口令后就可以看到网卡了(eth0和eth1),点击eth0,输入IP(192.168.0.133) MASK(255.255.255.0)Gateway(192.168.0.2) DNS(和主机一样)。然后点击eth1,输入 IP(192.168.132.128) MASK(255.255.255.0)Gateway(不填),然后保存并退出就可以了(其实它和修改ifcfg_eth0、ifcfg_eth1、network等文件或用ifconfig命令的效果是一样的,你个人喜欢咯)。如果习惯命令行,你也可以手工输入。
2、现在Linux虚拟机的网络已经配置好了,你可以ping一下做检验,按如下顺序ping。
ping 127.0.0.1 (检查协议等是否正确安装)
ping 192.168.132.128 (检测eth1是否正常)
ping 192.168.0.133 (检测eth0是否正常)
ping 192.168.0.2 (检测网关是否正常)
ping www.baidu.com(连接外网,检测是否正常,如果出现网址找不到的出错信息,很可能是DNS没设置好)
如果都ping通了那就可以进行下一步了,没ping通的话继续检测……
接着用route -n查看一下你的路由表,可以看到类似的信息
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
192.168.132.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
127.0.0.0 0.0.0.0 255.0.0.0 U 0 0 0 lo
0.0.0.0 192.168.0.2 0.0.0.0 UG 0 0 0 eth0
看到了吗?第一行信息表示目标地址为192.168.0.0/24的报文从eth0发出去,第二行信息表示目标地址为192.168.132.0/24的报文从eth1发送出去,第三行类似,它是一个回环地址,发给电脑本身,第四行是默认网关,因为它的Flags标志为UG(G表示Gateway)
3、完成了上面的IP设置还不行,还要启动IP转发功能。在命令行输入
echo 1 > /proc/sys/net/ipv4/ip_forward 就行了,但是重启后又没了,所以 最后把/etc/sysctl.conf文件中的
net.ipv4.ip_forward = 0 改为net.ipv4.ip_forward = 1 就行了。
(二)在Windows XP虚拟机中
在XP虚拟机的设置很简单,就和我们平常的一样,把IP、掩码、网关、DNS设置如下就行了IP(192.168.132.129) MASK(255.255.255.0)Gateway(192.168.132.128,其实就是eth1的IP)DNS(和主机一样)
到此为止,我以为已经可以了!然后ping 了一下百度,还是ping不通,这是为什么呢?因为我们还没有伪装IP。因为只有伪装成192.168.0.0/24网段的IP才能从eth0发出去的,还记得route -n里面有一条
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
这样的信息吗?就是说的这么一回事了。所以我们要进入下一步NAT
(三)NAT、网络地址转换
1、NAT简介:
借助于NAT,私有(保留)地址的"内部"网络通过路由器发送数据包时,私有地址被转换成合法的IP地址,一个局域网只需使用少量IP地址(甚至是1个)即可实现私有地址网络内所有计算机与Internet的通信需求。 NAT将自动修改IP报文的源IP地址和目的IP地址,Ip地址校验则在NAT处理过程中自动完成。有些应用程序将源IP地址嵌入到IP报文的数据部分中,所以还需要同时对报文进行修改,以匹配IP头中已经修改过的源IP地址。否则,在报文数据都分别嵌入IP地址的应用程序就不能正常工作。
2、Linux中的NAT
在Linux中,要实现NAT的功能,用的是防火墙的NAT,所以我们要用到iptables命令。iptables的语法等就不再这里介绍了,实在是太长了,大家可以用man iptables查看。
3、现在我们想192.168.132.0/24网段的计算机都能通过这台路由器上网,所以我们可以建立一个脚本,把下面的内容复制上去,然后chmod 755 XXX.sh改变它的权限,最后输入./XXX.sh运行
#!/bin/bash
#初始化INPUT、FORWARD、OUTPUT等链
#清除原来防火墙的设置
iptables -F
#默认不符合INPUT、FORWARD、OUTPUT链规则的包就丢弃,POSTROUTING、PREROUTING默认为接收
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
iptables -t nat -P POSTROUTING ACCEPT
iptables -t nat -P PREROUTING ACCEPT
#为FORWARD链添加一条规则:凡是源地址属于192.168.132.0/24,目标地址为ANYWHERE的报文都接收,但是这样只是能让报文发送出去而已,接收到的报文不符合这个规则,会被丢弃,所以还要添加一条规则:凡是源地址属于ANYWHERE,目标地址为192.168.132.0/24的也接收,这样就双向都可以通信了。
iptables -t filter -A FORWARD -s 192.168.132.0/24 -d 0.0.0.0/0 -j ACCEPT
iptables -t filter -A FORWARD -s 0.0.0.0/0 -d 192.168.132.0/24 -j ACCEPT
#下面这条语句的意思是为POSTROUTING链添加一条规则:凡是从eth0发出去的报文都伪装IP,也就是NAT一下,它就是整个NAT的核心了
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
到目前为止,所有的东西都弄好了,切换到Windows XP虚拟机,ping 一下192.168.0.2(Linux主机的网关),如果ping不通的话,仔细检测上面的步骤是否都对了!ping通了的话,就可以上网了,打开你的IE试试看,如果XP中DNS设置不对,也会上不了网的~自己小心了!
(四)问题
现在还不知道怎么在虚拟机添加网卡(除eth0、eth1、eth8外),然后又能给Linux识别的,要是能够的话,那就太好玩了,可以组成一个复杂的网络了~~哈哈……
(五)结束语
前面的IP地址等的配置一般都不会有太大的问题,一般出问题的在NAT部分。有些书用的不是Redhat 9.0,所以用的命令不是iptables,而是其他的如ipchains、ipfwadm等等,自己看着办吧!还有一些系统更惨,连iptables/ipchains/ipfwadm都没有,那就要自己安装,然后编译,挺烦人的,自己要挺住,等到你成功地配置了一台路由,你就会觉得前面的努力――值!好了,祝大家好运~~~