xsjzjd88 发表于 2008-6-14 11:30:24

(原创) 对nat的理解

学习ros两个月了,一直在潜水,看了关于nat回流的说法不太统一 下面我谈下我的看法。
    ros防火墙进行过滤和转发是基于包的,关键就在这个包上,那么我们就先得了解下包的构造
因为这里讨论的是nat转换,所以重点就看下源地址和目标地址,其它的我统称为data,下面就是一个包了
看图:


现在我们来看下例子:
假设我们有个公网地址是:200.100.2.3
内网设为:192.168.0.0/24
现在来看下一台内网地址为192.168.0.6的电脑点了新浪网(218.30.66.101)的情况:
1.
从192.168.0.6发出发往新浪网(218.30.66.101)的数据包,那么包的源地址就是192.168.0.6咯,目标地址是218.30.66.101
2.
包到达ros,这里进行源地址转换(srcnat),把内网地址192.168.0.6转换为公网地址200.100.2.3,目标地址不变
这里大家可以想下,如果不进行srcnat,这个包到了新浪网,然后新浪返回的包的目标地址就是192.168.0.6,这个地址
是私有地址,公网上的路由设备是不认识的,不知道把它转发到那去,这条从内网192.168.0.6到新浪网的线路就不通咯
3.
从ros出来的包通过一些路由的转发,到达新浪网,然后从新浪发出返回的包,源地址是新浪的ip:218.30.66.101,目标地址是
ros所在的公网地址200.10.2.3
4.
从新浪返回的包通过路由到达我们的ros,在这里进行目标地址转换(dstnat),ros看了,哦,这个包是原来192.168.0.6申请连接
返回来的包,那就要把公网地址200.100.2.3转换为192.168.0.6咯
5.
包到达192.168.0.6,我们看到了新浪网的内容,唉,湖人又干败了,现在总比分是1比3落后咯
看图:


所以在ros的nat里的规则就是:
/ ip firewall nat

add chain=srcnat src-address=192.168.0.0/24 action=src-nat \
    to-addresses=200.100.2.3 to-ports=0-65535 comment="" disabled=no


下面我们看下端口映射:
其它的同上,假设架设web服务的内网地址是192.168.0.254,端口是80
这样一个外网用户访问这个web页时发生的情况,看图:


在ros里的规则就是:
add chain=dstnat dst-address=200.100.2.3 protocol=tcp dst-port=80 \
    action=dst-nat to-addresses=192.168.0.254 to-ports=0-65535 comment="" \
    disabled=no
解释就是:ros只要看到协议是tcp且目标地址是200.100.2.3目标端口是80的包,就把它的目标地址转换为192.168.0.254
          这样外网的用户访问我们的web页就相当于访问了我们的内网192.168.0.254咯


再看下回流:
通过上面的理解我们可以知道,如过是ip为192.168.0.6的电脑用公网ip访问192.168.0.254这个服务器,那它发出的包就图:


在ros里的规则就是:
add chain=srcnat src-address=192.168.0.0/24 action=src-nat \
    to-addresses=200.100.2.3 to-ports=0-65535 comment="" disabled=no
对于让ros自动转换的,也就是用masquerade这条规则的可以看下winxp2000大大的文章
http://bbs.router.net.cn/read.php?tid=8572
规则是:add chain=srcnat src-address=192.168.0.0/24 action=masquerade comment="" \
    disabled=no

现在大家在来看看http://bbs.router.net.cn/read.php?tid=239这篇文章,
我认为4楼njhhack的说法是正确的,我对nat的理解也是看了njhhack以前的文章才明白的先谢下
当然让大家看这两篇文章是为了大家有个比较,这样理解更深点
好了,就写到这,有错误的地方还请各位大大批评指证

xsjfj 发表于 2008-6-14 18:02:43

哈哈,不错收藏了

lhn1324 发表于 2008-6-14 18:48:43

支持原创

hongyestu 发表于 2008-6-15 02:04:09

呵呵,找了好久,还算明白,谢谢!!!

ypw 发表于 2008-6-15 18:35:23

好文章,就是无法解决内网访问内网WEB后显示真实IP的问题

xsjzjd88 发表于 2008-6-16 16:03:54

这个就要用到回流了
ros不同版本的回流设置可能不同
你的ros版本是那个?
srcnat那里是如何设置的?

bxychang00 发表于 2008-6-16 19:44:41

对楼主的研究加上2条,根据我的研究,防火墙的策略一定要有顺序,要有先来后到极其指定,这样少费很多弯路,特别要指定inteface口,这样的话策略才显的专业,比如限速,上传和下载的网卡指定很关键的!所以要专业哦,现在啃FREEBSD,一个道理,明白了防火墙他就是一张纸,关键在于自己的思维和理解力!

ypw 发表于 2008-6-16 21:55:43

我的ROS是2.9.27的.图:这是回流设置.就是内网访问内网WEB后无法显示真实IP

[ 本帖最后由 ypw 于 2008-6-16 21:57 编辑 ]

xsjzjd88 发表于 2008-6-17 22:01:49

端口映射:
add chain=dstnatdst-address=外网ip protocol=tcp dst-port=80 \
    action=dst-nat to-addresses=192.168.0.254 to-ports=0-65535 comment="" \
    disabled=no
回流:
add chain=srcnat   src-address=192.168.0.0/24 action=src-nat \
    to-addresses=外网ip to-ports=0-65535 comment="" disabled=no
这样就可以了

另外你内网有几台电脑?
咋srcnat的src.address 172.16.0.0后面的掩码位数是16
你把你nat表里的规则都发上来看下(包括dstnatsrcnat)

ypw 发表于 2008-6-20 08:54:02

add chain=dstnat dst-address=外网IP   protocol=tcp dst-port=80 \
    action=dst-nat to-addresses=172.16.0.101 to-ports=80 comment="映射" \
    disabled=no
add chain=srcnat out-interface=lan src-address=172.16.0.0/16 \
    dst-address=172.16.0.101 protocol=tcp dst-port=80 action=src-nat \
    to-addresses=外网IP   to-ports=0-65500 comment="回流" disabled=no
就是这样的
内网有一百多台机子,这是公司做的时候就有的172.16.0.0/16的IP,后来也懒得改。

hp12514 发表于 2008-6-20 19:00:45

佩服楼猪的精神

xsjzjd88 发表于 2008-6-20 20:51:44

ypw兄,你的做法内网电脑用公网ip或公网域名
来访问内网web服务器时可以正确回流了

如果内网电脑访问内网web页用的是web服务器的内网ip也就是http://172.16.0.101
这样只会显示内网ip,因为这样的包根本没经过ros,只经过交换机,不知道我这样理解对不对.

还有你的nat表应该还有其它规则吧,就这两条的话你的内网电脑是上不了internet的

[ 本帖最后由 xsjzjd88 于 2008-6-20 21:03 编辑 ]

ypw 发表于 2008-6-21 20:28:38

谢谢xsjzjd88老兄,我的回流是可以的, 我说的是当内网访问我的内网WEB服务器时,WEB服务器无法正确显示内网IP,显示的都是我的外网IP.

downsky 发表于 2009-3-20 15:25:59

好文章,原来一直不明白nat转换是什么意思。总算明白了。现在网上一些高手讲的都是术语,作为差生的我,只能把名词记下来,一个一个去理解。难道碰到这样深入又易懂的文章。真是感谢啊

guhufeiying 发表于 2009-4-16 10:47:12

非常感谢楼主!
包到达ros,这里进行源地址转换(srcnat),把内网地址192.168.0.6转换为公网地址200.100.2.3,目标地址不变
这句话给我很大启示!在此表示感谢
页: [1] 2
查看完整版本: (原创) 对nat的理解