最近,到处看到有人问这个问题,怎么以前没人问,现在这么多人问呢?前两天我还在华为的论坛上仔细的说了这个问题,现在复制到这边来。希望能帮助大家理解这个问题。
这是个理论问题,我们先从NAT讲起:NAT有两种基本类型,一种是SNAT(Source NAT),一种是DNAT(Dest. NAT).SNAT即源NAT是改变数据包的IP层中的源IP地址,一般是用来将不合法的IP外出请求转换成合法的IP的外出请求,就是普通的用一个或者几个合法IP来带动一整个非法IP段接入。 DNAT即目的NAT,就是改变数据包的目标IP地址,使得能对数据包重新定向,可以用做负载均衡或者用于将外部的服务请求重定向到内网的非法IP的服务器上。
好了,罗嗦了一通,大致就是这样了。 那么之所以会出现无法在DNAT的内部网络通过DNAT服务的外部IP地址来访问的情况,是因为,如果服务从内部请求,那么经过DNAT转换后,将目标IP改写成内网的IP地址,譬如172.16.10.254,而请求的机器的IP是 172.16.10.100,数据包被网关172.16.10.1顺利的重定向到172.16.10.254的服务端口,然后,192.16.10.254根据请求发送回应给目的IP地址,就是172.16.10.100,但是,问题出现了,因为172.16.10.100请求的地址是外部IP 假设是221.232.34.56,所以他等待着221.232.34.56的回应,而172.16.10.254的回应请求被看做是非法的,被丢弃了。这就是问题的所在了。
呵呵,写的有点混乱,不好意思。不知道大家明白没有.那么如何解决这个问题,我说个用iptables实现的例子,
#我们先把发向外网IP221.232.34.56 80号端口的数据重定向到172.16.10.254 理论上来讲,如果只要从外网访问,这就完成了。
iptables -t nat -A PREROUTING -p tcp -d 221.232.34.56 --dport 80 -j DNAT --to-destination 172.16.10.254
#解决内网通过外网IP访问的情况
iptables -t nat -A POSTROUTING -p tcp -d 172.16.10.254 --dport 80 -j SNAT --to-source 172.16.10.1
我们将内网的请求强行送回到网关172.16.10.1,依靠网关在内核建立的状态表再转发到真实的请求地址172.16.10.100.
当然,这并不是最好的解决方法,最好的解决方法是将服务器放在另外一个网段,也就是说所谓的DMZ(解除武装区),这样就不会出现上面所说的问题了。
如果大家还不清楚,给个参考文档:
http://iptables-tutorial.frozentux.net/iptables-tutorial.html#DNATTARGET
就先说到这里了,我要去上班了。
fushuyong 回复于:2004-07-24 13:33:53
居然一个人都没回复的,难道这个问题不具备普遍性?
我爱臭豆腐 回复于:2004-07-26 08:08:08
good
jlwhc 回复于:2004-07-26 08:54:02
这个DNAT(又叫端口映射),这个问题网上的问法基本就是“为什么内网不可以访问自己网关上的端口映射,即外面正常转入数据了。为什么内部不给反向转回?”
实际上用
iptables -t nat -A PREROUTING -p tcp -d wan_ip --dport 80 -j DNAT --to lan_ip:80
就可以很好解决了
如果基于网络设备,比如ethx,的DNAT就存在上面的问题了
至于freebsd的ipfilter,ipfw
openbsd的packet filter,都存在这个问题,不过都可以通过重定向来源数据到本地回环然后解决
hcjia 回复于:2004-07-26 09:47:59
如果防火墙PIX没有DMZ(两个端口),如何解决这个问题呢?
njdaboy_cn 回复于:2004-07-26 11:12:32
好贴!!
skylove 回复于:2004-07-26 13:07:34
把服务器裸到外网上。。。不过防火墙上该走桥方式的嘛。。。
古 回复于:2004-07-26 16:50:56
防火墙不一定就支持混合模式哦。
onebuyone 回复于:2004-07-27 14:29:24
以前这样的问题比较多见。现在感觉好久没有遇到这样的问题了。现在大多数的防火墙都能够实现这样的访问。具体各个厂家的解决方法可能不同。Check Point防火墙是把请求访问的数据包的源地址更改为防火墙的外部公有的IP地址,这样内部的服务器返回的数据包会先传到防火墙外部的公有IP地址后再传递到内部的请求计算机。至于其他防火墙是不是这样就没有留意。
小蟹 回复于:2004-07-27 16:11:31
有防火墙的话做一个端口映射就什么都解决了
fushuyong 回复于:2004-07-29 23:22:34
呵呵,其实这个问题很具备现实意义,因为有很多厂商的路由器和防火墙在设计的时候并没有考虑到有这种引用,当然,一般的建议是将服务器放在DMZ区,这样就不会出现问题了。
子小水兽 回复于:2004-07-30 19:48:26
在cisco的路由器中怎么做dnat?
likuku 回复于:2004-08-03 19:09:20
艾。。。早有人有专文论述和解决这个问题了。
OS是FreeBSD防火墙是ipfilter,NAT部分是ipfilter的ipnat.
是cnfug的第12期文章,非常详细,结合网络嗅探器进行TCP/IP理论分析,还有解决方法:
《基于IP Filter的NAT透析--曾慧鹏 》
http://www.cnfug.org/journal/12/02.html
Ryker 回复于:2004-08-10 15:16:17
太经典啦,我这就有这个问题
回去搞定
wangrujun 回复于:2004-08-14 08:57:22
在防火墙上解决这个问题未免太笨。应该用dns来解决这个问题。干干净净,清清爽爽,对带宽又没有任何影响。
太空漫游 回复于:2004-08-15 19:10:24
关键问题是,楼主说的我看不懂,但是我知道以前当我们用NE05的时候,曾经是好使的,就是说内网用户通过公网的IP或者域名来访问与自己在同一内网的某台服务器时(在NE05上为改服务器做的静态IP映射),是好使的,后来华为的人为我们的NE05进行软件版本升级后,反而不好用了,我在华为论坛看到这个问题了,大概有个帖子就是楼主发的吧。
另外我以前用过CISCODE路由器,也曾经好使过。
yzz_jn 回复于:2004-08-16 21:29:31
引用:原帖由 "fushuyong"]居然一个人都没回复的,难道这个问题不具备普遍性? 发表:
好 :em02:
level 回复于:2004-08-20 21:22:01
:)
paulwang 回复于:2004-08-23 11:21:20
有必要怎么复杂吗, 建个内部DNS不就可以解决这样的问题吗? 随便说说, 没仔细看你的帖
wingger 回复于:2004-08-23 13:37:26
有碰到过。。。不过用DNS了
不过有时调试的时候还要要用到的,不错 :lol:
dugong 回复于:2004-08-25 11:04:35
看了各位的帖子,感觉小弟的情况类似这样,可是我已经使用DMZ了,却也不好用,以前发过帖子,可没人回答大家帮忙再看看,谢谢了。
PIX防火墙中的WEB,外网可以访问,内网的反而不行,奇怪了。
小弟搞了好长时间,头都晕了,大家帮忙看看配置,谢谢。
网络情况是以下拓扑图所标示的,从外界访问网站没问题,内部机器上Internet也没问题,就是内部机器访问网站不行,直接输入服务器IP地址也不行,真是奇了怪了。
以下是PIX的配置,路由器没有作特别设置,只是作为联出去的设备,除了IP设置外,就是静态路由 ip route 0.0.0.0 0.0.0.0 10.255.64.125。
PIX Version 6.1(1)
nameif ethernet0 outside security0
nameif ethernet1 inside security100
nameif ethernet2 DMZ security10
hostname Firewall
domain-name Pix.com
fixup protocol ftp 21
fixup protocol http 80
fixup protocol h323 1720
fixup protocol rsh 514
fixup protocol rtsp 554
fixup protocol smtp 25
fixup protocol sqlnet 1521
fixup protocol sip 5060
no fixup protocol skinny 2000
no names
name 192.168.0.6 inside
name 192.168.1.1 DMZ
name 221.13.19.114 outside
access-list 101 permit icmp any any
access-list 101 permit ip any any
pager lines 24
interface ethernet0 auto
interface ethernet1 auto
interface ethernet2 auto
icmp permit any outside
icmp permit any inside
mtu outside 1500
mtu inside 1500
mtu DMZ 1500
ip address outside 221.13.19.114 255.255.255.240
ip address inside 192.168.0.6 255.255.255.0
ip address DMZ 192.168.1.1 255.255.255.0
ip audit info action alarm
ip audit attack action alarm
pdm location 192.168.0.1 255.255.255.255 inside
pdm location 192.168.1.2 255.255.255.255 DMZ
pdm location 192.168.0.6 255.255.255.255 inside
pdm location 221.13.19.114 255.255.255.255 outside
pdm history enable
arp timeout 14400
global (outside) 1 221.13.19.119-221.13.19.126 netmask 255.255.255.240
global (outside) 1 221.13.19.117 netmask 255.255.255.240
global (DMZ) 1 192.168.1.4-192.168.1.24 netmask 255.255.255.0
nat (inside) 1 192.168.0.0 255.255.255.0 0 0
nat (DMZ) 1 192.168.1.0 255.255.255.0 0 0
static (DMZ,outside) 221.13.19.118 192.168.1.2 netmask 255.255.255.255 0 0
access-group 101 in interface DMZ
conduit permit tcp host 221.13.19.118 eq www any
conduit permit icmp host 221.13.19.118 any
conduit permit tcp host 221.13.19.118 eq pop3 any
conduit permit tcp host 221.13.19.118 eq smtp any
conduit permit tcp host 221.13.19.118 eq ftp any
conduit permit tcp host 221.13.19.118 eq 2005 any
conduit permit tcp host 221.13.19.118 eq 3000 any
conduit permit tcp host 221.13.19.118 eq 3389 any
conduit permit icmp 221.13.19.112 255.255.255.240 any
conduit permit tcp 192.168.0.0 255.255.255.0 range 6891 6900 any
conduit permit udp 192.168.0.0 255.255.255.0 range 5004 65535 any
route outside 0.0.0.0 0.0.0.0 221.13.19.113 1
timeout xlate 3:00:00
timeout conn 1:00:00 half-closed 0:10:00 udp 0:02:00 rpc 0:10:00 h323 0:05:00 si
p 0:30:00 sip_media 0:02:00
timeout uauth 0:05:00 absolute
aaa-server TACACS+ protocol tacacs+
aaa-server RADIUS protocol radius
http server enable
http 192.168.0.1 255.255.255.255 inside
http 192.168.0.0 255.255.255.0 inside
no snmp-server location
no snmp-server contact
snmp-server community public
no snmp-server enable traps
floodguard enable
no sysopt route dnat
telnet 10.220.52.16 255.255.255.240 outside
telnet 10.0.0.0 255.0.0.0 outside
telnet 192.168.0.0 255.255.255.0 inside
telnet 10.220.52.17 255.255.255.255 inside
telnet 192.168.1.0 255.255.255.0 inside
telnet 10.220.52.17 255.255.255.255 DMZ
telnet timeout 5
ssh timeout 5
terminal width 80
小弟已经看了若干遍了,很多可能性都考虑到了,还是不行,哪位老大辛苦看看配置,哪里有问题?谢谢了。
thy_email 回复于:2004-09-30 13:12:14
静态nat ,动态nat,源nat,目的nat
global----nat
static====conduct
没搞清楚什么关系????
快乐玩家 回复于:2004-12-09 17:03:59
楼上几位,我用FreeBSD下,也有类似问题
内网用户可以访问 内网 WEB 服务器的外网IP,但不能访问同一台服务器的 FTP。
外网用户却可以访问这台FTP
这是怎么回事呀??盼请各位高人指导啊
qiuqiu_wang 回复于:2005-01-19 23:16:04
好文章,可看不太明白,我看得头都大了.
东方补白 回复于:2005-01-20 09:41:52
,
fengyu2002 回复于:2005-04-19 17:30:44
ip nat outside destination static global-ip local-ip
hunterdong 回复于:2005-05-11 09:41:20
我看了,好象你是缺 access-group的定义
只有 access-group 101 in interface dmz
应该把 101给inside,100给outside
dmz似乎不需要access-group
|