我想要做的是通过这种方式重定向网络流量:
对给定地址的端口 80 的每个 HTTP GET 请求都应重定向到特定端口 (4444)。
每个其他请求都转到端口 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 就可以工作)。