新睿云

> NAT网关 > 如果配置NAT来做IP分享器呢?

如果配置NAT来做IP分享器呢?

作者/来源:新睿云小编 发布时间:2019-08-01

我想,大家对于NAT一定是有所耳闻才对,不过,到底什么是NAT呢?NAT其实是Network Address Translation的简写,字面上的意思是『网路位址的传送』,他主要的功能就是在提供内部私有网路的电脑之频宽分享了。简单的说,NAT的功能就是『IP分享器』咯!(注:NAT主机的功能相当的多,不过,这里我们仅说明频宽分享的部分!)。

NAT的功能

我们由网路基础当中知道,要能够连接上Internet必须要具有『公共IP (Public IP)』才行,内部私有IP (Private IP)是不能直接与Internet进行资料沟通的。好了,今天假设您是一家公司的主管,或者是一间学校的资讯主任,而且您所负责的单位内有20部电脑好了,这20部电脑都需要能够连上Internet ,并可以进行任何Internet的服务要求,请问您是否需要具备有20个公共IP呢?如果真的要提供20个公共IP的话,以最经济的价格来说,我们可以申请Seednet的512/64 (下载/上传)拨接制ADSL ,每个专线都可以具有五个IP ,因为我们有20部主机,所以就需要四条电话线~呵呵!怕了吧!光是接线与申请ADSL的流程就会让人崩溃,更不用说申请到之后还需要在每一部电脑上面设定拨接、管制电脑使用性、进行防毒等等的工作,光是用想的,就已经很头大了,更不用说实际去作.....

那么应该要怎么办呢?比较聪明的朋友已经想到要去买IP分享器来分享网路频宽了!那么Linux是否能够达到IP分享器的功能!?当然可以啦!那就是NAT主机的能力之一啰!我们在之前的Router设定当中,提过路由的概念了,封包的传送主要是透过路由的资讯,但是,私有路由是不能直接与Internet沟通的啊!因此用Linux作为Router时,如果Linux主机本身就是仅有私有IP ,自然也就无法直接连接到Internet上面去了。

到底该如何是好?呵呵!这个时候就得要回头谈一谈TCP封包的概念咯。由网路基础章节里面提到的TCP封包的架构图,我们可以发现TCP封包里头有来源与目的地的IP及port的资讯在Header里面,那么如果透过某些技术,来改变TCP封包的header呢?如果能够将TCP封包的来源IP由本来的Private IP变成Public IP的话,不就可以连接到Internet了吗?!呵呵!没错没错!谈到重点了!就是这样啦!NAT主机的重要功能之一就是将来自内部Client端电脑封包的Header的IP 『伪装』成公共IP ,而提供Client端连上Internet的一个方法!(注:当然啦, IP分享器也是使用同样的道理!)。那么Linux是用什么机制达到这样的功能?还记得简易防火墙设定当中提到的iptables吧?!iptables可以进行封包的分析,当然,他还可以进行封包资讯的修改呢!那么整个流程是如何呢?如下图所示,当我的区域内的具有192.168.1.100的client要对外连线的时候:

NAT1

这个client 的gateway 设定为NAT 主机,所以当要连上Internet 的时候,该封包就会被送到NAT 主机啦,这个时候的封包Header 之source IP 为192.168.1.100 喔;

而透过这个NAT 主机,她会将client 的对外连线封包的source IP ( 192.168.1.100 ) 伪装成ppp0 ( 假设为拨接情况)这个介面所具有的公共IP 啰,因为是公共IP 了,所以这个封包就可以连上Internet 了!同时NAT 主机并且会记忆这个连线的封包是由哪一个( 192.168.1.100 ) client 端传送来的;

由Internet 传送回来的封包,当然由NAT 主机来接收了,这个时候, NAT 主机会去查询原本记录的路由资讯,并将目标IP 由ppp0 上面的公共IP 改回原来的192.168.1.100 ;

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

如果是在iptables的内建table当中,与NAT有关的就是nat table的POSTROUTING那个链了!就是简易防火墙当中的图九的示意图喔!也就是说,整个封包其实只有经过NAT主机的iptables机制在伪装IP与修改路由资讯而已,并没有进入NAT主机内部啦!^_^!由上面的资讯我们可以知道一件事,那就是:『您的NAT主机至少需要有一个私有IP与一个公共IP才行』喔!而且,『NAT主机,一般来说,也是一部Router喔!』如果Router两边都是私有IP或都是公共IP时,Linux主机只要有Router的功能即可,若是两边分别为公共与私有IP时,才需要以iptables来启动NAT的功能。

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

连线示意图:

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

NAT2

图一、两块网路卡的NAT 主机配置

在上面的图示当中,很清楚吧!我们的Linux 共有两块实体介面卡,一块接在数据机上面,一块接在Hub/Switch 上面,并且以此Hub/Switch 连接所有的区域网路内的电脑,以组成内部的私有网域!鸟哥个人是比较喜欢这样的接线方式啦!不过,人人各有其所好,而且这样的情况也不见得适合所有的人,所以还是得了解一下其他种类的连接方法!好吧,等一下再告诉您~ ^_^""

核心版本:

我们在简易防火墙设定当中就提过了,核心与防火墙机制是有关系的,也就是:

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

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

所以,还是请仔细的检查一下您的核心版本吧!(用uname-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的朋友,不妨参考一下底下这篇:

NAT伺服器:http://linux.vbird.org/linux_server/redhat6.1/linux_22nat.php

谁需要NAT架设:由前面NAT( Network Address Translation )的功能介绍,我们知道他可以作为频宽分享的主机,当然也可以管理一群在NAT主机后面的Client电脑!呵呵!所以NAT的功能至少有这两项:

频宽分享:我想,架设NAT的朋友大部分都是希望可以达到频宽分享的目的的!这毕竟是NAT主机的最大功能啰!

安全防护:咦!关安全防护什么事呀!?别忘了, NAT之内的PC连线到Internet上面时,他所显示的IP是NAT主机的公共IP ,所以Client端的PC当然就具有一定程度的安全了!最起码人家在进行port scan的时候,就侦测不到您的Client端的PC啦!安全多了!

NAT 的设定:

NAT 的设定可以使用一块网路卡,当然也可以使用两块网路卡啦!鸟哥个人还是比较建议使用两块网路卡来完整的隔开私有网域的内外部分,毕竟还是比较安全一些!不怕内部私有网域的高手作怪啊!^_^

一块网路卡的NAT架设:

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

关闭一些系统服务的port 

为了安全起见,还是检查一下吧!首先,我们需要先来了解一下我的Linux主机的功用为何?!如果只是单纯的要作为NAT的话,那么Linux主机所开放的port是越少越好!鸟哥可不希望您开机了大约一个星期,就开始苦苦哀嚎说自己的主机无法以root登入了......。关闭port的方法与选择『系统一定需要的服务』的介绍在限制连线的埠口里面已经说的很清楚了!我以Red Hat 9来说明: 1.使用ntsysv设定开机时启动的服务项目:

[root@test root]#ntsysv

只要选择底下几个服务即可:

atd, cron, iptables, keytables, network, random, syslog, xinetd

2.重新开机让设定生效:

[root@test root]#reboot

3.观察目前的port开启多少个?

[root@test root]#netstat -an | more

Active Internet connections (servers and established)

Proto Recv-Q Send-Q Local Address Foreign Address State

Active UNIX domain sockets (servers and established)

Proto RefCnt Flags Type State I-Node Path

unix 7 [ ] DGRAM 944 /dev/log

unix 2 [ ] DGRAM 3162963

unix 2 [ ] DGRAM 739227

unix 2 [ ] DGRAM 739189

unix 2 [ ] DGRAM 1070

unix 2 [ ] DGRAM 953

unix 2 [ ] STREAM CONNECTED 690

#注意:尽量不要看到有LISTEN的咚咚!最多就是有ssh就好了!除非您有其他的服务!

实体线路配置图

怎么安装连线呢?赶快买线材来架设吧!由于Linux 主机只有一张网路卡,所以所有的装置(包括Linux 主机, client 端电脑, 数据机等等)都需要接在Hub/Switch 上面,有点像底下的样子:

NAT3

图二、一块网路卡的NAT 主机配置

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

设定网路介面

我们分别以拨接、 Cable 及固定IP 为例啦!

ADSL拨接制:

在进入Linux并启动网路卡之后,我们会得到eth0这个界面,再加上拨接之后的ppp0界面,所以我们就已经会有个两网路介面,分别是ppp0, eth0!此外,我预计的私有网域的IP选用192.168.1.0/24这个C Class的网域,其中, Linux NAT主机的私有IP选择为192.168.1.2这一个!

[root@test root]#vi /etc/sysconfig/network-scripts/ifcfg-eth0

DEVICE=eth0

BOOTPROTO=static

BROADCAST=192.168.1.255

IPADDR=192.168.1.2

NETMASK=255.255.255.0

NETWORK=192.168.1.0

ONBOOT=yes< ==重要的地方在这里!请设定为yes呦!

#如果您不晓得应该如何设定的话,就照上面的打就好了!

第一个网路介面-- ppp0 --的设定:这个东西应该不难吧!就是我们在连上Internet一文里头提到的关于rp-pppoe的拨接上网方式。

实体网路卡-- eth0 --的设定:请注意,如果您要同时使用ppp0及eth0 ,那么请在拨接之前启动eth0吧!以取得内部的eth0这个网路界面的设定!(注:如果您不知道如何设定的话,那么就请照我的方式来填写即可):

Cable浮动式:

在Cable的情况又不太相同了!这个时候只有两块网路介面,分别是eth0, eth0:0啰!设定为:

[root@test root]#vi /etc/sysconfig/network-scripts/ifcfg-eth0

DEVICE=eth0

BOOTPROTO=dhcp<==这里最重要!

BROADCAST=192.168.100.255

IPADDR=192.168.100.1

NETMASK=255.255.255.0

NETWORK=192.168.100.0

ONBOOT=yes

#如果您不晓得应该如何设定的话,就照上面的打就好了! [root@test root]#vi /etc/sysconfig/network-scripts/ifcfg-eth0:0

DEVICE=eth0:0

BOOTPROTO=static

BROADCAST=192.168.1.255

IPADDR=192.168.1.2

NETMASK=255.255.255.0

NETWORK=192.168.1.0

ONBOOT=yes

#如果您不晓得应该如何设定的话,就照上面的打就好了!

实体网路卡-- eth0 --的设定:请注意,由于cable使用的是DHCP主机,所以这个时候请特别留意您底下的设定呦!(注:如果您不知道如何设定的话,那么就请照我的方式来填写即可):

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

固定IP的情况:

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

启动私有网域的IP网路介面:

启动之后顺便观察一下路由的资讯! [root@test root]#ifdown eth0

[root@test root]#ifup eth0

[root@test root]#route

Kernel IP routing table

Destination Gateway Genmask Flags Metric Ref Use Iface

swks81-1.adsl.s * 255.255.255.255 UH 0 0 0 ppp0

192.168.1.0 * 255.255.255.0 U 0 0 0 eth0

127.0.0.0 * 255.0.0.0 U 0 0 0 lo

default swks81-1.adsl.s 0.0.0.0 UG 0 0 0 ppp0

#嘿嘿!这样就是成功啦!注意,上面这个路由是以adsl拨接为例的!

设定其他档案

还有一些网路的相关档案要设定呦!/etc/hosts, /etc/resolv.conf, /etc/sysconfig/network,

别忘了我们还有其他的档案要设定呦!很重要的: 1.将私有IP加入到/etc/hosts里面去吧!

[root@test root]#vi /etc/hosts

127.0.0.1 localhost

192.168.1.1 linux001

192.168.1.2 linux002

.......(略)......

192.168.1.100 linux100

...... .(略)......

192.168.1.254 linux254

2.将DNS的IP写到/etc/resolv.conf里面去,这里以中华电信跟Seednet为例

[root@test root]#vi /etc/resolv.conf

nameserver 168.95.1.1

nameserver 139.175.10.20

3.设定主机名称跟gateway与否:

[root@test root]#vi /etc/sysconfig/network

NETWORKING=yes

HOSTNAME=your.domain.name<==写您的主机名称

GATEWAY=<==除非您是固定制的,不然这个不要填入任何东西!

设计NAT的shell scripts

直接将一些指令写在scripts里头执行较快啦!正确的情况之下,目前您的Linux主机上面应该是已经可以正常的对外连线的才对!而且内部也已经可以正确的连线成功了才对!如果还没有成功的话,请赶快再到区域网路设定里头去查一查资料去!好了,接着下来只要执行一个程式,嘿嘿!就可以将NAT启动喔!这个就好玩了!因为基本上,我们使用的是iptables这个东西,自然就需要这个ip_tables的模组了!而查看模组与载入模组的指令分别为lsmod,modprobe哩!好了,您可以直接在命令提示字元底下进行工作: echo "1" > /proc/sys/net/ipv4/ip_forward

modprobe ip_tables

modprobe ip_nat_ftp

modprobe ip_nat_irc

modprobe ip_conntrack

modprobe ip_conntrack_ftp

modprobe ip_conntrack_irc

/sbin/iptables -F

/sbin/iptables -X

/sbin/iptables -Z

/sbin/iptables - F -t nat

/sbin/iptables -X -t nat

/sbin/iptables -Z -t nat

/sbin/iptables -P INPUT DROP

/sbin/iptables -P OUTPUT ACCEPT

/sbin/iptables -P FORWARD ACCEPT

/sbin/iptables -t nat -P PREROUTING ACCEPT

/sbin/iptables -t nat -P POSTROUTING ACCEPT

/sbin/iptables -t nat -P OUTPUT ACCEPT

/sbin/iptables -t nat -A POSTROUTING -o ppp0 -s 192.168.1.0/24 - j MASQUERADE 还记得我们在简易防火墙设定里面有提供一支script吧?那支script名为iptables.rule,该script同时可以提供NAT的功能喔!完整的script请前往该章节观看,这里鸟哥仅以ADSL拨接的NAT主机为例来介绍需要更改的地方: [root@test root]#cd /usr/local/virus/iptables

[root@test iptables]#vi iptables.rule

#!/bin/bash

#...(略)...

#设定对外的网路介面EXTIF="ppp0"#设定对内的网路介面与内部私有网域的设定INIF="eth0"INNET="192.168.1.0/24" # This is for NAT's network#....(略).. ..if [ "$INIF" != "" ]; then /sbin/iptables -A INPUT -i $INIF -j ACCEPT echo "1" > /proc/sys/net/ipv4/ip_forward /sbin/iptables -t nat -A POSTROUTING -s $INNET -o $EXTIF -j MASQUERADE fi#...(略)...

这支程式当中,只要修改EXTIF及INIF与内部网域表示方法(INNET) ,再藉由最后面那一行设定伪装(MASQUERADE)的功能,呵呵!整个NAT以及基本的主机防护就已经OK啰!相当的简单吧!详细的iptables.rule的安装方法,请往前翻到简易防火墙设定当中去搞定喔!^_^!如果执行无误,就可以将这支script写在您的/etc/rc.d/rc.local里面啰!

Client端的设定参数:包含的是网路的设定参数而已!这个等一下我们在用户端设定当中再讲!

两块网路卡的NAT架设:

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

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

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

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

关闭一些系统服务的port :与前一节相同!

实体线路配置图:与图一的配置相同。

设定网路介面

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

[root@test root]#vi /etc/sysconfig/network-scripts/ifcfg-eth1

DEVICE=eth1

BOOTPROTO=static

BROADCAST=192.168.0.255

IPADDR=192.168.0.2

NETMASK=255.255.255.0

NETWORK=192.168.0.0

ONBOOT=no< ==这里很重要!对外用来拨接的卡不要在开机的时候启动啦!

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

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

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

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

这样就成功啰!很简单吧!^_^""

设定其他档案:

其他一些网路的相关档案也要设定!亦即/etc/hosts, /etc/resolv.conf, /etc/sysconfig/network,设定的方式跟前一小节相同!

设计NAT的shell scripts:

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

观察路由资讯:

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

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

客户端的设定:

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

network 设定需要为: 192.168.1.0

broadcast 设定需要为: 192.168.1.255

netmask 设定需要为255.255.255.0

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

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

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端来说,我们仅仅设定一些简单的防火墙规则,而且在原本的iptables.rule当中还预设开启了许多的埠口,所以其实这样的一个主机并不是十分的安全的,因此,您最好还是自行将iptables.rule内的最后面的几个开放的埠口给他注解掉才好呐!(如果您的NAT主机仅想要负责频宽分享的功能的话!)

本文整合于互联网,如有侵权处还请联系管理员删除!

热门标签
new year
在线咨询
咨询热线 400-1515-720
投诉与建议
{{item.description}}

—您的烦恼我们已经收到—

我们会将处理结果发送至您的手机

请耐心等待