简易NAT服务器

来源:岁月联盟 编辑:zhuzhu 时间:2007-02-11
简易NAT服务器内容简介: 简易 NAT 服务器


------------------------------------------------------------------------------------------------

1. 学习本章的必备技巧

2. 什么是 NAT 呀: NAT 的功能 联机示意图 核心版本 谁需要 NAT 架设

3. 一块网络卡的 NAT 架设: 固定 IP

4. 两块网络卡的 NAT 架设

5. 观察路由信息

6. 客户端的设定: Windows Linux

7. 安全性

------------------------------------------------------------------------------------------------


学习本章的必备技巧:


  没错啦!又要来说教了! ^_^"" 请尽量将 Linux 基础 看完吧!再不然的话,最起码底下的资料先读完吧!因为我们需要动用到编辑,所以 vi 需要了解;开机时需要就激活 NAT 的技术,所以需要了解开机关机流程;需要下达指令,所以要了解 BASH 及 shell script 的写法;网络的知识当然不能不知道,所以 网络基础 与局域网络架构 就必须要清楚;再来,要连上 Internet 才有 NAT 的功能,所以当然不能不看连上 Internet 啰!另外,我们以 iptables 来建置 NAT ,所以也需要知道 认识网络安全啰!

· 认识 vi

· 开机关机流程

· BASH

· shell scripts

· 网络基础

· 局域网络架构

· 连上 Internet

· 常用网络指令

· 认识网络安全与 iptables

  总之,能够将前面的全部都看完,嘿嘿!是一件很不错的事情啦!另外,如果想要评估各种频宽分享的方式,可以来 频宽分享 查看一下,如果只是要分享频宽的话,倒不一定需要用到 Linux 的哩!使用 Linux 的最大优点是来自于可以有很多的附加价值就是了!
返回页首
------------------------------------------------------------------------------------------------

什么是 NAT 呀:

· NAT 的功能:


  我想,大家对于 NAT 一定是有所耳闻才对,那么什么是 NAT 呢?NAT 其实是 Network Address Transfer 的简写,简单的说,就是将要传送出去的封包进行 IP 转换的动作啦!由 TCP 封包的架构图,我们可以发现 TCP 封包里头有来源与目的地的 IP 及 port 之信息在 Header 里面,那么如果透过某些技术,是否可以将这个 header 的内容改变呢?当然可以啰!就直接使用 iptables 即可!他可以帮助我们将打包过后的 TCP 封包上面的 header 进行修改的动作,以方便我们工作!而其中用的最广泛的例子就属:频宽分享 的部分了!怎么说呢?很简单呀!还记得我们在 局域网络架构 里头提到的网络架设方法吧?对啦!就是利用一部 Linux 当作主机,而将我们对内( intranet )与对外( Internet )的连接分离开来,以达到良好的隔绝效果,此外,由于 内部私有网络 的私有 IP 并不能直接连接上 Internet 上面,所以你的所有内部的私有 IP 的计算机,将无法直接连通到 Internet 上面去,阿!那岂不是很无趣?!再想一想,咦!我们的 Linux 主机不是有『对内及对外』的两组 IP 吗?一组是私有 IP ( 跟 intranet 同一个网段 ) 一组则是可以连上 Internet 的实体 IP ,而我们的私有网域的所有计算机都是以 Linux 主机为 Gateway 的,那么如果我在我的对内的所有私有 IP 在对外联机的时候 ( 透过 Linux 主机 ),将他的 TCP 封包的 header 资料里面,那个 sourec IP and port (来源 IP 与对应的埠口)改成 Linux 的对外的 IP 与埠口,那么不就可以连出去 Internet 啦!哈哈!没错!这就是 NAT 的概念之一啦!



  如上图所示,当我的区域内的具有 192.168.1.100 的 client 要对外联机的时候:

1. 这个 client 的 gateway 设定为 NAT 主机,所以当要连上 Internet 的时候,该 TCP 封包就会被送到 NAT 主机啦;

2. 而透过这个 NAT 主机,她会将 client 的对外联机的封包之 source 的 IP ( 192.168.1.100 ) 改成 ppp0 ( 假设为拨接情况 )这个实体 IP 啰,同时并记忆这个联机的封包是由哪一个 ( 192.168.1.100 ) client 端传送来的;

3. 由 Internet 传送回来的封包,当然由 NAT 主机来接收了,这个时候, NAT 主机会去查询原本记录的路由信息,并将目标 IP 改回原来发送出此一封包的 Client 端;

4. 最后则由 NAT 主机将该封包传送给原先发送封包的 Client 啰!

  其实这也很好理解啦,你可以想成这样:『当您在私人赛车场上比赛的时侯,不必管您是否有注册过的车牌﹔但开到马路上却非得要一个监理站核发的车牌不可。如过您要将跑车开到街道上,必须要改挂一个合法的车牌。这时候,赛车场老板(NAT)自有办法帮您弄一个就是了。』!这样可以了解了吗?

· 联机示意图:


  由上面的说明您应该可以了解了吧?!没错,你的 NAT 主机上面,至少需要『两块网络接口』请注意,我说的是『网络接口』而不是『网络实体适配卡』呦!以拨接为例,由于拨接之后会产生 ppp0 这个拨接后产生的网络接口,加上你再提供一个 IP alias ,那么自然就有两个以上的网络接口啰!这么说应该很容易了解了吗?底下我以两块实体网络适配卡的布线情况作为联机的示意图,至于一块网络卡进行 NAT 的图标,将在待会说明啰。



  在上面的图标当中,很清楚吧!我们的 Linux 共有两块实体适配卡,一块接在调制解调器 上面,一块接在 Hub/Switch 上面,并且以此 Hub/Switch 连接所有的局域网络内的计算机,以组成内部的私有网域!鸟哥个人是比较喜欢这样的接线方式啦!不过,人各有志,而且这样的情况也不见得适合所有的人,所以还是得了解一下其它种类的连接方法!好吧,等一下再告诉你~

· 核心版本:


  嘿嘿!干嘛呀!怎么又提到核心版本了?这个就得特别说明一下啰!因为不同的核心版本所提供的 TCP 封包的伪装技术,及防火墙软件都不相同,所以需要特别的关心一下您的核心版本!首先,用『uname -r 』看一下你的版本呢,如果是出现 2.2.xx 的话,则是属于较早期的核心,那个是使用 ipchains 作为技术的,至于如果是 2.4.xx 的话,那么就是属于 iptables 的模块较棒啰!

o Kernel 2.2.xx :使用 ipchains 做封包伪装的技术;

o Kernel 2.4.xx :使用 iptables 做封包伪装的技术!

  简单的判别方法,如果是 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 作为范例的,所以自然以 iptables 为准啰!如果还想要以 ipchains 来进行架设 NAT 的朋友,不妨参考一下这篇旧的文章:

o NAT 服务器

· 谁需要 NAT 架设:


  由前面 NAT( Network Address Transfer ) 的功能介绍,我们知道他可以作为频宽分享的主机,当然也可以管理一群在 NAT 主机后面的 Client 计算机!呵呵!所以 NAT 的功能至少有这两项:
o 频宽分享:我想,架设 NAT 的朋友大部分都是希望可以达到频宽分享的目的的!这毕竟是 NAT 主机的最大功能啰!

o 安全防护:咦!关安全防护什么事呀!?别忘了, NAT 之内的 PC 联机到 Internet 上面时,他所显示的 IP 是 NAT 主机的实体 IP ,所以 Client 端的 PC 当然就具有一定程度的安全了!最起码人家在 scan 的时候,就侦测不到你的 Client 端的 PC 啦!安全多了!
返回页首
------------------------------------------------------------------------------------------------

一块网络卡的 NAT 架设:

  刚刚上面我们已经提过了,要架设 NAT 的话,只要『两块网络接口』就够了,倒不一定需要两块『实体网络卡( NIC )』,是的!所以我们先以较为便宜的方式(因为少了一块网络卡呀!)来介绍 NAT 的架设!底下是我们介绍的安装步骤:

1. 关闭一些系统服务的 port :

  为了安全起见,还是检查一下吧!

  好了,首先,我们需要先来了解一下,咦!我的 Linux 主机的功用为何?!如果只是单纯的要作为 NAT 的话,那么 Linux 主机所开放的 port 是越少越好!鸟哥可不希望你开机了大约一个星期,就开始苦苦哀嚎说自己的主机无法以 root 登入了......。关闭 port 的方法与选择『系统一定需要的服务』的介绍在 限制联机的埠口 里面已经说的很清楚了!你可以 按这里 来了解到底什么是『一定要激活的服务』。



实体线路配置图:

  怎么安装联机呢?赶快买线材来架设吧!

  由于 Linux 主机只有一张网络卡,所以所有的装置(包括 Linux 主机, client 端计算机, 数据几等等)都需要接在 Hub/Switch 上面,有点像底下的样子:



1. 这个时候请特别留意啦!如果是使用 ADSL 拨接制的话,那么应该会有安装 rp-pppoe 这个东西,并且在拨接之后会产生 ppp0 这个网络接口,同时不要忘了,激活网络卡的时候不是就已经有 eth0 这个实体网络界面的设定吗?,嘿嘿!那么我们不是就有两个网络接口了吗?!没错!就是这样!但是,如果是 Cable 或者是其它的固定制的方法的话,那么跟这个也差不多啦!不过由于 Cable 的方式没有自动产生两个以上的网络界面,所以就需要设定 IP Alias 啰,也就是 eth0:0 啦!亦即就是以 eth0 跟 eth0:0 这两个接口来联机啰!反正,只有一张网络卡,也可以进行 NAT 的啦! ^_^""
 
2. 设定网络接口:

分别以拨接、 Cable 及固定 IP 为例啦!
 
ADSL拨接制 :

  在进入 Linux 并激活网络卡之后,我们会得到 eth0 这个界面,再加上拨接之后的 ppp0 界面,所以我们就已经会有个两网络接口,分别是 ppp0, eth0!此外,我预计的私有网域的 IP 选用 192.168.1.0/24 这个 C Class 的网域,其中, Linux NAT 主机的私有 IP 选择为 192.168.1.2 这一个!
 
  第一个网络接口 -- ppp0 -- 的设定:这个东西应该不难吧!就是我们在 连上 Internet 一文里头提到的关于 rp-pppoe 的拨接上网方式。
 
  实体网络卡 -- eth0 -- 的设定:请注意,如果您要同时使用 ppp0 及 eth0 ,那么请在拨接之前激活 eth0 吧!以取得内部的 eth0 这个网络界面的设定!( 注:如果你不知道如何设定的话,那么就请照我的方式来填写即可 ):



Cable 浮动式:


  在 Cable 的情况又不太相同了!这个时候只有两块网络接口,分别是 eth0, eth0:0 啰!设定为:
 
  实体网络卡 -- eth0 -- 的设定:请注意,由于 cable 使用的是 DHCP 主机,所以这个时候请特别留意你底下的设定呦!( 注:如果你不知道如何设定的话,那么就请照我的方式来填写即可 ):



  虚拟网络接口 --eth0:0 的设定:在 IP Alias 的设定当中,我们已经在 Router 当中说明过多次了!请务必回到该章节再读取一次,如果您不记得如何设定的原理的话!



固定 IP 的情况:

  跟 cable 的设定几乎一模一样,只有两个接口,分别是 eth0, eth0:0,需要特别注意的是 eth0 这个东西,你必须要『填写正确的 IP, netmask, network, broadcast 而且 ONBOOT=yes 才可以!』,而 eth0:0 则与上面相同!
 
激活私有网域的 IP 网络接口:

  激活之后顺便观察一下路由的信息!



4.设定其它档案:

  还有一些网络的相关档案要设定呦!/etc/hosts, /etc/resolv.conf, /etc/sysconfig/network,
别忘了我们还有其它的档案要设定呦!很重要的:



5.设计 NAT 的 shell scripts :

  直接将一些指令写在 scripts 里头执行较快啦!

  正确的情况之下,目前你的 Linux 主机上面应该是已经可以正常的对外联机的才对!而且内部也已经可以正确的联机成功了才对!如果还没有成功的话,请赶快再到 局域网络设定 里头去查一查资料去!好了,接着下来只要执行一个程序,嘿嘿!就可以将 NAT 激活喔!这个就好玩了!因为基本上,我们使用的是 iptables 这个东西,自然就需要这个 ip_tables 的模块了!而查看模块与加载模块的指令分别为 lsmod, modprobe 哩!好了,你可以直接在命令提示字符底下进行工作:



  当然啦,如果要设计的人性化一点,可以使用底下的 script 来达成:





  呵呵!很简单吧!这样就 OK 啦!不过请特别留意上面表格当中的那个黄色的字体,其中, EXIF 指的是对外联机的网络接口,而 EXNET 指的则是要伪装 IP 的内部虚拟网域的 C Class 的网域数据啰!然后你将这个文件名称为 nat.sh 的资料,放置在你的 /usr/local/nat 底下,你可以这样做:




  这样一来,下次开机就可以自动的连上 ADSL 之外,还可以自动的执行 NAT 的功能呦!
 
6. Client 端的设定参数:包含的是网络的设定参数而已!这个我们留在最后面讲!

返回页首


------------------------------------------------------------------------------------------------

两块网络卡的 NAT 架设:


  真是的,这个部分的联机架设在 局域网络联机 当中已经提过很多遍了!这里不再重复的说明!仅列出几个重要的地方,基本上,跟刚刚一张网络卡的设定方式几乎完全相同,只是那个 eth0:0 变成了 eth1 而已啦!我的设定为:

· eth0 为对内的实体网络卡,具有私有 IP ,其 IP 为 192.168.1.2 。

· eth1 为对外的实体网络卡,被用来进行 ADSL 的拨接,所以开机的时候不要设定 on !

  同样的,我们的设定方式为:

1. 关闭一些系统服务的 port :

  跟 上面 的一模一样,这里就不再多做说明!
 
2. 实体线路配置图:

也跟刚刚上面 第一个图标 提到的差不多,不再说明!
 
3. 设定网络接口:

  重要的地方在安装第二块网络卡!安装网络卡的相关技巧请前往 连上 Internet 参考!不过,对于第二块网络卡的安装,在这里有些建议:基本上,第二张网络卡最好不用使用与第一张相同芯片的卡,例如你第一张卡使用 RTL 8139,那第二张卡最好使用别的卡。因为鸟哥曾经发现,在鸟哥的 RedHat 6.1 英文版中,安装两块相同的(同公司出的) RTL8139 ,结果竟然两张卡的输出输入都是经由第一张!也就是说,第二张卡根本就没有用处!并且,也很容易发生 eth1 与 eth0 捉错的情况!所以,请记得,『第二张网络卡尽量不要使用与第一张网络卡相同芯片的卡!』当然,你要使用同一个芯片的网络卡也是可以啦!目前我的机器上面就是使用两块 RTL8139 的网络卡,不过,在安装的时候请特别留意,不要同时安插两块,最好是一块安装完毕之后,再安装另一块!会比较好一点啦!安装的步骤可以是(请注意,我以 ADSL 拨接为例的,其中, eth0 为对内, eth1 为对外,请依照您的设定来修正呢!):

o 关机、硬件安装:这个不用再提了吧!,先关机,然后拆开外壳,插入PCI网络卡即可;

o 开机、硬件扫瞄:然后再开机,而于开机的过程中,你的 Linux 会主动去找到这一张网络卡(如果这张卡是有被 Linux 支持的!);

o 安装网络卡驱动程序:如果在上一步骤中,你的网络卡并不能被捉到,哪就比较伤脑筋!请到连上
Internet 参考网络卡的驱动程序安装方法

o 检视设定 /etc/sysconfig/network-scripts/ifcfg-eth1:在安装完了网络卡的驱动程序之后,在 /etc/sysconfig/network-scripts/ 中,应该会有 ifcfg-eth1 这一个档案。请设定他吧!因为是对外卡,我这里假设他是利用 ADSL 拨接的,所以可以是这样:



1. 这样就成功啰!很简单吧!
 
2. 设定其它档案:

  其它一些网络的相关档案也要设定!亦即/etc/hosts, /etc/resolv.conf, /etc/sysconfig/network,设定的方式跟 上面 一样!
 
3. 设计 NAT 的 shell scripts :

  基本上,设定的方式跟上面也是一模一样的啦!你依旧可以仅使用上面的 script 来进行 NAT 的设定,只是要注意那个 黄色字体 部分的设定,如果你跟我的情况不同,那么就需要修改一下啦!赶快 下载 script 吧!

------------------------------------------------------------------------------------------------

观察路由信息:

  在整个 NAT 的设定当中,最经典的错误联机讯息来自于 路由信息 的错误啦!这个在我们的 连上 Internet 及 网络侦测 文章当中已经说明过了,不过,我们这里再次提醒一下!免得您又犯了同样的错误了!由于网络在进行连接的时候,都会指定所谓的 router 或者是 gateway 的设定,除非是来自于广播的网域之联机。而我们在设定网络时,常常会犯了一个错误,那就是指定错了 Gateway 了!请你参考一下 /etc/sysconfig/network 的修改方式,在 ADSL 拨接及 Cable 联机时,请『务必』不要设定 gateway 才好!

  再来,请常下达 route 的指令来观察一下您的 linux 主机的路由设定是否正确呦!

返回页首


------------------------------------------------------------------------------------------------

客户端的设定:
  在 Client 端的设定真是简单的可以了!由于我们上面的网域设定的是 192.168.1.0/24 这个 C Class 的私有网域,所以你只要记得几件事情:

1. network 设定需要为: 192.168.1.0

2. broadcast 设定需要为: 192.168.1.255

3. netmask 设定需要为 255.255.255.0

4. IP 设定需要为 192.168.1.1 ~ 192.168.1.254 之一,且『不能重复』

5. Gateway 或者说是 通讯闸 需要设定为你的 Linux 的对内 IP ,以我的例子来说,就是 192.168.1.2 !

6. DNS 的设定:这个最容易出错了,你的 DNS 设定需要是你的 ISP 给你的 DNS IP,如果你不知道的话,可以填入 168.95.1.1 这一个中华电信的 DNS 或者是 139.175.10.20 这一个 SeedNet 的 DNS 即可!千万不要设定为 192.168.1.2 呦!会连不出去!
大致上就是这样啦!至于 Client 端通常是 Windows ,他的设定可以参考一下 这里 说!至于 Linux 端则需要查看一下 连上 Internet 里面的固定 IP 的设定啦!

------------------------------------------------------------------------------------------------

安全性:

  请注意,在这个例子当中,我们并没有使用到封包分析的动作,有的只有 IP 伪装而已,所以:

· 对于 Client 端来说,由于已经经过了 IP 伪装的功能,所以基本上,你通过 NAT 主机连出去的封包的 IP 都会是『 NAT 主机对外的实体 IP 』,因此对于内部 Client 端而言,由于网络 Cracker 几乎都是根据 IP 来进行破坏,而因为你连出去的封包 IP 是 NAT 主机的实体 IP ,自然你的 Client 端就比较安全多了!基本上, Client 端在 NAT 之内,不要安装防火墙软件也还好,但是『防毒软件一定要安装!』因为你毕竟会接收电子邮件呀等等的,所以还是可能会中毒啦!!

· 对于 Server 端来说,其实这样的一个主机并不是十分的安全的,因为我们并没有设定防火墙的规则,好家在的是,我们在一开始就将所有的主机的 port 都关掉了( 请注意,这些 port 关掉之后,完全不会影响到 NAT 主机的频宽分享功能,所以不用担心! ),因此还算有点小安全啦!无论如何,小心驶得万年船,所以在没有必要的时候,而且你只是要作为 NAT 主机的时候,请千万将 Linux 主机的所有的 port 都先关掉呦!
至于增加安全性方面,底下我们会简介一下 iptables 配合 TCP_Wrappers 的方法来抵挡部分的 IP 与部分的服务呦.

(来源:鸟哥私房菜)