以前学习NAT的时候都是在路由器上去配置,其实防火墙才是实现NAT的终极神器。PIX在被cisco收购前的老东家叫做network translation,从这家公司的名字我们就可以看出一些端倪了,事实也的确如此,PIX最初被开发出来就是做NAT的。经过一小段时间的学习,发现在防火墙上做NAT真是很强大,配置起来十分灵活,能够满足很多在路由器上实现起来很困难或者根本无法实现的功能。下面的小实验只是一个入门介绍,后续的高级应用会持续跟进。
拓扑:
基本配置:
PIX:
interface Ethernet0
nameif inside
security-level 100
ip address 24.1.1.4 255.255.255.0
!
interface Ethernet2
nameif outside
security-level 0
ip address 34.1.1.4 255.255.255.0
!
route inside 2.2.2.0 255.255.255.0 24.1.1.2 1
!
Inside:
interface Loopback1
ip address 2.2.2.1 255.255.255.255
!
interface Loopback2
ip address 2.2.2.2 255.255.255.255
!
interface Loopback3
ip address 2.2.2.3 255.255.255.255
!
interface Ethernet0/0
ip address 24.1.1.2 255.255.255.0
half-duplex
!
ip route 0.0.0.0 0.0.0.0 Ethernet0/0 24.1.1.4
Outside:
!
interface Loopback0
ip address 3.3.3.3 255.255.255.0
!
interface Ethernet0/0
ip address 34.1.1.3 255.255.255.0
half-duplex
!
1. 基本配置完成后,下面在PIX上配置访问列表允许从outside进入的ping和telnet流量访问内网以便于测试之用。
access-list 100 remark permit telnet form outside
access-list 100 extended permit tcp any host 34.1.1.10 eq telnet
access-list 100 extended permit icmp any host 34.1.1.10 echo
!
access-group 100 in interface outside
!
2. 下面建立一个静态转换。假设内部网络的2.2.2.1这个地址静态转换为34.1.1.10。
static (inside,outside) 34.1.1.10 2.2.2.1 netmask 255.255.255.255
注意这条命令的书写格式。可以这么来理解,从inside来的2.2.2.1这个地址静态转换为从outside出的34.1.1.10,反之依然。一定注意的是不要将inside和outside的顺序与后面的两个地址对好入座,他们的顺序是相反的。
3. 从Outside发起ping和telnet测试转换情况。
Outside#ping 34.1.1.10
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 34.1.1.10, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 28/48/104 ms
Outside#telnet 34.1.1.10
Trying 34.1.1.10 ... Open
User Access Verification
Password:
Inside>exi
[Connection to 34.1.1.10 closed by foreign host]
两种应用都能够正常使用 。注意上面使用的地址都是34.1.1.10这个公用地址,从这里即可推断出地址转换成功了。
4. 下面去PIX上看看转换的具体情况。
pixfirewall# sh xlate
1 in use, 1 most used
Global 34.1.1.10 Local 2.2.2.1
这条命令查看地址转换,比较直观,他能够显示当前有那些应用正在使用地址转换,比如我们有一个ping包经过地址转换,这里都可以看出来。
下面的输出给出了nat配置的信息。
pixfirewall# sh nat
NAT policies on Interface inside:
match ip inside host 2.2.2.1 outside any
static translation to 34.1.1.10
translate_hits = 4, untranslate_hits = 11
在PIX上我们可以实现这么一种应用:针对具体某一种应用实现NAT!例如只提供对http的NAT,对telnet等有一定安全威胁的应用都不提供nat。这样就增强了安全性。
1. 下面用telnet代替http,即NAT允许telnet但是不允许ping。
PIX:
no static (inside,outside) 34.1.1.10 2.2.2.1 netmask 255.255.255.255
static (inside,outside) tcp 34.1.1.10 telnet 2.2.2.1 telnet
2. 从Outside发起测试。
Outside#telnet 34.1.1.10
Trying 34.1.1.10 ... Open
User Access Verification
Password:
Inside>exi
[Connection to 34.1.1.10 closed by foreign host]
Outside#ping 34.1.1.10
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 34.1.1.10, timeout is 2 seconds:
.....
Success rate is 0 percent (0/5)
如上所示,能够成功发起telnet连接,但是不能ping通。
上面讲述的都是静态地址转换,现在IPv4地址告急,静态转换对IP地址节省没有什么贡献,关键看动态转换。
1. 下面配置一个PAT,使用PIX的outside接口进行地址转换。
nat (inside) 1 2.2.2.0 255.255.255.0
global (outside) 1 interface
第一条命令定义相当于定义了一个list,这个接口(inside)就是IOS下的ip nat inside。
第二条命令定义了ip nat outside,interface就是这个前面的outside接口,不用定义overload,直接就是PAT。
需要注意一个问题就是这两条命令的序列号(在本里中是1)需要一致。不可以使用nat 0,0的实际作用是不转换。
2. 测试。
从inside路由器发起以loopback接口为source的ping到outside的loopback 3.3.3.3。
1) 测试之前有两点工作需要完成。首先在 PIX上指定一个去往3.3.3.3的静态路由,然后在访问列表中加一条允从outside接口进入的echo-reply。
route outside 3.3.3.3 255.255.255.255 34.1.1.3
access-list 100 extended permit icmp any host 34.1.1.4 echo-reply
注意上面添加的ACL语句直接使用了34.1.1.4这个PAT接口地址而不是转换前的2.2.2.0/24。
2) 测试开始,从inside发起ping。
Inside#ping 3.3.3.3 sou l1
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 3.3.3.3, timeout is 2 seconds:
Packet sent with a source address of 2.2.2.1
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 24/52/84 ms
Inside#ping 3.3.3.3 sou l2
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 3.3.3.3, timeout is 2 seconds:
Packet sent with a source address of 2.2.2.2
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 20/60/92 ms
Inside#ping 3.3.3.3 sou l3
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 3.3.3.3, timeout is 2 seconds:
Packet sent with a source address of 2.2.2.3
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 24/36/60 ms
都通了。
3) 下面去PIX上看看NAT转换结果。
pixfirewall# sh xlate
3 in use, 5 most used
PAT Global 34.1.1.4(13) Local 2.2.2.1 ICMP id 16
PAT Global 34.1.1.4(14) Local 2.2.2.2 ICMP id 17
PAT Global 34.1.1.4(15) Local 2.2.2.3 ICMP id 18
有三个ICMP的应用进行了转换。
前面讲了动态的PAT,下面讲讲动态的NAT。
1. 我们去掉前面配置的global,新建一个global。
Global (outside) 1 34.1.1.10-34.1.1.11
测试方法依然是从inside发起ping。这里我们写一个小脚本来批量发起ping包。
foreach source {
2.2.2.1
2.2.2.2
2.2.2.3
} {
ping 3.3.3.3 source $source
}
Inside(tcl)#foreach source {
+>2.2.2.1
+>2.2.2.2
+>2.2.2.3
+>} {
+>ping 3.3.3.3 source $source
+>}
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 3.3.3.3, timeout is 2 seconds:
Packet sent with a source address of 2.2.2.1
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 16/50/100 ms
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 3.3.3.3, timeout is 2 seconds:
Packet sent with a source address of 2.2.2.2
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 28/45/84 ms
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 3.3.3.3, timeout is 2 seconds:
Packet sent with a source address of 2.2.2.3
.....
Success rate is 0 percent (0/5)
2. 分析
从上面的ping结果来看,只有前面两个ping是成功的第三个没有成功。下面是PIX上的XLATE。
pixfirewall# sh xlate
2 in use, 5 most used
Global 34.1.1.10 Local 2.2.2.1
Global 34.1.1.11 Local 2.2.2.2
如上显示,只有两个地址进行了转换。回到前面我们定义的地址池,只写了两个地址34.1.1.10-34.1.1.11。也就是说,前面的两个ping占用完了地址,第三个ping没的地址用,因此ping失败。
PS:
1. 我在cisco的安全教程中看见有一节的题目是“用PAT托大全局地址池”,也就是定义第二个地址池(id号不同),当匹配的地址池的地址用尽时,就使用第二个地址池里的地址。但是我食言了一下,并没有成功。还有待研究。
2. 今天在网络安全课堂上,老师也说道NAT地址的问题,让我耳目一新。我们总说NAT缓解地址用尽,但是可能没有多少人能答上来一个PAT地址大概能够支持多少个用户,我就从来没有将这个问题结合实际量化的去考虑。老师说,一个PAT就算支持65535个端口,如果一个用户开启迅雷,资源很好的情况下一个下载会开启很多连接,每个连接都用一个端口,那么一个用户可能就占用几百个端口,那么一个公有地址也支持的用户也是有限的,远不是我们想想的那样大概能支持个上万个用户!
转载于:https://blog.51cto.com/edges/411066