第七章架设 NAT.docx
- 文档编号:1710811
- 上传时间:2023-05-01
- 格式:DOCX
- 页数:57
- 大小:138.32KB
第七章架设 NAT.docx
《第七章架设 NAT.docx》由会员分享,可在线阅读,更多相关《第七章架设 NAT.docx(57页珍藏版)》请在冰点文库上搜索。
第七章架设NAT
忆茶斋软件学习网,打造计算机学习的好平台
第七章﹕架设NAT
当您好不容易把Linux机器连上Internet之后﹐别以为就只有它一台机器能上网哦。
下面教您的法子是如何用一台Linux机器让本地网络中所有的机器都能同时上网﹗
设定Proxy
我们在“网络基础”中的“防火墙”那边已经知道﹐能做到以上要求的方法很多﹐之一是使用proxy。
至于它的好处﹐前文已经说了许多﹐这里就不再重复了。
假如您只想让其他机器到Internet上浏览一下网页或透过HTTP下载文件﹐无疑proxy是个不错的主意﹐而且要设定这样一个proxy也是非常容易的﹐您只需确定squid套件有装好﹑并且能在开机的时候启动(执行ntsysv来选择)就行了。
然后﹐您要做的只是修改/etc/squid/squid.conf这个档案。
虽然这个档案看上去很长﹐但是﹐如果仅是用来做HTTPproxy的话﹐您要修改的句子不超过两句﹕
#在第1163行下面增加一行﹕
aclsiyongcsrc192.168.100.0/255.255.255.0#请修改为您自己的实际设定
#然后在第1197行下面再增加一行﹕
http_accessallowsiyongc#请修改为上一行定义的acl名称
然后重新跑squid就好了﹕
servicesquidrestart
接下来﹐您将其他机器的浏览器上之proxy功能打开﹐并将服务器IP指向squid主机﹐同时将port设定为3128就可以了。
如果您用IE的话﹐按‘工具’-->‘Internet选项’-->‘联机’-->‘局域网络设定’-->‘使用Proxy服务器’-->然后填好‘网址’与‘端口’﹕
图一
这里只是最单纯的设定而已﹐事实上﹐squid的设定非常多样和复杂﹐如果您有兴趣的话﹐可以参考‘优客笔记簿’中的文件。
正如您刚纔发现的﹕在Linux上面设定一个简单的proxy看来是很容易的事情﹐但毕竟使用proxy是非常有限制的﹐例如﹐您要玩ICQ﹑要使用telnet﹑要上传FTP﹑要使用外面的POP信箱﹑要阅览新闻组或BBS﹑等等﹐恐怕proxy就未必能全部应付得来了。
不过﹐假如您使用IPMasquerading(IP伪装---NAT的一种)技术又如何呢﹖那情形几乎是﹕您在那台用来上网的Linux机器上所使用的internet功能﹐在其他机器也一样拥有﹗
前提准备
要设定NAT(NetworkAddressTranslation)就牵涉到防火墙装置了。
老实说﹐要设定一个称职的防火墙并不是一件容易的事情﹐它要求您有非常丰富的TCP/IP基础﹑和严密的逻辑头脑﹑还得加上无以复加的细密测试。
但是﹐我在这里教您的﹐并不是要真正的设定一个火墙﹐只是想让其他机器上网罢了。
如果您真想设定防火墙﹐您可以看看Firewall﹑IPMasquerade和IPchains这几篇HOWTO文件﹐或许才会有些概念(但未必就设定得来)。
而且﹐在阅读的时候﹐要注意文章引用的版本是否和您目前机器使用的相同﹐因为不同的版本所使用的工具和命令格式都相差很远﹐但基本的原理是不变的。
首先﹐您要知道﹐在Linux上面的防火墙程序都与核心版本非常密切﹕
∙如果您是用2.0.x的核心﹐那您只能使用ipfwadm程序﹔
∙如果是2.2.x的核心﹐则使用ipchains程序﹔
∙如果是2.4.x的核心﹐则使用iptables程序(ipchains仍可以透过modules方式加载使用)。
因为RedHat7.1预设是使用2.4.2核心﹐所以我们这里打算以iptables来做范例。
如果您的核心参考system系列之‘编译核心’文章编的﹐那就已经具备防火墙功能了。
如果您目前的版本是使用2.2.x核心的话﹐请参考RH6.2版本的旧文章﹐这里将不再以ipchains来作说明了。
Tips﹕如果您对ipchains比较熟识﹑而决定继续在2.4.x核心上面使用ipchains的话﹐那也可以执行modprobeipchains将ipchains的模块加载(但无论如何﹐ipchains与iptables模块不能同时加载)。
不过﹐2.2.x核心原来提供的一些模块(如ip_masq_*.o)就没办法使用了﹐这点请您留意。
另外﹐您还可以执行ntsysv将ipchains选择起来﹐并将ipchains的设定写进/etc/sysconfig/ipchains档案中(可执行setup选择‘FirewallConfiguration’来设定这个档)﹐那么在开机的时候就会将ipchains跑起来了。
不过﹐我们这里只打算使用iptables﹐所以﹐以上方法仅供已有ipchains经验的朋友们参考﹐请勿和下面的说明搞混了。
好了﹐下面我跟大家说说如何在RedHat7.1上面用iptables来做一些防火墙和NAT的功能。
但我必须再一次指出﹕设定防火墙需要您具备非常丰富的TCP/IP基础。
最起码﹐您能理解如下的概念﹕
∙IPsubneting与IProuting的概念﹔
∙TCP与IP封包header的各个字段之名称与意义﹔
∙SocketPair(SourceSocket与DestinationSocket)的定义﹔
∙TCP封包之SequenceNumber与AcknowledgementNumber的关系﹔
∙IPfragment与MTU/MRU的关系﹔
∙ICMP协议的type&errorcode之名称与意义﹔
∙Three-wayHandshake的过程与SYNC封包的意义﹔
∙TCP/IP联机的不同联机状态(例如NEW﹑WAITED﹑ESTABLISEHED﹑等)
∙各种服务的联机特征(尤以FTP服务为代表)。
假如您弄不懂以上所说的概念而硬要设定防火墙﹐那将是一件非常痛苦的事情(呵﹐我可把话说在前面了哦~~)。
如果您真的决心弄明白这些概念﹐那您可以参考如下文章所列的书目清单﹕请推荐有关网络的书....﹐花点时间了解TCP/IP这对宝贝。
要不然﹐当问题发生的时候﹐就算您要上来和大家请教和讨论﹐人家也不知道如何帮您解释才好﹑或是人家说了您却听不懂﹐因为都必须要牵涉到底层的TCP/IP基础知识。
好吧﹐我假设您已经补习好基础了哦~~然则的话﹐Let'sgo!
设定IPMasquerading
我们这里的网络环境基本上与第一章所介绍的环境一样﹕
图二
这里﹐作为NAT机器的主机就是RH71﹐它目前有三张网络卡﹐而我这里是将adsl接到eth1上面去﹐并且完成了adsl-setup﹑也已经顺利连上Internet了﹔执行ipconfig确定ppp0界面已经起来。
注﹕我们在接下来的叙述中﹐都一律以ppp0作为对外界面﹔如果您不是使用拨接连接﹐或是拨接界面不是ppp0的话﹐请您自行以该界面代替ppp0。
Tips﹕如果您使用拨接式ADSL﹐并向内部网络提供NAT服务的话﹐用一张网络卡就够了﹐反正adsl会使用ppp0而非eth0作为对外界面。
但如果您是使用固接式ADSL﹐并且不是以ppp而是实体网络卡(ethX界面)的话﹐那我建议您最好使用多片网络卡﹐分别用来连接外部和内部网络(甚至DMZ网络)。
如果您用一张网络﹐然后以IPAlias方式同时连接外部和内部网络﹐单纯提供IP伪装服务而不设定封包过滤的话﹐那是可以的﹐但我还是不鼓励如此做法。
这时候在内部网络准备一台测试主机(跑client端程序)﹐并确定它能够连上RH71主机﹑而且defaultgw也指向RH71的内部界面。
当我们的环境准备好之后﹐接下来就可以开始NAT的设定了﹕
1.无论如何﹐第一件事情要做的是确定您的系统上有安装iptables套件﹐否则请用RPM从CD里面安装(RH7.1CD1)。
2.然后﹐您必须将Firewall功能编进核心里面去。
如果您的核心是按照‘编译核心’文章的例子编的﹐应该就不成问题了:
3.Networkingoptions--->
4.[*]Networkpacketfiltering(replacesipchains)
5.[*]TCP/IPnetworking
6.IP:
NetfilterConfiguration--->
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.<>ipfwadm(2.0-style)support(NEW)
提示﹕假如您的系统并没作过任何的核心修改﹐换句话说﹕您一直都是使用系统安装时所准备的预设核心﹐那么这个步骤可以省略了。
除非您发现某些模块确实需要重编才有。
29.然后﹐检查一下/etc/sysctl.conf这个档案﹐看看‘net.ipv4.ip_forward=’是否为‘1’。
如果是﹐跳到下一步﹔如果不是﹐将之改成‘1’﹐存盘﹐然后执行﹕
sysctl-wnet.ipv4.ip_forward=1
30.Tips﹕上面这步骤是将ip_forward功能打开﹐您也可以用如下句子来完成﹕
echo"1">/proc/sys/net/ipv4/ip_forward
31.执行ntsysv将iptalbes选择起来﹐并且确定ipchains没有选择。
32.检查一下ipchains的模块是否被‘意外’加载了﹕
lsmod|grepipchains
33.如果输出结果没有发现ipchains的话﹐跳到下一步骤﹔如果有发现﹐则执行﹕
serviceipchainsstop
rmmodipchains
34.并重复执行lsmod确定ipchains模块已经移除。
35.检查iptables的模块是否已经加载﹕
lsmod|grepip_tables
36.如果有请跳到下一步骤﹔否则执行﹕
modprobeip_tables
37.并再次执行lsmod确定iptables模块已经成功加载。
38.如果您不考虑任何安全性﹐现在执行﹕
iptables-tnat-APOSTROUTING-oppp0\
-s192.168.100.0/24-jMASQUERADE
就这样﹐您就可以让NAT后面的内部网络的机器连上Internet了﹗现在﹐您可以取消proxy设定并尝试一下web联机﹐或用邮件程序上网收发信件看看﹖甚至还可以打开ICQ和外面的朋友聊天呢﹗当然了﹐什么BBS或新闻组这些也都可以啦~~^_^
设定TransparentProxy
您或许会觉得继续使用proxy仍不失为一个好主意﹐尤其是当您考虑到带宽问题的时候﹐甚至您还可以在使用者在不知情的情况下用proxy来浏灠www网站。
这时候﹐您就可以考虑建立一个TransparentProxy了﹕
1.首先﹐修改/etc/squid/squid.conf﹐找到下面几行﹐并修改为如下样子﹕
httpd_accel_hostrh71.siyongc.domain#请修改为您的squid主机名
httpd_accel_port80
httpd_accel_with_proxyon
httpd_accel_uses_host_headeron
并重新启动squid服务﹕
servicesquidrestart
2.然后执行﹕
iptables-tnat-APREROUTING-ieth0-ptcp\
-s192.168.100.0/24\
--dport80-jREDIRECT--to-ports3128
这时候﹐您的TransparentProxy就起来了﹗如果您要测试它﹐可以取消client端的proxy设定﹐并将squid关闭﹐然后测试是否不能联机(建议用一个未曾浏览过的网址来测试)﹖然则﹐再将squid打开﹐如果能这样又能恢复联机的话﹐那就已经成功了﹗这样有一个好处是﹕以后您再也不必跑到client那边设定proxy﹔而且﹐更好的地方在于﹕重复性的联机再也无需占用宝贵的对外带宽﹐速递当然也能‘假性’的获得提高。
工作原理
然而﹐以目前的设定来说﹐可以说是完全开放的﹐毫无安全性可言的。
虽然我在这里并不想设定一个真正火墙﹐但起码的安全也是应该考虑的。
当我们提到防火墙的时候﹐大部份都是指PacketFiltering(封包过滤)﹐这和前面提到的封包伪装(也就是NAT的一种技术)可不是一样的。
这里面﹐我们不妨先了解一下封包过滤的工作原理﹐这对于我们日后的防火墙管理非常重要﹗
让我们回到TCP/IP的基础知识吧(顺便检查一下您是否能够正确理解我在前面列出的概念)﹕
SocketPair
首先﹐让我们了解一下什么是SocketPair。
所谓socket就是一个‘IP地址’加上一个‘TCP/UDPPort’﹐代表了一个联机与哪台机器(IP地址)﹑及与机器上那一只程序(Port)相连的。
我们同时也知道﹕一个联机必须有两个端点﹕来源地(Source)和目的地(Destination)。
换句话说﹐我们一个联机就是与一对socket相连着﹕分别是SourceSocket(SourceAddress&SourcePort)与DestinationSocket(DestinationAddress&DestinationPort)﹐合起来我们称之为SocketPair﹕
Tips﹕如果您了解TCP与IP封包header结构的话﹐都非常容易找到上述提到的字段。
一般而言﹐防火墙程序大都会检查这些字段来进行判断﹐然后根据您的设计要求来处理封包。
当然﹐事实上﹐防火墙程序除了根据Socket信息来判决封包命运之外﹐几乎封包的每一个字段都可以作为判断依据。
这也就是防火墙(或封包过滤)程序能耐之处了。
事实上﹐Socket的功能就是让网络程序存取网络使用的﹐对程序而言﹐关键是它所被分配的Port数值。
而port也有分两种﹕TCP和UDP﹔至于哪些服务用哪种port﹐端视服务程序的要求(您都可以在/etc/services这个档案中找到)。
一般而言﹐单一的机器最多能使用的port范围是在1到65535之间。
其中的1~1023这段范围只能由root权限的服务程序使用﹐通常是一些常用的服务程序﹐如HTTP﹑FTP﹑SMTP﹑等。
我们称这些常用的port为Well-knownPort﹐基本上大家都会采用相同的数值﹐如80﹑21﹑25等(事实上是未必的﹐只要能让client找到就好﹐如地下网站就通常使用不为人知的port数值)。
但是﹐作为client端程序所使用的port﹐我们没办法事先知道它会用哪一个port。
因为client程序所使用的port会随机的从1024~65535之间挑选﹐只要那个port没被其它程序使用就行。
请您记住这些port的使用特征﹐我们在防火墙设计中常会用到。
联机方向
我们已经知道SocketPair事实上就是两个socket﹕一个是Source﹑另一个是Destination。
但﹐这是相对而言的﹐为什么这么说﹖
因为﹐我们要成功的建立一个TCP/IP联机﹐其联机必须是双向的﹕假设联机是A与B之间的两台机器。
当封包从A送往B的时候﹐A的Scocket是SourceSocket﹑而B则是DestinationSocket﹔反过来﹐当封包从B送回A的时候﹐那么A的Socket就变成Destination﹑而B则变成Source。
图三
请您务必搞懂这对Socket于联机方向时所使用的名称。
这样﹐当您在防火墙墙上处理这些封包的时候﹐才知道哪边是Source﹑哪边是Destination。
联机界面
与刚纔提到的联机方向相关的﹐就是联机界面了。
一般情况下﹐防火墙都是处于内部网络与外部网络之间的位置﹐换句话说﹕它通常有不同的界面来连接不同的网络。
让我们再以图三为例﹕当封包从A送往B的时候﹐在防火墙左边的界面属于incoming界面(在iptables中以-i表示)﹑而右边的界面则是outgoing界面(在iptables以-o表示)﹔但是﹐当封包从B送回A的时候﹐右边界面则成为incoming界面﹑左边的则成为outgoing界面。
Tips﹕请那些习惯了ipchains语法的朋友务必注意﹕在ipchains里面不管界面是属于incoming还是outgoing﹐一律以-i表示﹔但在iptables中﹐-i只能代表传入界面﹑传出界面只能以-o表示。
所以﹐在iptables中的INPUT不可能使用-o来指定界面﹔相反﹐-i界面也不可能出现在OUTPUT中。
封包于防火墙中的流向
当您搞懂了SourceSocket与DestinationSocket﹑以及各界面之间的关系之后﹐接下来﹐再让我们仔细看看封包在防火墙中的流向。
当一个封包抵达防火墙的时候﹐必须从一个界面进入﹐然后经过路由判断之后﹐再从路由判断所指定的界面送出去。
您或许很容易的认为﹕从界面传入的封包就是INPUT﹔从界面从出去的封包就是OUTPUT﹔而从一个界面送到另一个界面就是FORWARD﹕
图四
事实上是否如此呢﹖
哈﹐如果您对ipchains程序够了解的话﹐您肯定会认为如此。
但﹐到了iptables的时候﹐却未必哦~~^_^在iptables中﹐所谓的INPUT与OUTPUT﹐只对那些与本机LocalProcess相关的封包而言才是成立的(这也是iptables与ipchains最大分别之一)。
也就是说﹕对于一个从界面传入的封包﹐如果它是送给在本机的﹐那才算是INPUT﹐否则不算﹔至于将从一个界面送出的封包﹐如果这个封包是从本机产生的﹐才算OUTPUT﹐否则不算﹔那些传入与传出都与本机无关的封包﹐则属于FORWARD了(注意﹕既不是INPUT也不是OUTPUT哦)﹕
图五
事实上﹐图五中的三个圆角方块(INPUT﹑OUTPUT﹑FORWARD)﹐分别是在iptables程序里面的三个内建防火链(Built-inChains﹐我们后面再说明)。
NAT的原理
我们一般所说的NAT事实上只是一个socket替换机制﹕要么将SourceSocket换掉﹑要么将DestinationSocket换掉﹑要么两个同时换掉。
就这么简单~~^_^
通常而言﹐当一个NAT在替换SourceSocket的时候﹐我们称之为SNAT(SourceNAT)﹔如果在替换DestinationSocket的时候﹐则为DNAT(DestinationNAT)﹔那如果Source与Destination一起换呢﹖哈~~这个留给聪明的您自己思考吧~~
究竟NAT是根据什么来替换这些socket呢﹖这就是我们要花心思去设计的了。
在前面我们曾经示范过所谓的‘IP伪装(Masquerading)’设定范例﹕
iptables-tnat-APOSTROUTING-oppp0\
-s192.168.100.0/24-jMASQUERADE
事实上﹐这是一个SNAT的经典例子了﹕当NAT处理一个封包的时候﹐如果发现它是来自192.168.100.0/24这个网络﹐并且经由ppp0送出的话﹐那么它的来源地址则换成ppp0的IP地址(socket的元素之一)。
至于socket的另一元素---TCP/UDPport---是否也需要换掉呢﹖得视NAT当时的port使用情况而定。
聪明的NAT都会‘尽量’的保留原有的port数值﹐除非这个port已经被别的Socket使用了。
不过﹐也有些NAT不管怎样﹐都同时将IP地址与Port给换掉。
然而﹐不管哪种情形﹐只要Socket元素之一经过修改﹐那就是另外一个新的Socket。
并且﹐NAT必须为这个动作进行记录(通常会保存在
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第七章架设 NAT 第七 架设