文章目录
NAT英文全称是“Network Address Translation”,中文意思是“网络地址转换”,它是一个IETF(Internet Engineering Task Force, Internet工程任务组)标准,允许一个整体机构以一个公用IP(Internet Protocol)地址出现在Internet上。顾名思义,它是一种把内部私有网络地址(IP地址)翻译成合法网络IP地址的技术。
简单的说,NAT就是在局域网内部网络中使用内部地址,而当内部节点要与外部网络进行通讯时,就在网关处,将内部地址替换成公用地址,从而在外部公网(internet)上正常使用,NAT可以使多台计算机共享Internet连接,这一功能很好地解决了公共IP地址紧缺的问题。通过这种方法,您可以只申请一个合法IP地址,就把整个局域网中的计算机接入Internet中。这时,NAT屏蔽了内部网络,所有内部网计算机对于公共网络来说是不可见的,而内部网计算机用户通常不会意识到NAT的存在。
这里提到的内部地址,是指在内部网络中分配给节点的私有IP地址,这个地址只能在内部网络中使用,不能被路由。虽然内部地址可以随机挑选,但是通常使用的是下面的地址。
私有地址:
10.0.0.0~10.255.255.255
172.16.0.0~172.16.255.255
192.168.0.0~192.168.255.255
NAT将这些无法在互联网上使用的保留IP地址翻译成可以在互联网上使用的合法IP地址。而全局地址,是指合法的IP地址,它是由NIC(网络信息中心)或者ISP(网络服务提供商)分配的地址,对外代表一个或多个内部局部地址,是全球统一的可寻址的地址。
静态NAT设置起来最为简单和最容易实现的一种,内部网络中的
每个主机都被永久映射成外部网络中的某个合法的地址。
| 内网 | 外网 | 转换类型 | 技术类型 |
|---|---|---|---|
| 192.168.0.20/24 | 58.211.107.14 | 一对一 | 内网192.168.0.20 |
| 192.168.0.0/24 | 58.211.107.14 | 多对一 | 192.168.0.2-254通过58.211.107.14代理上网 |
| 192.168.0.20:80 | 58.211.107.14:80 | 一对一 | NO-PAT:端口不做转换,仅转换IP |
| 192.168.0.20:8181 | 58.211.107.14:80 | 8181-80,端口一对一,IP可以是多对一 | PAT:端口、IP都转换。端口映射 |
动态地址NAT则是在外部网络中定义了一系列的合法地址,采用动态分配的方法映射到内部网络。动态地址NAT只是转换IP地址,它为每一个内部的IP地址分配一个临时的外部IP地址,主要应用于拨号,对于频繁的远程联接也可以采用动态NAT。当远程用户联接上之后,动态地址NAT就会分配给他一个IP地址,用户断开时,这个IP地址就会被释放而留待以后使用。
举例:如果你们公司wan口地址是:58.211.107.14/255.255.255.248,并且你们有5个公网地址
| 内网 | 外网 |
|---|---|
| IP地址 | 58.211.107.14 |
| 子掩码 | 255.255.255.248,掩码位29 |
| 网关 | 58.211.107.9 |
以电信网络为例:
58.211.107.14/29 最多主机6个:58.211.107.9~58.211.107.14,减去1个网关,可用IP只有5个。一般第一个起始IP被电信默认设置为网关:58.211.107.9就是网关。所以可用的公网IP只有下面列表中的2-6:
| 序号 | 内网 | 外网 |
|---|---|---|
| 01 | 58.211.107.9 | 网关 |
| 02 | 58.211.107.10 | 可用IP |
| 03 | 58.211.107.11 | 可用IP |
| 04 | 58.211.107.12 | 可用IP |
| 05 | 58.211.107.13 | 可用IP |
| 06 | 58.211.107.14 | 可用IP |
最终动态地址NAT转换池为:
| 内网 | 外网 |
|---|---|
| 192.168.0.2 | 58.211.107.14 |
| 192.168.0.3 | 58.211.107.11 |
| 192.168.0.4 | 58.211.107.12 |
| 192.168.0.5 | 58.211.107.13 |
| … | … |
| 需要注意的是,动态地址NAT,内网和外网所对应的地址断开连接重连后就会变化,也就是说是随机的。这是它的缺点之一。 |
NAPT则是把内部地址映射到外部网络的一个IP地址的不同端口上。网络地址端口转换NAPT(Network Address PortTranslation)是人们比较熟悉的一种转换方式。
NAPT普遍应用于接入设备中,它可以将中小型的网络隐藏在一个合法的IP地址后面。NAPT与动态地址NAT不同,它将内部连接映射到外部网络中的一个单独的IP地址上,同时在该地址上加上一个由NAT设备选定的TCP端口号。
在Internet中使用NAPT时,所有不同的信息流看起来好像来源于同一个IP地址。这个优点在小型办公室内非常实用,通过从ISP处申请的一个IP地址,将多个连接通过NAPT接入Internet。
实际上,许多SOHO远程访问设备支持基于PPP的动态IP地址。这样,ISP甚至不需要支持NAPT,就可以做到多个内部IP地址共用一个外部IP地址上Internet,虽然这样会导致信道的一定拥塞,但考虑到节省的ISP上网费用和易管理的特点,用NAPT还是很值得的。
| 内网 | 外网 | 对应端口 | 基于NAT转发类型 |
|---|---|---|---|
| 192.168.0.20:8181 | 58.211.107.14:80 | 80-8181 | PAT:端口、IP都转换。端口映射 |
| 192.168.0.20:21 | 58.211.107.14:9111 | 21-9111 | PAT:端口、IP都转换。端口映射 |
| 192.168.0.20:3389 | 58.211.107.14:3333 | 3389-3333 | PAT:端口、IP都转换。端口映射 |
端口是还是一对一,IP可以是多对一,也可以是多对多。

首先安装拓扑图配置地址(省略),然后在AR1上配置一条静态NAT
[R1-GigabitEthernet0/0/1]nat static global 200.1.1.100 inside 192.168.1.1
[R1-GigabitEthernet0/0/1]dis nat static
Static Nat Information:
Interface : GigabitEthernet0/0/1
Global IP/Port : 200.1.1.100/----
Inside IP/Port : 192.168.1.1/----
Protocol : ----
VPN instance-name : ----
Acl number : ----
Netmask : 255.255.255.255
Description : ----
Total : 1

首先安装拓扑图配置地址(省略),然后在AR1上配置:
[R1]nat address-group 1 200.1.1.100 200.1.1.200
#配置nat转换用的公网地址池ID为1,范围200.1.1.100-200
[R1]
[R1]acl 2000
[R1-acl-basic-2000]rule permit source 192.168.1.0 0.0.0.255 #使用acl匹配需要进行转换的内网IP地址
[R1-acl-basic-2000]q
[R1]in g0/0/1
[R1-GigabitEthernet0/0/1]nat outbound 2000 address-group 1 no-pat
#在接口出方向使用动态NAT,不做PAT端口复用
[R1-GigabitEthernet0/0/1]nat outbound 2000 address-group 1
#在接口出方向使用动态NAT,做PAT端口复用,不加默认就是napt
某企业仅有1个公网IP地址200.1.1.1,内网需要做地址转换的主机IP只能通过这1个公网IP做地址转换。

[R1]
[R1]acl 2000
[R1-acl-basic-2000]rule permit source 192.168.1.0 0.0.0.255 #使用acl匹配需要进行转换的内网IP地址
[R1-acl-basic-2000]q
[R1]in g0/0/1
[R1-GigabitEthernet0/0/1]nat outbound 2000 interface GigabitEthernet 0/0/1
特别说明:
[R1-GigabitEthernet0/0/1]nat outbound 2000 interface GigabitEthernet 0/0/1
上面这条命令,在ensp模拟器上interface后面只能跟回环接口,真机上是可以的跟接口的,下图是真机截图:

首先按照拓扑把地址配置好。



不用配置网关,配网关就不叫公网了。

[R1]nat address-group 1 200.1.1.100 200.1.1.200
#配置nat转换用的公网地址池ID为1,范围200.1.1.100-200
[R1]
[R1]acl 2000
[R1-acl-basic-2000]rule permit source 192.168.1.0 0.0.0.255
#使用acl匹配需要进行转换的内网IP地址
[R1-acl-basic-2000]q
[R1]in g0/0/1
[R1-GigabitEthernet0/0/1]nat server protocol tcp global 200.1.1.100 8080 inside
192.168.1.100 80
测试结果:点击获取,会弹出是否下载此文件

我的目标是转换表单输入,例如“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看起来疯狂不安全。所以,功能正常,
Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题
我想将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[
我有一个存储主机名的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.
我没有找到太多关于如何执行此操作的信息,尽管有很多关于如何使用像这样的redirect_to将参数传递给重定向的建议:action=>'something',:controller=>'something'在我的应用程序中,我在路由文件中有以下内容match'profile'=>'User#show'我的表演Action是这样的defshow@user=User.find(params[:user])@title=@user.first_nameend重定向发生在同一个用户Controller中,就像这样defregister@title="Registration"@user=Use
我真的为这个而疯狂。我一直在搜索答案并尝试我找到的所有内容,包括相关问题和stackoverflow上的答案,但仍然无法正常工作。我正在使用嵌套资源,但无法使表单正常工作。我总是遇到错误,例如没有路线匹配[PUT]"/galleries/1/photos"表格在这里:/galleries/1/photos/1/edit路线.rbresources:galleriesdoresources:photosendresources:galleriesresources:photos照片Controller.rbdefnew@gallery=Gallery.find(params[:galle
我收到格式为的回复#我需要将其转换为哈希值(针对活跃商家)。目前我正在遍历变量并执行此操作: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作为该等式的第二部分,但这仍然是主要问题。