使用 iptables 根据模式匹配(--string)进行重定向

使用 iptables 根据模式匹配(--string)进行重定向

我想要做的是通过这种方式重定向网络流量:

  1. 对给定地址的端口 80 的每个 HTTP GET 请求都应重定向到特定端口 (4444)。

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

由于各种原因,我无法使用 Web 代理模块和/或转发来实现这一点,因此我正在寻找一种使用 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。但是,当我尝试使用以下命令测试规则时:

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

我总是只收到来自端口 80 的响应。我做错了什么?

答案1

您无法使用字符串匹配来重定向这样的连接。当GET请求通过网络发送时,连接已经建立。请记住,TCP 连接以三次握手;建立连接的交换不包含任何 HTTP 协议数据。

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

您确实需要实现协议级代理来执行此类操作(例如,mod_rewrite具有代理目标的 Apache 就可以工作)。

相关内容