免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5816 | 回复: 6
打印 上一主题 下一主题

[网络] iptables本地端口转发问题,请教解决方案 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-04-25 19:20 |只看该作者 |倒序浏览
【问题描述】
我的服务器上有个web server,端口为80。我要写一个http验证程序,用来检测访问我web server的请求者是否合法。
目前我的方案是:我的验证程序在某个端口上监听,比如2324。用iptables将访问80端口的请求重定向到2324端口。这样客户端过来的请求会发送到我的验证程序中。验证完成之后,如果合法,再解除重定向,让其访问真正的80端口。
其中iptables规则如下:iptables -t nat -I PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 2324。
目前,这个方案运行良好。但有个问题是:我的2324端口是对外开放的,任何人都能直接访问这个端口。
如你所想,这肯定是非常不安全的。所以我想把2324端口改成本地端口,即netstat时能看到该端口的状态是:127.0.0.1:2324 ,而不是0.0.0.0:2324。
那么,现在问题来了。如何把80端口的数据转发到127.0.0.1:2324上去?(上面的那条iptables规则是转发不过去的)

【我的尝试】
我的第一反应就是用iptables的DNAT来转发,所以尝试了下面三条规则:
iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 80 -j DNAT --to 127.0.0.1:2324    (针对远程访问的)
iptables -t nat -A OUTPUT -p tcp -d 127.0.0.1 --dport 80 -j DNAT --to 127.0.0.1:2324   (针对本地访问的)
iptables -t nat -A OUTPUT -p tcp -d 112.12.32.43 --dport 80 -j DNAT --to 127.0.0.1:2324 (针对本地访问的)

测试的结果是:转发失败。2324端口根本没有收到任何数据。
然后在网络上各种搜索,赫然看到一篇文章说,这样转发,在理论上是不可能成功的。
顿时石化,我去,我该咋办?
【我想请教】
1.看上面的文章说的有理有据,我跑去翻了下linux内核源码,确实有文章中提到的代码。那么,是否真的就没办法转发了?是否还有什么奇技淫巧能绕过内核的这种限制呢?
2.如果确实不能,那我应该如何修改我的实现方案?
   首先,排除写个web server插件这种方案,尽管我知道这样可以,但是不适合我的项目。
   其次,我想到直接用原始套接口抓80端口的数据包,自己进行解析,然后走我的验证程序中的业务逻辑。但这样有个问题:在我验证完成之前,客户端仍然能正常访问我的web server。而以前的方案,由于80端口的数据转发到2324了,所以客户端在我验证完成之前是访问不到web server上去的。

各位大神,诚心请教!!先谢过!

论坛徽章:
2
2015年亚洲杯之乌兹别克斯坦
日期:2015-04-15 15:43:482015亚冠之迪拜阿赫利
日期:2015-06-30 20:36:46
2 [报告]
发表于 2015-04-29 18:09 |只看该作者
感觉你这个需求有点怪,既然2324需要提供服务,为什么还不对外开放呢?
退一步说,就算按照你DNAT的思路实现了转发,别人不一样可以通过80端口访问你2324端口么?

论坛徽章:
2
2015年亚洲杯之乌兹别克斯坦
日期:2015-04-15 15:43:482015亚冠之迪拜阿赫利
日期:2015-06-30 20:36:46
3 [报告]
发表于 2015-04-29 18:21 |只看该作者
不知道这个方案你是否满意,我没试验过,不过应该可以正常工作

验证程序依然监听0.0.0.0:2324,iptables规则增加一条(红色)
iptables -t mangle -I PREROUTING -p tcp --dport 2324 -j DROP
iptables -t nat -I PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 2324

论坛徽章:
0
4 [报告]
发表于 2015-05-08 11:36 |只看该作者
谢谢兄弟的指点,这个方案果然可行!回复 3# bfdhczw


   

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:51:16
5 [报告]
发表于 2015-12-28 09:49 |只看该作者
回复 3# bfdhczw


    你好,我想请教一下。iptables端口转发后  有没有netstat这种socket连接状态的查看方式。
因为之前用ssh隧道转发端口总是有很多不消失的fin_wait2和close_wait。用iptables转发后看不到这些网络状态了,但是用一会iptables转发就不好用了。不知道问题出在哪 怎么调查。
能指点一下吗,谢谢。

论坛徽章:
2
2015年亚洲杯之乌兹别克斯坦
日期:2015-04-15 15:43:482015亚冠之迪拜阿赫利
日期:2015-06-30 20:36:46
6 [报告]
发表于 2015-12-29 10:29 |只看该作者
回复 5# jxg945

iptables用一会就不好用了是什么意思?现象是什么?

另外,用iptables应该也是可以用netstat看状态的,通常情况下这个应该不会有问题才对。
   

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:51:16
7 [报告]
发表于 2015-12-29 14:36 |只看该作者
回复 6# bfdhczw


谢谢回复,问题解决了。看了系统参数优化设置中不知道谁之前写个forward=0  把转发关闭了。所以影响了iptables转发。   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP