LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1248|回复: 7

iptables疑问

[复制链接]
发表于 2006-4-17 10:32:45 | 显示全部楼层 |阅读模式
1. iptables -t nat -A PREROUTING -d 1.2.3.4 -p tcp -m tcp --dport 81 -j DNAT 192.168.0.2:8180

2. iptables -t nat -A POSTROUTING -d 192.168.0.2 -p tcp -m tcp --dport 8180 -j SNAT 192.168.0.1

第1条规则是把访问1.2.3.4的ip包的目的地址改为192.168.0.2

我想问一下,第2条规则是什么意思,我理解的很模糊,就知道是从相同网段的内网访问192.168.0.2 将原地址改为192.168.0.1,谁告诉我为什么要转换,怎么理解?

还有个问题 -m tcp 是“匹配tcp协议” ? 对吗

谢谢
发表于 2006-4-21 21:00:30 | 显示全部楼层

回不去

192.168.0.2的网关如果是192.168.0.1那么可以不需要第二条语句.如果不是就需要第二条语句,不然包回不去了.
回复 支持 反对

使用道具 举报

发表于 2006-4-25 00:51:52 | 显示全部楼层
Post by soccer
1. iptables -t nat -A PREROUTING -d 1.2.3.4 -p tcp -m tcp --dport 81 -j DNAT 192.168.0.2:8180

2. iptables -t nat -A POSTROUTING -d 192.168.0.2 -p tcp -m tcp --dport 8180 -j SNAT 192.168.0.1

第1条规则是把访问1.2.3.4的ip包的目的地址改为192.168.0.2

我想问一下,第2条规则是什么意思,我理解的很模糊,就知道是从相同网段的内网访问192.168.0.2 将原地址改为192.168.0.1,谁告诉我为什么要转换,怎么理解?

还有个问题 -m tcp 是“匹配tcp协议” ? 对吗

谢谢

第二条是和第一条配合使用的。包过了PREROUTING后目标变成192.168.0.2了,但源地址还是1.2.3.4,所以POSTROUTING的作用就是将源地址改成192.168.0.1。这样包才能正常回去。
-m tcp比较少见吧:ask ?-p tcp应该就是匹配tcp协议了。不过是所谓隐式。-m是所谓显式。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-4-27 16:49:57 | 显示全部楼层
Post by wanglu624
第二条是和第一条配合使用的。包过了PREROUTING后目标变成192.168.0.2了,但源地址还是1.2.3.4,所以POSTROUTING的作用就是将源地址改成192.168.0.1。这样包才能正常回去。
-m tcp比较少见吧:ask ?-p tcp应该就是匹配tcp协议了。不过是所谓隐式。-m是所谓显式。



明白,192.168.0.2>>192.168.0.1>>6.7.8.9 (是这个原理吧)

我想知道为什么要把原地址改成192.168.0.1才能返回6.7.8.9,  为什么192.168.0.2不能直接返回6.7.8.9呢?  嘿嘿


[color="Red"]假设某客户机的ip地址为6.7.8.9,它使用本机的1080端口连接1.2.3.4的81端口,发出的ip包源地址为6.7.8.9,源端口为1080,目的地址为1.2.3.4,目的端口为81


谢谢
回复 支持 反对

使用道具 举报

发表于 2006-4-27 20:33:33 | 显示全部楼层
内网地址192.168.X.X和公网地址是不能直接通信的。你的192.168.0.1是路由或网关吧?他一定还有一个公网的地址。这样才能交流
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-4-28 11:30:19 | 显示全部楼层
有点明白了,还有个小问题:

如果客户机和HTTP服务器在同一个内网(这里是指所有机子不需要经过路由器而可以直接互相访问的网络,不是那种把服务器和客户机又分在不同子网的情况)的客户访问它时会发生什么。我们假设客户机的IP为$LAN_BOX,其他设置同上。


包离开$LAN_BOX,去往$INET_IP。

包到达防火墙。

包被DNAT,而且还会经过其他的处理。但是包没有经过SNAT 的处理,所以包还是使用它自己的源地址,就是$LAN_BOX(译者注:这就是IP 传输包的特点,只根据目的地的不同改变目的地址,但不因传输过程中要经过很多路由器而随着路由器改变其源地址,除非你单独进行源地址的改变。其实这一步的处理和对外来包的处理是一样的,只不过内网包的问题就在于此,所以这里交待一下原因)。

包离开防火墙,到达HTTP服务器。

HTTP服务器试图回复这个包。它在路由数据库中看到包是来自同一个网络的一台机子,因此它会把回复包直接发送到请求包的源地址(现在是回复包的目的地址),也就是$LAN_BOX。

回复包到达客户机,但它会很困惑,因为这个包不是来自它访问的那台机子。这样,它就会把这个包扔掉而去等待“真正”的回复包

针对这个问题有个简单的解决办法,因为这些包都要进入防火墙,而且它们都去往需要做DNAT才能到达的那个地址,所以我们只要对这些包做SNAT操作即可。比如,我们来考虑上面的例子,如果对那些进入防火墙而且是去往地址为$HTTP_IP、端口为80的包做SNAT操作,那么这些包就好象是从$LAN_IP来的了,也就是说,这些包的源地址被改为$LAN_IP了。这样,HTTP服务器就会把回复包发给防火墙,而防火墙会再对包做 Un-DNAT操作,并把包发送到客户机。解决问题的规则如下:

iptables -t nat -A POSTROUTING -p tcp --dst $HTTP_IP --dport 80 -j SNAT \ --to-source $LAN_IP

[color="Red"]我的问题是为什么来自内网的访问ip要做snat而来自外网就不需要 ?

谢谢wanglu624
回复 支持 反对

使用道具 举报

发表于 2006-4-28 13:35:16 | 显示全部楼层
Post by soccer
有点明白了,还有个小问题:

如果客户机和HTTP服务器在同一个内网(这里是指所有机子不需要经过路由器而可以直接互相访问的网络,不是那种把服务器和客户机又分在不同子网的情况)的客户访问它时会发生什么。我们假设客户机的IP为$LAN_BOX,其他设置同上。


包离开$LAN_BOX,去往$INET_IP。

包到达防火墙。

包被DNAT,而且还会经过其他的处理。但是包没有经过SNAT 的处理,所以包还是使用它自己的源地址,就是$LAN_BOX(译者注:这就是IP 传输包的特点,只根据目的地的不同改变目的地址,但不因传输过程中要经过很多路由器而随着路由器改变其源地址,除非你单独进行源地址的改变。其实这一步的处理和对外来包的处理是一样的,只不过内网包的问题就在于此,所以这里交待一下原因)。

包离开防火墙,到达HTTP服务器。

HTTP服务器试图回复这个包。它在路由数据库中看到包是来自同一个网络的一台机子,因此它会把回复包直接发送到请求包的源地址(现在是回复包的目的地址),也就是$LAN_BOX。

回复包到达客户机,但它会很困惑,因为这个包不是来自它访问的那台机子。这样,它就会把这个包扔掉而去等待“真正”的回复包

针对这个问题有个简单的解决办法,因为这些包都要进入防火墙,而且它们都去往需要做DNAT才能到达的那个地址,所以我们只要对这些包做SNAT操作即可。比如,我们来考虑上面的例子,如果对那些进入防火墙而且是去往地址为$HTTP_IP、端口为80的包做SNAT操作,那么这些包就好象是从$LAN_IP来的了,也就是说,这些包的源地址被改为$LAN_IP了。这样,HTTP服务器就会把回复包发给防火墙,而防火墙会再对包做 Un-DNAT操作,并把包发送到客户机。解决问题的规则如下:

iptables -t nat -A POSTROUTING -p tcp --dst $HTTP_IP --dport 80 -j SNAT \ --to-source $LAN_IP

[color="Red"]我的问题是为什么来自内网的访问ip要做snat而来自外网就不需要 ?

谢谢wanglu624


你好像是从什么书上抄了一段过来。呵呵,不太完整,我只能猜测你的意思。这个问题应该是这样吧。内网客户器可以直接访问同一内网的web服务,直接键入直接键入服务器的内网地址就可以了。一般来说这时数据包是不经过网关的,因为客户机只要广播一下找到谁是服务器,服务器发给客户端他的mac地址双方就可以进一步传信息了。

但如果你在内网用web服务器的公网地址登陆的话,就可能会出现你copy的那段文字说的那种情况,我也在书上看过说这种问题的。我觉得书上说得很清楚呀,当然他没有说是什么问题引起客户机的困惑,呵呵!你知道TCP协议的“三次握手”后才开始传数据的内容吗?客户机收到的从内网服务器直接发过来的包,由于原地址和它一开始发出去的服务器的公网地址不同,而封包上带的标记主要是指syn和ack这两个为1,这让客户机不能理解,所以会将其丢弃。如果你不能明白,那么你应该看看TCP协议的简单的内容。

当然内网服务器会直接把包发给客户机而不通过路由是跟服务器上的路由表有关的,你可以用route命令查看和修改。
回复 支持 反对

使用道具 举报

发表于 2006-4-28 17:17:53 | 显示全部楼层
我的问题是为什么来自内网的访问ip要做snat而来自外网就不需要 ?
因为内网IP是每个人都可以用的,你可以用,我可以用,属于保留地址,在外网是不允许出现这样的地址的。所以内网的IP需要SNAT。

外网可以直接通讯,就不需要SNAT了。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表