0320nat.htm
来自「鸟哥LINUX 学习课本」· HTM 代码 · 共 770 行 · 第 1/4 页
HTM
770 行
<!DOCTYPE html PUBLIC "-//w3c//dtd html 4.0 transitional//en"><html><head> <meta http-equiv="Content-Type" content="text/html; "> <meta name="Author" content="VBird"> <meta name="GENERATOR" content="Mozilla/4.5 [zh-TW] (WinNT; I) [Netscape]"> <meta name="Description" content="簡單的 NAT 設定,可以讓您輕鬆的達到頻寬分享的目的呢!"> <title>鸟哥的 Linux 私房菜 -- Network Address Transfer ( NAT ) 架设</title><!-- saved from url=(0022)http://internet.e-mail --><style> <!-- body{background-image=url(http://linux.vbird.org/VBirdLinux.jpg);background-ATTACHMENT=FIXED} --></style></head><body nosave="" background="0320nat_files/VBirdLinux.jpg"><center><center><b><font size="+2" color="#3333ff"><font face="SimSun">鸟哥的</font><font face="Times New Roman,Times"> Linux </font><font face="SimSun">与</font><font face="Times New Roman,Times"> ADSL </font><font face="SimSun">私房菜</font></font></b><br><a href="http://linux.vbird.org/" target="_top"><img src="0320nat_files/VBirdTitle2.jpg" nosave="" border="0" height="25" width="90"></a><a href="http://linux.vbird.org/linux_basic"><img src="0320nat_files/icon_system.gif" nosave="" border="0" height="25" width="90"></a><a href="http://linux.vbird.org/linux_server"><img src="0320nat_files/icon_server.gif" nosave="" border="0" height="25" width="90"></a><a href="http://linux.vbird.org/linux_security"><img src="0320nat_files/icon_security.jpg" nosave="" border="0" height="25" width="90"></a><a href="http://phorum.vbird.org/" target="_blank"><img src="0320nat_files/icon_forums.gif" nosave="" border="0" height="25" width="90"></a><a href="http://linux.vbird.org/adsl"><img src="0320nat_files/icon_adsl.gif" nosave="" border="0" height="25" width="90"></a><br><hr width="100%"></center><font size="+2" color="#3333ff"><a href="http://linux.vbird.org/linux_server/0320nat.php" target="_self"><font face="SimSun">简易</font><font face="Times New Roman,Times">NAT </font><font face="SimSun">服务器</font></a></font></center><div align="right"><font size="-1" color="#3333ff" face="SimSun">最近更新日期:2003/09/09</font></div><font size="-2" color="#3333ff" face="SimSun"> </font><table bgcolor="#ffcccc" border="1" cols="1" width="100%"><tbody><tr><td><font size="-1" color="#000099">在开始这个章节之前,您务必要读过『<a href="http://linux.vbird.org/linux_server/0250simple_firewall.php">简易防火墙</a>』那一章节,否则这篇文章里面很多的数据将会无法理解喔!好了,那么NAT 是什么?是 Network Address Translation 的缩写,这玩意很有趣,因为他可以让您的Linux 提供至少最简单的 IP 分享器的功能!让一部 Linux 主机可以提供整个局域网络(LAN)内的计算机来分享网络频宽,也就是区域内部的计算机通通都可以透过NAT 主机来达到多人上网的目的吶!这篇文章其实主要是<a href="http://linux.vbird.org/linux_server/0250simple_firewall.php">简易防火墙</a>的延伸就是了!</font></td></tr></tbody></table><font size="-2" color="#000099"> </font><br><font color="#000099"><font size="+1"><a href="#NAT_what">什么是 NAT呀</a></font>:</font><br><font color="#000099"> :<a href="#NAT_work">NAT 的功能</a></font><br><font color="#000099"> :<a href="#NAT_figure">联机示意图</a></font><br><font color="#000099"> :<a href="#NAT_kernelversion">核心版本</a>,</font><br><font color="#000099"> :<a href="#Who_Need">谁需要 NAT 架设</a>,</font><br><font size="+1" color="#000099"><a href="#setup_NAT">NAT 的设定</a>:</font><br><font color="#000099"> :<a href="#One_NIC">一块网络卡的 NAT 架设</a>:</font><br><font color="#000099"> :<a href="#Two_NIC">两块网络卡的 NAT 架设</a>:</font><br><font color="#000099"> :<a href="#route_rule">观察路由信息</a>:</font><br><font color="#000099"><font size="+1"><a href="#client">客户端的设定</a></font>:Windows, Linux,</font><br><font color="#000099"><font size="+1"><a href="#safe">安全性</a></font>:</font><br><font color="#000099"><font size="+1"><a href="#ex">课后练习</a></font>:</font><br><hr width="100%"><a name="NAT_what"></a><font size="+1" color="#000099">什么是NAT 呀:</font><ul>我想,大家对于 NAT 一定是有所耳闻才对,不过,到底什么是 NAT 呢?NAT其实是 <font color="#000066">Network Address Translation </font>的简写,字面上的意思是『<font color="#000066">网络地址的传送</font>』,他主要的功能就是在提供内部私有网络的计算机之频宽分享了。简单的说,NAT的功能就是『 <font color="#000066">IP 分享器</font>』咯!(注:NAT 主机的功能相当的多,不过,这里我们仅说明频宽分享的部分!)。<br> <br><hr width="100%"><a name="NAT_work"></a><font color="#000099">NAT 的功能</font><br> <br>我们由 <a href="http://linux.vbird.org/linux_server/0110network_basic.php">网络基础</a> 当中知道,要能够连接上Internet 必须要具有『<font color="#000066">公共 IP (Public IP)</font>』才行,内部私有IP (Private IP) 是不能直接与 Internet 进行数据沟通的。好了,今天假设您是一家公司的主管,或者是一间学校的信息主任,而且您所负责的单位内有20 部计算机好了,这 20 部计算机都需要能够连上 Internet ,并可以进行任何 Internet的服务要求,请问您是否需要具备有 20 个公共 IP 呢?如果真的要提供 20 个公共IP 的话,以最经济的价格来说,我们可以申请 Seednet 的 512/64 (下载/上传)拨接制 ADSL ,每个专线都可以具有五个 IP ,因为我们有 20 部主机,所以就需要四条电话线~呵呵!怕了吧!光是接线与申请ADSL 的流程就会让人崩溃,更不用说申请到之后还需要在每一部计算机上面设定拨接、管制计算机使用性、进行防毒等等的工作,光是用想的,就已经很头大了,更不用说实际去作.....<br> <br>那么应该要怎么办呢?比较聪明的朋友已经想到要去买 IP 分享器来分享网络频宽了!那么Linux 是否能够达到 IP 分享器的功能!?当然可以啦!那就是 NAT 主机的能力之一啰!我们在之前的<a href="http://linux.vbird.org/linux_server/0230router.php">Router设定</a>当中,提过路由的概念了,封包的传送主要是透过路由的信息,但是,私有路由是不能直接与Internet 沟通的啊!因此用 Linux 作为 Router 时,如果 Linux 主机本身就是仅有私有IP ,自然也就无法直接连接到 Internet 上面去了。<br> <br>到底该如何是好?呵呵!这个时候就得要回头谈一谈 TCP 封包的概念咯。由网络基础 章节里面提到的<a href="http://linux.vbird.org/linux_server/0110network_basic.php#packet_tcp">TCP封包的架构图</a>,我们可以发现 TCP 封包里头有来源与目的地的 IP 及 port的信息在 Header 里面,那么如果透过某些技术,来改变 TCP 封包的 header 呢?如果能够将TCP 封包的来源 IP 由本来的 Private IP 变成 Public IP 的话,不就可以连接到Internet 了吗?!呵呵!没错没错!谈到重点了!就是这样啦!<font color="#000066">NAT主机的重要功能之一就是将来自内部 Client 端计算机封包的 Header 的 IP 『伪装』成公共IP ,而提供 Client 端连上 Internet 的一个方法</font>!(<i><font color="#000066">注:当然啦,IP 分享器也是使用同样的道理!</font></i>)。那么 Linux 是用什么机制达到这样的功能?还记得<a href="http://linux.vbird.org/linux_server/0250simple_firewall.php">简易防火墙设定</a>当中提到的iptables 吧?!iptables 可以进行封包的分析,当然,他还可以进行封包信息的修改呢!那么整个流程是如何呢?如下图所示,当我的区域内的具有192.168.1.100 的 client 要对外联机的时候:<br> <center><img src="0320nat_files/nat-1.jpg" nosave="" border="0" height="108" width="515"></center> <ol><li><font color="#000066">这个 client 的 gateway 设定为 NAT 主机,所以当要连上Internet 的时候,该封包就会被送到 NAT 主机啦,这个时候的封包 Header 之source IP 为 192.168.1.100 喔;</font></li><li><font color="#000066">而透过这个 NAT 主机,她会将 client 的对外联机封包的source  IP ( 192.168.1.100 ) 伪装成 ppp0 ( 假设为拨接情况 )这个接口所具有的公共IP 啰,因为是公共 IP 了,所以这个封包就可以连上 Internet 了!同时 NAT 主机并且会记忆这个联机的封包是由哪一个( 192.168.1.100 ) client 端传送来的;</font></li><li><font color="#000066">由 Internet 传送回来的封包,当然由 NAT 主机来接收了,这个时候,NAT 主机会去查询原本记录的路由信息,并将目标 IP 由 ppp0 上面的公共 IP 改回原来的192.168.1.100 ;</font></li><li><font color="#000066">最后则由 NAT 主机将该封包传送给原先发送封包的 Client啰!</font></li></ol> <br>如果是在 iptables 的内建 table 当中,与 NAT 有关的就是 nat table 的POSTROUTING 那个链了!就是<a href="http://linux.vbird.org/linux_server/0250simple_firewall.php#fig_09">简易防火墙当中的图九的示意图</a>喔!也就是说,整个封包其实只有经过NAT 主机的 iptables 机制在伪装 IP 与修改路由信息而已,并没有进入 NAT 主机内部啦!^_^!由上面的信息我们可以知道一件事,那就是:『<font color="#000066">您的NAT 主机至少需要有一个私有 IP 与一个公共 IP 才行</font>』喔!而且,『<font color="#000066">NAT主机,一般来说,也是一部 Router 喔!</font>』如果 <font color="#000066">Router两边都是私有 IP 或都是公共 IP 时,Linux 主机只要有 Router 的功能即可,若是两边分别为公共与私有IP 时,才需要以 iptables 来启动 NAT 的功能</font>。<br> <br>其实 NAT的功能也可以简单的这样想:『当您在私人赛车场上比赛的时侯,不必管您是否有注册过的车牌﹔但开到马路上却非得要一个监理站核发的车牌不可。如果您要将跑车开到街道上,必须要改挂一个合法的车牌。这时候,赛车场老板(NAT)自有办法帮您弄一个就是了。』!这样可以了解了吗?<br> <br><hr width="100%"><a name="NAT_figure"></a><font color="#000099">联机示意图:</font><br> <br>由上面的说明您应该可以了解了吧?!没错,您的 NAT 主机上面,至少需要『<font color="#000066">两块网络接口</font>』请注意,鸟哥说的是『网络接口』而不是『网络实体适配卡』呦!以拨接为例,由于拨接之后会产生ppp0 这个拨接后产生的网络接口,加上原本的实体网络接口,那么自然就有两个以上的网络接口啰!这么说应该很容易了解了吗?底下我以两块实体网络适配卡的布线情况作为联机的示意图,至于一块网络卡进行NAT 的图示,将在待会说明啰。</ul><center><img src="0320nat_files/0320nat-2.jpg" nosave="" height="179" width="474"><br><a name="fig_01"></a><font color="#000066">图一、两块网络卡的 NAT 主机配置</font></center><ul>在上面的图示当中,很清楚吧!我们的 Linux 共有两块实体适配卡,一块接在调制解调器 上面,一块接在 Hub/Switch 上面,并且以此 Hub/Switch连接所有的局域网络内的计算机,以组成内部的私有网域!鸟哥个人是比较喜欢这样的接线方式啦!不过,人人各有其所好,而且这样的情况也不见得适合所有的人,所以还是得了解一下其它种类的连接方法!好吧,等一下再告诉您~^_^""<br> <br><hr width="100%"><a name="NAT_kernelversion"></a><font color="#000099">核心版本:</font><br> <br>我们在<a href="http://linux.vbird.org/linux_server/0250simple_firewall.php">简易防火墙设定</a>当中就提过了,核心与防火墙机制是有关系的,也就是:<br> <ul><li><font color="#000066" face="SimSun">Kernel 2.2.xx :使用 ipchains做封包伪装的技术;</font></li><li><font color="#000066" face="SimSun">Kernel 2.4.xx :使用 iptables做封包伪装的技术!</font></li></ul> <br>所以,还是请仔细的检查一下您的核心版本吧!(用 <a href="http://linux.vbird.org/linux_basic/0440processcontrol.php#uname">uname</a>-r 来察看)。简单的判别方法,如果是 Red Hat 7.0 ( 含 7.0 )以前的版本,使用的是2.2.xx 的核心,自然只有 ipchains 而已,而如果是 Red Hat 7.1 ( 含 7.1 )以后的版本,则使用的是 Kernel 2.4.xx ,因此最好使用 iptables 的技术!因为2.4.xx 的 IP 处理模块当中,大部分都是针对 iptables 来作为处理的软件, ipchains的模块已经不含在 2.4.xx 里头了!由于我是以 Red Hat 7.2, 7.3 与 9 作为范例的,所以自然以iptables 为准啰!如果还想要以 ipchains 来进行架设 NAT 的朋友,不妨参考一下底下这篇:<br> <ul><li>NAT 服务器:<a href="http://linux.vbird.org/linux_server/redhat6.1/linux_22nat.php">http://linux.vbird.org/linux_server/redhat6.1/linux_22nat.php</a></li></ul> <br><hr width="100%"><a name="Who_Need"></a><font color="#000099">谁需要 NAT架设:</font><br><font color="#000000"> </font><br><font color="#000000">由前面 NAT( Network Address Translation ) 的功能介绍,我们知道他可以作为频宽分享的主机,当然也可以管理一群在NAT 主机后面的 Client 计算机!呵呵!所以 NAT 的功能至少有这两项:</font><br><font color="#000000"> </font><ul><li><font color="#000066">频宽分享</font><font color="#000000">:我想,架设NAT 的朋友大部分都是希望可以达到频宽分享的目的的!这毕竟是 NAT 主机的最大功能啰!</font></li><li><font color="#000066">安全防护</font><font color="#000000">:咦!关安全防护什么事呀!?别忘了,NAT 之内的 PC 联机到 Internet 上面时,他所显示的 IP 是 NAT 主机的公共 IP
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?