LinuxSir.cn,穿越时空的Linuxsir!

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

端口转发:iptables在网络中的一个经典应用

[复制链接]
发表于 2002-8-16 00:31:45 | 显示全部楼层 |阅读模式

声明:本文由xchen兄[cdcxx@etang.com]所有,任何人转帖必须注明原创作者xchen兄的大名及电子信箱,其次也要注明来源于www.linuxsir.cn。这样有利于通过来源,真正知道谁才是真正原创作者。

尊重他人就是尊重自己!!!!!

多谢xchen兄!!!

北南 加注

端口转发:iptables在网络中的一个经典应用


在详述端口转发之前,先讲一下我日前遇到的一件事情。
本人是搞测试的,有一厂家拿了一个服务器软件叫我测试。基于win2k的,端口号为881,服务器直接连接外部网络,客户端通过服务器ip来访问,而他们没有基于linux的服务器软件,照他们意思就必须将服务器换成windows的。作为一个linux爱好者,我想大家都明白这种痛苦。我翻了一下资料,发现iptables的端口转发功能可以解决,折腾了一下午,终于完成任务。下面将我的方法讲一下:
思想:利用端口转发,当服务器接收到881端口请求以后,将其转到  10.10.2.200:881上,10.10.2.200再将数据返回给请求连接者。
Eth0:连接ADSL,即ppp0接口
Eth1:连接内部网络,ip为10.10.1.1
10.10.2.200为win2k服务器,其端口881提供网络服务。

a.b.c.dàppp0:881à eth1à10.10.2.200:881   ;数据进来时的路线
10.10.2.200:881àeth1àppp0:881àa.b.c.d    ;数据出去时的路线

iptbles脚本:
iptables -t nat -A PREROUTING -p tcp -m tcp --dport 881 -j DNAT --to-destination 10.10.2.200:881    ;将881请求转发至10.10.2.00:881端口
iptables -t nat -A  POSTROUTING -s 10.10.0.0/16 -d 10.10.2.200 -p tcp -m tcp --dport 881 -j SNAT --to-source 10.10.1.1  ;返回a.b.b.d时数据源来自同一子网,就将其源地址更改为10.10.1.1,从eth0发出,并在连接跟踪表中查出a.b.c.d是从ppp0进来的,又由ppp0将此数据发出。
当然不要忘了加一条允许881端口访问的语句。
iptables –A INPUT –p tcp –dport 881 –i ppp0 –j ACCEPT

可不可把服务器放在局域内,用端口转发来实现呢?答案当然是肯定的,既然能把881端口转发,那么21,80这些个端口更不在话下,而且很多服务器软件都可以自定义端口,那就在得玩了,只要有合适的端口,即使给局域网每一个用户开一个ftp服务器也是可以的。你想要实现什么服务都可以,当然是基于端口转发的。

局域网内10.10.2.101是win2k,提供www服务,端口为800
通过服务器http://serverip:800 进行访问。
iptables -t nat -A PREROUTING -p tcp -m tcp --dport 800 -j DNAT --to-destination 10.10.2.101:800
iptables -t nat -A  POSTROUTING -s 10.10.0.0/16 -d 10.10.2.101 -p tcp -m tcp --dport 800 -j SNAT --to-source 10.10.1.1
iptables –A INPUT –p tcp –dport 800 –i ppp0 –j ACCEPT

由于是基于端口转发实现的,所以服务器上只需装个iptables来转发数据就行了,一切服务由内部服务器完成,这样的话,我想linux服务器才真正的算是个防火墙。

唠唠叨叨写了这么久,其实我也明白很多人都会,但是应该还有像我一样的初学者在这个问题上苦苦摸索,能够少走弯路有什么不好呢?哈,就算是灌水啦。。。。。。
发表于 2002-8-16 11:05:51 | 显示全部楼层
在这里看到了两篇xchen很好的文章,对我十分有用。
谢谢!
发表于 2002-8-16 20:41:38 | 显示全部楼层
确实是很有启发性,而且简单易懂
发表于 2002-10-14 22:07:33 | 显示全部楼层
所有的资料我全都看完了也很细,但还是有90%不明白,我想在这问一下菜鸟级的问题,在那能找到关于IPTABLES的资料和参数说明(最好是中文)
 楼主| 发表于 2002-10-15 09:04:10 | 显示全部楼层

ftp://xchen.3322.org/linux/iptables/

iptables的详细文档
发表于 2003-12-26 17:43:24 | 显示全部楼层
我试了试,但局域网内访问www时,却也被导至自己的内部网站了。
发表于 2003-12-26 19:47:55 | 显示全部楼层
iptables -t nat -A POSTROUTING -s 10.10.0.0/16 -d 10.10.2.101 -p tcp -m tcp --dport 800 -j SNAT --to-source 10.10.1.1
为什么是--dport 800
回应的时候是服务器的800口,到iptables的同一网络接口
然后转到对外的那个接口,在从这个对外接口的800回应原来请求。难道不是这样?
发表于 2003-12-26 20:34:40 | 显示全部楼层
理解一下 包当然是800端口的返还了 目的是你内网机器的数据出去的时候SNAT 如果是http可以不需要这句因为HTTP是单向的
发表于 2003-12-27 09:09:06 | 显示全部楼层

有点问题需要注意

我觉得有点问题需要注意一下:

我在公司也做过这个,但我们公司连接internet的不止一个IP,并且局域网内的电脑的网关是指向DDN专线的(连到香港),所以如果像楼主说的这样,那应该还要把内网的服务器的PC的网关指向linux服务器的内部IP,这样才能向外提供服务。我原来就是因为这个没有做,结果找了很久,才解决这个问题。
发表于 2003-12-27 12:08:25 | 显示全部楼层
--dport 800
我理解是目的端口 4 800的数据包丫
应该是--sport 800吧?
84吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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