使用iptables根据模式匹配(–string)redirect

我想要做的是以这种方式redirectnetworkingstream量:

  1. 每个端口80的请求都应该被redirect到一个特定的端口(4444)。

  2. 其他每个请求都会转到80端口。

由于我不能通过使用networking代理模块和/或出于各种原因转发,我正在寻找一种方法来做到这一点与iptables。 受这篇文章的启发,我对我的iptables使用了这个规则:

sudo iptables -t nat -A PREROUTING -p tcp --dport 80 \ -m string --algo bm --string 'GET /mjpegcgi.cgi' \ -j REDIRECT --to-port 4444 

然后,我打开两个netcat进程在4444和80上进行侦听。但是,当我尝试使用以下规则testing规则时:

 wget -qO- http://192.168.1.88/mjpegcgi.cgi 

我所拥有的只是端口80的响应。 我究竟做错了什么?

你不能像这样使用string匹配来redirect连接。 在GET请求结束时,连接已经build立。 请记住,TCP连接始于三次握手 ; build立连接的交换不包含任何HTTP协议数据。

此外, REDIRECT规则不会影响源自本地主机的stream量。 如果您正在testingREDIRECT规则,请确保您正在从另一个系统进行testing。

你真的需要实现一个协议级别的代理来做这种事情(例如,Apache的代理目标的mod_rewrite可以工作)。