不久前发了一篇NAT和×××的联合使用。关于NAT方面有些细节,他们之间的作用和不同。我这里都以11版为基础,我看过一些老版的资料,配置已经完全不同了,功能也不太一样。NAT分3大类
1.Static NAT--静态NAT
它主要用途是发布内网或者是DMZ里面的服务器,供外部访问,作用在数据流进来的接口或者安全Zone上,可以细化到端口port,对指定的端口才进行内网的转送,最大限度的提高安全性。
例子:
shen_xu@SRX240H# show
rule-set PublishWebServer  {
    from interface ge-0/0/0.0;
    rule WebHTTP {
        match {
            destination-address 122.*.*.189/32;
            destination-port 80;
        }
        then {
            static-nat {
                prefix {
                    192.168.18.26/32;
                    mapped-port 80;
                }
            }
        }
    }
}
[edit security nat static]
这是一个典型的发布内部web服务器的例子。
 
2.Destination NAT--目的地址NAT
它其实和静态NAT极为相似,都可以用地址池,都作用在数据流进来的接口或者安全Zone上,也都可以细化到端口,然而唯一一个特性决定了它和静态NAT用途不同,静态NAT是发布内部的服务器的,而目的地址NAT是用在各个区间之间地址不可用或者重叠用的,它就是它不仅仅匹配目的地址,也匹配源地址,这对于在同一接口上的流量进行分离识别,分别对待非常有用,当然对硬件的消耗自然也大,所以发布服务器用静态,内部流量转换用目的地址NAT。
例子:
shen_xu@SRX240H# show
pool test {
    address 172.24.60.0/24;
}
rule-set t-d {
    from zone ManIN;
    rule r-t-d {
        match {
            source-address 172.26.2.0/24;
            destination-address 10.0.0.0/24;
        }
        then {
            destination-nat pool test;
        }
    }
}
[edit security nat destination]
可以看到,这次我们应用的安全Zone,而不是接口,因为不信任的Zone里面可能不只有一个接口,所以针对接口而不是zone;而这个是内部各个zone之间的通信,可能来自于两个线路,可以属于一个安全zone。这里就不在用接口地址而是地址池,因为这样的转换是大范围的,一个C段的转换,这里不仅仅出现了destination-address,还有source-address,为什么有这样的细分呢,如果从其它线路来的到同一个目的的有些需要转换,有些不需要,这样这里出现匹配源地址就很有用处了。
 
3.Source NAT--源地址NAT
源地址和前两个有个根本的不同,着眼点是源地址的转换,它作用于策略之后,而刚才的两个是作用在策略之前。
它是最常用的,我们上网必用它。
例:
shen_xu@SRX240H# show
pool USEN {
    address {
        122.*.*.189/32 to 122.*.*.190/32;
    }
}
rule-set Local-to-untrust {
    from zone Local;
    to zone untrust;
    rule Local-nat-rule {
        match {
            source-address 0.0.0.0/0;
        }
        then {
            source-nat {
                pool {
                    USEN;
                }
            }
        }
    }
}
[edit security nat source]
我这里用的源地址是0.0.0.0/0,为什么呢,因为它作用于策略之后,有策略在前面验证,后面对源地址的验证就显得多余了,如果在验证一下,实在是浪费资源,影响效率。
还记得上一篇说到,源地址的转换,是使用地址池的地址,每次session都变IP,这样有时候并不好,比如Voip的时候,也许就会出问题。要让源地址也定住,那么就需要加些东西。通过我的研究,得出了结果。
例:
shen_xu@SRX240H# show
pool ManCo {
    routing-instance {
        ManCo;
    }
    address {
        172.26.12.0/23;
    }
    port no-translation;
}
rule-set ManWork-ManCo {
    from zone ManIN;
    to zone ManCo×××;
    rule ShangHai {
        match {
            source-address 172.16.65.0/25;
            destination-address 172.24.60.0/24;
        }
        then {
            source-nat {
                pool {
                    ManulifeCo;
                    persistent-nat {
                        permit any-remote-host;
                        address-mapping;
                    }
                }
            }
        }
    }
}
[edit security nat source]
看到地址池怎么多了个东西,   
 routing-instance {
        ManCo;
    }
这个以后在说,这是虚拟路由器。我们看到port no-translation,这是很关键的,禁止port变换,必须用IP一一对应,如果不这样做,后面的一些地方就进行不了了。看persistent-nat,这就是固定IP的,它的里面有permit any-remote-host,其实还有3个选项,
permit Target host和permit Target host port,第一个是无条件的,从目的发来的包固定反射回来本来的IP,第2个是已经有过流量的IP,第3个就更加严格了不仅仅要IP还要端口。看看它们原来的英文介绍吧。
Any remote host—All Any external host can send a packet to the internal host by sending the packet to the reflexive transport address.
Target host—All  An external host can send a packet to an internal host by sending the packet to the reflexive transport address. The internal host must have previously sent a packet to the external host’s IP address.
Target host port—All  An external host can send a packet to an internal host by sending the packet to the reflexive transport address. The internal host must have previously sent a packet to the external host’s IP address and port.
最后还有句address-mapping,这个也和安全相关,这是动态映射地址,如果没有这个那么地址的转换将会是永久的,如果加了,超过最大期限后会删除这个对应关系的。
 
参考文档
http://kb.juniper.net/InfoCenter/index?page=content&id=KB21296&cat=JUNOS&actp=LIST
http://www.juniper.net/techpubs/en_US/junos11.1/information-products/topic-collections/security/software-all/security/index.html?topic-42825.html#jd0e125921