地址转换是把局域网的私有地址转换为公有地址,如果想要上外网,而公有地址是有限的,则需要将私有地址转换成公有地址,用端口号进行区分。
NAT是改变IP报文中的源或目的地址的一种处理方式;让局域网用户访问外网资源,也可以设定内部的应用对外提供的服务;隐藏内部局域网的IP主机,起到安全保护的作用;NAT功能通常被集成到路由器,防火墙,ISDN路由器或者单独的NAT设备中。
①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。
①节约合法的注册公网地址;
②在地址重叠时提供解决方案;
③提高连接到Internet的灵活性;
④在网络发生变化时避免重新编址。
①地址转换将增加交换延迟;
②导致无法进行端到端IP追踪;
③导致有些应用程序无法正常运行。
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隐藏起到保护作用。

[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
[AR2]int loopback0
[AR2-LoopBack0]ip add 8.8.8.8 24
4.配置PC端


(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是直连。

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

若是在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
(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
(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


[AR1]int g0/0/1
[AR1-GigabitEthernet0/0/1]undo nat outbound 2000 address-group 1
[AR1]undo nat address-group 1
[AR1]int g0/0/1
[AR1-GigabitEthernet0/0/1]nat outbound 2000
//acl 2000在NAPT的配置中配置过,所以这里可以直接拿来使用
(1)PC端对8.8.8.8的ping

(2)查看NAT转换表项:
[AR1]display nat outbound

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

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

若是在Easy IP拓扑图的基础上进行配置,则只需按照如图所示进行增减配置即可。
[AR2]int g0/0/0
[AR2-GigabitEthernet0/0/0]ip add 2.1.0.1 24

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


4.对Client1进行配置

因为在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进行配置结果测试


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


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

[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

(1) 此时若用Client登录ftp,会处于无法登录的状态。
NAT只会针对数据包头部的IP地址和端口号执行转换,而不会关注数据包载荷部分的内容。而ftp协议,也会在数据包的载荷中携带地址和端口信息。如果执行NAT转换的网关路由器不对载荷中的地址和端口信息进行任何处理的话,通信就会失败。


(2) 用户无法正常访问FTP服务器,是因为网关路由器缺少ALG配置。
ALG称为应用程序网关(Application Level Gateway),ALG地址转换改变了IP地址数据包头的IP地址信息,如果数据报文的载荷中含有地址信息,地址转换就要特殊处理,除了改变IP包头的地址信息,还得改变数据报文中载荷中的地址信息。
[AR1]nat alg ftp enable //启用ALG功能
(1) 查看ALG的状态
[AR1]display nat alg

(2)Client1获取 ftp

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


我的目标是转换表单输入,例如“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看起来疯狂不安全。所以,功能正常,
我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h
我需要读入一个包含数字列表的文件。此代码读取文件并将其放入二维数组中。现在我需要获取数组中所有数字的平均值,但我需要将数组的内容更改为int。有什么想法可以将to_i方法放在哪里吗?ClassTerraindefinitializefile_name@input=IO.readlines(file_name)#readinfile@size=@input[0].to_i@land=[@size]x=1whilex 最佳答案 只需将数组映射为整数:@land边注如果你想得到一条线的平均值,你可以这样做:values=@input[x]
这道题是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[
我有一个在Linux服务器上运行的ruby脚本。它不使用rails或任何东西。它基本上是一个命令行ruby脚本,可以像这样传递参数:./ruby_script.rbarg1arg2如何将参数抽象到配置文件(例如yaml文件或其他文件)中?您能否举例说明如何做到这一点?提前谢谢你。 最佳答案 首先,您可以运行一个写入YAML配置文件的独立脚本:require"yaml"File.write("path_to_yaml_file",[arg1,arg2].to_yaml)然后,在您的应用中阅读它:require"yaml"arg
我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm
我有一个存储主机名的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
我正在使用Rails构建一个简单的聊天应用程序。当用户输入url时,我希望将其输出为html链接(即“url”)。我想知道在Ruby中是否有任何库或众所周知的方法可以做到这一点。如果没有,我有一些不错的正则表达式示例代码可以使用... 最佳答案 查看auto_linkRails提供的辅助方法。这会将所有URL和电子邮件地址变成可点击的链接(htmlanchor标记)。这是文档中的代码示例。auto_link("Gotohttp://www.rubyonrails.organdsayhellotodavid@loudthinking.
我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b
我收到格式为的回复#我需要将其转换为哈希值(针对活跃商家)。目前我正在遍历变量并执行此操作: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作为该等式的第二部分,但这仍然是主要问题。