分类: LINUX
2010-01-04 12:22:05
本文欢迎自由转载,但请标明出处和本文链接,并保持本文的完整性。
CU: Godbach
Blog:http://blog.chinaunix.net/u/33048/index.html
Jan 4, 2010
一、需求
学习Linux网络部分,关键还是在理解的基础上实践。要实践,就要准备好自己的环境。
譬如,我是想写一个小程序,实现一个hook函数,在FORWARD点上对来往的数据包进行监控和过滤等功能。那么,所需的环境见第二部分介绍。
二、环境
要实现这个功能,个人准备的环境如下:
(1)一个Linux系统主机,双网卡,实现转发功能。其中网卡eth0可以上外网,eth1链接内网。
(2)一个内网客户端主机,Linux/Windows都行;
(3)一个交换机,用于实现内网客户主机和Linux主机的通信。
三、配置
(一)网络结构
由第二部分介绍的环境可以看出,Linux系统主机主要是实现转发功能,让内网主机可以成功的访问外网。
因此, 首先介绍一下Linux系统主机的配置。Linux主机是可以直接通过eth0上外网的。eth0的IP地址,GW和DNS都是自动获取的。当然,如果是手动分配IP、GW和DNS也是没问题的。我的eth0配置如下:
IP: 192.168.79.129/24
GW: 192.168.79.1
DNS:192.168.79.2
Linux主机的eth1指向内网,IP地址为:
IP:
GW:
DNS:192.168.79.2
这里,所有内网主机的网关都设置为eth1的IP地址,而DNS设置为eth1所在的Linux系统主机的DNS,即192.168.79.2。
以上配置对应的网络结构图如下所示:
(二)启用转发功能
以上配置完成后,Host A应该可以ping通Linux系统主机的eth1的IP,因为他们是通过交换机链接的。但是,Host A应该可以ping不通Linux系统主机的网关和DNS服务器,因为并未开启Linux系统主机的转发功能。
开启Linux的转发功能,执行如下命令:
# echo 1 > /proc/sys/net/ipv4/ip_forward
查看系统是否启用了转发功能,可以执行如下命令:
# cat /proc/sys/net/ipv4/ip_forward
如果结果为1,代表已启用,0代表未启用。
此时,执行ping 192.168.72.129 的网关和DNS都可ping通了。
(三)配置NAT规则
经过第二部分配置后,虽然可以ping相关的IP地址,但是内网主机还是无法上网。问题在于内网主机的IP地址是无法在公网上路由的。因此,需要转换成Linux系统主机可以上网的IP(注:这里我们之所以不说是公网IP,是因为Linux系统可以直接上外网的IP同样是内网IP。但是该内网IP(192.168.79.129)已经通过一些机制,实际上同样是NAT的方式,可以访问外网了,因此我们只需将Host A的IP转换成Linux系统eth0接口的IP即可)。
我们配置的NAT为源NAT转换:
#iptables -t nat -A POSTROUTING -s
也可以通过使用SNAT target实现:
#iptables -t nat -A POSTROUTING -s
至于MASQUERADE和SNAT的区别,可以网上搜索,有相关的解释。
同时,还要在FORWARD点出配置规则如下:
#iptables -A FORWARD -i eth1 -j ACCEPT
保证所有进入eth1的包都被FORWARD点ACCEPT。
经过以上的配置之后,Host A就可以正常的访问外网了。
四、如果只有一台主机...
按照上面介绍的环境,逻辑上需要两台主机方可实现。如果我只有一台电脑的话,如何实现搭建NAT服务器,并且通过内网主机访问外网来验证配置的结果呢?
很明显,虚拟机给我们提供的解决方案。不过仍然需要两个前提:其一,电脑双网卡;其二,有一个交换机。
说一些我自己的环境,一台笔记本,普通网卡+无线网卡,一个交换机。本身笔记本上安装的是Windows操作系统。上网使用无线网卡,DHCP获得IP,网关和DNS。但是这个系统仅作为宿主机,Linux和内网主机都安装使用虚拟机操作系统。
(1) Linux系统主机
安装一个Linux系统的虚拟机,两张网卡都启用,其中对应无线网卡的是eth0,采用的上网方式是VMnet8(nat),其实相当于VMware实现了DHCP服务器,将Linux虚拟系统的eth0通过宿主机的无线网卡上网。这就是eth0可以上网的原因。但是我们可以不用关心eth0如何上网的,只要eth0可以上网,我们就可以开始搭建NAT服务器的配置了。
eth1对应普通网卡,IP地址的配置参考上面的拓扑图即可。
(2)内网主机
安装一个Windows操作系统的虚拟机,仅启用一张网卡,对应于宿主机的普通网卡。这样,内网主机上网就只能通过该网卡实现。该网卡的配置同样参考上面的拓扑图。
这样,我就可以在一台电脑上,使用内网主机,通过Linux主机的NAT转换功能,访问外网了。
因此,按照这种方式实现之后,想在Linux的FORWARD点验证你的想法,加一个hook函数就可以了。
五、参考链接
1. http://blog.chinaunix.net/u/16255/showart_100254.html
2. http://panpan.blog.51cto.com/489034/189072
3.
4. iptables中SNAT和MASQUERADE的区别: