- 论坛徽章:
- 0
|
【问题描述】
我的服务器上有个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上去的。
各位大神,诚心请教!!先谢过! |
|