使用iptables将LAN HTTPstream量重新路由到node.js代理

我试图redirect在我的局域网中生成的所有httpstream量到在特定机器上运行的node.js代理。

我用的是: iptables -t nat -A PREROUTING -s 192.168.1.3 -p tcp --dport 80 -j DNAT --to 192.168.1.2:8080

(此时testing一台源机器,代理服务器位于192.168.1.2:8080)。 不幸的是,stream量并没有达到代理。 我可以看到数据包计数器在规则上递增,如果我向LOG添加另一个规则,我可以看到来自192.168.1.3机器的httpstream量的日志条目。

代理,但是,不会得到stream量。 我有它设置为logging请求连接,我什么也没有看到。 如果我有浏览器使用192.168.1.2:8080作为代理,它工作得很好。

node.js代理是一个随机redirectstream量的简单透明代理。

 var httpProxy = require("http-proxy"); var http = require("http"); var url = require("url"); var net = require('net'); var redirect_host = url.parse(redirect_url).host; var server = http.createServer(function (req, res) { var urlObj = url.parse(req.url); var target = urlObj.protocol + "//" + urlObj.host; if (Math.random() > redirect_chance || urlObj.host == redirect_host) { var proxy = httpProxy.createProxyServer({}); proxy.on("error", function (err, req, res) { console.log("proxy error", err); res.end(); }); console.log("Not redirecting " + target); proxy.web(req, res, {target: target}); } else { console.log("Redirecting " + target + " to", redirect_url); res.writeHead(302, {'Location': redirect_url}); res.end(); } }).listen(8080); 

任何想法我做错了什么?

尝试添加以下规则: iptables -t nat -A POSTROUTING -s 192.168.1.3 -d 192.168.1.2 -j SNAT --to 192.168.1.1 ,它不起作用。 那么,不完全是。 我看到下面的数据包添加了这个规则,当我从客户端发出一个HTTP请求:

(网关:192.168.1.1,代理服务器:192.168.1.2,客户端:192.168.1.3)

 SYN from Gateway to Proxy Server SYN+ACK from Proxy Server to Gateway ACK from Gateway to Proxy Server HTTP Request from Client to Proxy Server 

我不知道为什么HTTP请求也不是被SNAT的…或者如果这很重要(我猜不是)。

接下来,我看到HTTP请求从客户端连续重传到代理服务器。 从我可以告诉它,因为代理服务器永远不会发送一个ACK。 当我在浏览器中取消请求时,客户端重新发送,但是这次使用ACK + FIN,导致代理服务器进行ACK并发送响应(都到网关,而不是客户端)。 这可能是代理服务器的问题,虽然可能是因为它从一个意外的源获取http请求?

iptables: http : //pastebin.com/FvNq1Dyf

tcpdump: http : //pastebin.com/zMBj10Qj

您确实只设置了适当数据包stream量的一半规则。 你的规则是什么,它改变了数据包进入iptables网关的目的地址。

接下来,这个数据包被转发到您的代理,但它的源IP保持不变。 因此,您的代理认为它从客户端计算机接收到TCP SYN请求,并直接作出响应,但由于客户端未打开此连接,SYN + ACK将被丢弃。 你可以使用Wireshark和tcpdump来validation。

为了减轻这一点,你应该添加一个规则到POSTROUTING ,这个规则也会执行一个SNAT把你的客户端的源IP改为那个iptables的网关。 沿着这些线(我假设你的iptables网关IP是192.168.1.1):

 iptables -t nat -A POSTROUTING -s 192.168.1.3 -d 192.168.1.2 -j SNAT --to 192.168.1.1