草庐IT

eNSP中对NAT的配置(网络地址转换)

Ayan.. 2023-07-20 原文

        地址转换是把局域网的私有地址转换为公有地址,如果想要上外网,而公有地址是有限的,则需要将私有地址转换成公有地址,用端口号进行区分。

   

一.基本原理     

        NAT是改变IP报文中的源或目的地址的一种处理方式;让局域网用户访问外网资源,也可以设定内部的应用对外提供的服务;隐藏内部局域网的IP主机,起到安全保护的作用;NAT功能通常被集成到路由器,防火墙,ISDN路由器或者单独的NAT设备中。

1.IANA为私有网络预留的IP地址空间:

A类地址范围是10.0.0.0 --- 10.255.255.255;

B类地址范围是172.16.0.0 --- 172.31.255.255;

C类地址范围是192.168.0.0 --- 192.168.255.255。

2.NAT的优点

①节约合法的注册公网地址;

②在地址重叠时提供解决方案;

③提高连接到Internet的灵活性;

④在网络发生变化时避免重新编址。

3.NAT的缺点

①地址转换将增加交换延迟;

②导致无法进行端到端IP追踪;

③导致有些应用程序无法正常运行。

4.NAT的类型

NAT的主要类型包括:①静态NAT/NAPT;②Easy IP;③NAT服务器。

(1)静态NAT简介:

①内网中一个主机的私有IP地址与一个公网IP地址相绑定;

②实现一对一的转换关系;

③实际中很少应用,因为一个公网IP地址无法为内网中的多台主机同时提供外网连接。

(2)NAPT简介:

①把二元组“内部网络主机的IP+端口号”和“公网IP+端口号”执行一对一绑定;

②一个公网IP地址可以同时为多个私有IP地址提供外网连接。

(3)Easy IP简介:

①是NAPT的一种方式,直接借用路由器出接口IP地址作为公网地址;

②常用于拨号上网的网络环境中;

③拨号得到的公网地址自动成为转换的公网IP;

④所有内网主机都需要使用这个临时公网获取的IP地址来访问互联网。

(4)NAT服务器简介:

①用于对内网应用对外提供服务;

②静态配置公网“IP地址+端口号”和私有“IP地址+端口号”之间的转换;

③公网用户只知道通过公网IP地址访问服务,内网的IP隐藏起到保护作用。



二.静态NAT配置

1.建立如下拓扑图并初始化设备

2. 配置基础IP地址

[AR1]int g0/0/0

[AR1-GigabitEthernet0/0/0]ip add 10.1.0.1 24

[AR1]int g0/0/1

[AR1-GigabitEthernet0/0/1]ip add 12.1.1.1 29

[AR2]int g0/0/1

[AR2-GigabitEthernet0/0/1]ip add 12.1.1.2 29

3.在AR2上配置一个IP地址为8.8.8.8的环回接口,用以模拟Internet中的地址:

[AR2]int loopback0

[AR2-LoopBack0]ip add 8.8.8.8 24

4.配置PC端

5.配置路由

(1)若在AR1上配置静态路由:

[AR1]ip route-static 0.0.0.0 0.0.0.0 12.1.1.2

但此时PC端与AR2并不能连通,因为信号去往AR2后,没有设置返回路由。

但由于在实际生活中,公网是不能到私有IP或者路由,所以不能通过配置静态路由的方法进行连接。

所以,此时应当使用静态NAT的配置。

(2)配置静态NAT

在网关路由器AR1的G0/0/1接口上配置一对一的NAT映射:

[AR1]interface GigabitEthernet 0/0/1

[AR1-GigabitEthernet0/0/1]nat static global 12.1.1.3 inside 10.1.0.100

[AR1-GigabitEthernet0/0/1]nat static global 12.1.1.4 inside 10.1.0.101

PC1的IP地址会被转换的Global IP是12.1.1.3

PC2的IP地址会被转换的Global IP则是12.1.1.4

 若此时对AR1的g0/0/1进行抓包可得:

 注:AR2并不能知道PC端真正的路由,它只能ping通12.1.1.3和12.1.1.4,并且与AR1是直连。

二.NAPT的配置

        静态NAT的配置是一对一的地址映射,不会节省任何地址空间。因此,网络中通常采用的网络地址转换设计方案都是将多个私有IP地址转换为一个公有IP地址,并且利用传输层的端口号来区分不同的私有IP地址,这种称为NAPT(Network Address Port Translation)的技术。

1.建立如下拓扑图并初始化设备

 若是在NAT静态拓扑图的基础上进行配置,则只需删除静态NAT配置即可。

[AR1]interface GigabitEthernet 0/0/1

[AR1-GigabitEthernet0/0/1]undo nat static global 12.1.1.3 inside 10.1.0.100 netmask 255.255.255.255

[AR1-GigabitEthernet0/0/1]undo nat static global 12.1.1.4 inside 10.1.0.101 netmask 255.255.255.255

2.NAPT的配置

(1)使用ACL匹配内网(AR1)需要转换的私有IP地址:

[AR1]acl 2000

[AR1-acl-basic-2000]rule permit source 10.1.0.0 0.0.0.255

(2)配置可用的公有IP地址组

[AR1]nat address-group 1 12.1.1.3 12.1.1.6

(3)使用前面两个步骤中配置好的ACL(编号)和NAT地址组(编号),在执行转换的接口上指定私有地址到公有地址的NAT转换关系:

[AR1]interface GigabitEthernet 0/0/1

[AR1-GigabitEthernet0/0/1]nat outbound 2000 address-group 1

3.查看配置结果

(1)查看NAT公有地址池:

[AR1]display nat address-group  

 目前公有地址池中包含的地址范围是12.1.1.3-----12.1.1.6

(2)查看NAT转换表项:

[AR1]display nat outbound 

(3)在AR1上g0/0/1抓包可知,都转换为相同公有地址:12.1.1.5。

(4)查看转发表项:

[AR1]display nat session all

 

三.Easy IP的配置

1.建立如下拓扑图并初始化设备

[AR1]int g0/0/1

[AR1-GigabitEthernet0/0/1]undo nat outbound 2000 address-group 1

[AR1]undo nat address-group 1

2.easy IP的配置

[AR1]int g0/0/1

[AR1-GigabitEthernet0/0/1]nat outbound 2000     

  //acl 2000在NAPT的配置中配置过,所以这里可以直接拿来使用

3.查看配置结果

(1)PC端对8.8.8.8的ping

(2)查看NAT转换表项:

[AR1]display nat outbound 

(3)在AR1上g0/0/1抓包可知,都转换为相同公有地址:12.1.1.1。

四. NAT Server的配置

        在真实的网络中,与NAT相关的设计方案往往会是下图所示的一种融合NAT环境。其中,内网PC设备需要使用动态NAT去访问Internet,同时又有服务器需要为公网的设备提供服务。

1.建立拓扑图如下所示并初始化设备

 若是在Easy IP拓扑图的基础上进行配置,则只需按照如图所示进行增减配置即可。

2.在AR2上配置连接Client1的接口IP:

[AR2]int g0/0/0

[AR2-GigabitEthernet0/0/0]ip add 2.1.0.1 24

3.对server1进行配置

 并建立一个文件夹,使Server1能有根目录,选择点击“启动”。

4.对Client1进行配置

5.网络配置

因为在Easy IP的配置里,已经实现了内网PC上网的需求。

之前配置的程序如下: 

[AR1]acl 2000

[AR1-acl-basic-2000]rule permit source 10.1.0.0 0.0.0.255

[AR1-acl-basic-2000]quit

[AR1]interface GigabitEthernet 0/0/1

[AR1-GigabitEthernet0/0/1]nat outbound 2000

        以上程序在Easy IP中已经配置过了,所以在拓扑图修改的时候,我们只需要配置内网服务器的地址转换,即NAT Server。

[AR1]interface GigabitEthernet 0/0/1

[AR1-GigabitEthernet0/0/1]nat server protocol tcp global 12.1.1.6 www inside 10.1.0.101 www

6.检查配置结果

(1)NAT Server的配置结果

[AR1]display nat server 

 路由器AR1只把公有IP地址12.1.1.6的TCP 80端口转换为内网服务器IP地址10.1.0.101的80端口。

(2)连通性测试:

 (3)在AR1上对G0/0/1端口抓包,PC1 ping 2.1.0.100 测试与公网的连通性

 (4)Client1进行配置结果测试

五.NAT Server的配置的升级版

在内网再添加一台FTP服务器,IP地址为10.1.0.102/24

1.修改拓扑图如图所示

2.Server2的配置

 同样,建立一个文件夹作为根目录

 3.配置内网的服务器的地址转换,即NAT Server

[AR1]interface GigabitEthernet 0/0/1

[AR1-GigabitEthernet0/0/1]nat server protocol tcp global 12.1.1.6 ftp inside 10.1.0.102 ftp

4.存在的问题

      (1)  此时若用Client登录ftp,会处于无法登录的状态。

        NAT只会针对数据包头部的IP地址和端口号执行转换,而不会关注数据包载荷部分的内容。而ftp协议,也会在数据包的载荷中携带地址和端口信息。如果执行NAT转换的网关路由器不对载荷中的地址和端口信息进行任何处理的话,通信就会失败。

       (2) 用户无法正常访问FTP服务器,是因为网关路由器缺少ALG配置。

        ALG称为应用程序网关(Application Level Gateway),ALG地址转换改变了IP地址数据包头的IP地址信息,如果数据报文的载荷中含有地址信息,地址转换就要特殊处理,除了改变IP包头的地址信息,还得改变数据报文中载荷中的地址信息。

 5.开启ALG

[AR1]nat alg ftp enable        //启用ALG功能

6.检测配置结果

(1) 查看ALG的状态

[AR1]display nat alg       

 (2)Client1获取 ftp

(3) 在AR1上对G0/0/1端口抓包

有关eNSP中对NAT的配置(网络地址转换)的更多相关文章

  1. ruby-on-rails - 在 Rails 中将文件大小字符串转换为等效千字节 - 2

    我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,

  2. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

    我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

  3. ruby - 将数组的内容转换为 int - 2

    我需要读入一个包含数字列表的文件。此代码读取文件并将其放入二维数组中。现在我需要获取数组中所有数字的平均值,但我需要将数组的内容更改为int。有什么想法可以将to_i方法放在哪里吗?ClassTerraindefinitializefile_name@input=IO.readlines(file_name)#readinfile@size=@input[0].to_i@land=[@size]x=1whilex 最佳答案 只需将数组映射为整数:@land边注如果你想得到一条线的平均值,你可以这样做:values=@input[x]

  4. ruby - 将散列转换为嵌套散列 - 2

    这道题是thisquestion的逆题.给定一个散列,每个键都有一个数组,例如{[:a,:b,:c]=>1,[:a,:b,:d]=>2,[:a,:e]=>3,[:f]=>4,}将其转换为嵌套哈希的最佳方法是什么{:a=>{:b=>{:c=>1,:d=>2},:e=>3,},:f=>4,} 最佳答案 这是一个迭代的解决方案,递归的解决方案留给读者作为练习:defconvert(h={})ret={}h.eachdo|k,v|node=retk[0..-2].each{|x|node[x]||={};node=node[x]}node[

  5. ruby-on-rails - 独立 ruby​​ 脚本的配置文件 - 2

    我有一个在Linux服务器上运行的ruby​​脚本。它不使用rails或任何东西。它基本上是一个命令行ruby​​脚本,可以像这样传递参数:./ruby_script.rbarg1arg2如何将参数抽象到配置文件(例如yaml文件或其他文件)中?您能否举例说明如何做到这一点?提前谢谢你。 最佳答案 首先,您可以运行一个写入YAML配置文件的独立脚本:require"yaml"File.write("path_to_yaml_file",[arg1,arg2].to_yaml)然后,在您的应用中阅读它:require"yaml"arg

  6. Ruby Sinatra 配置用于生产和开发 - 2

    我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm

  7. ruby - 从 Ruby 中的主机名获取 IP 地址 - 2

    我有一个存储主机名的Ruby数组server_names。如果我打印出来,它看起来像这样:["hostname.abc.com","hostname2.abc.com","hostname3.abc.com"]相当标准。我想要做的是获取这些服务器的IP(可能将它们存储在另一个变量中)。看起来IPSocket类可以做到这一点,但我不确定如何使用IPSocket类遍历它。如果它只是尝试像这样打印出IP:server_names.eachdo|name|IPSocket::getaddress(name)pnameend它提示我没有提供服务器名称。这是语法问题还是我没有正确使用类?输出:ge

  8. ruby-on-rails - Ruby url 到 html 链接转换 - 2

    我正在使用Rails构建一个简单的聊天应用程序。当用户输入url时,我希望将其输出为html链接(即“url”)。我想知道在Ruby中是否有任何库或众所周知的方法可以做到这一点。如果没有,我有一些不错的正则表达式示例代码可以使用... 最佳答案 查看auto_linkRails提供的辅助方法。这会将所有URL和电子邮件地址变成可点击的链接(htmlanchor标记)。这是文档中的代码示例。auto_link("Gotohttp://www.rubyonrails.organdsayhellotodavid@loudthinking.

  9. ruby - 用 Ruby 编写一个简单的网络服务器 - 2

    我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b

  10. ruby-on-rails - 使用 ruby​​ 将多个实例变量转换为散列的更好方法? - 2

    我收到格式为的回复#我需要将其转换为哈希值(针对活跃商家)。目前我正在遍历变量并执行此操作:response.instance_variables.eachdo|r|my_hash.merge!(r.to_s.delete("@").intern=>response.instance_eval(r.to_s.delete("@")))end这有效,它将生成{:first="charlie",:last=>"kelly"},但它似乎有点hacky和不稳定。有更好的方法吗?编辑:我刚刚意识到我可以使用instance_variable_get作为该等式的第二部分,但这仍然是主要问题。

随机推荐