Usando iptables para redirecionar de acordo com a correspondência de padrões (--string)

2

o que eu quero fazer é redirecionar o tráfego da Web dessa maneira:

  1. Toda solicitação para a porta 80 que o HTTP GETs de um determinado endereço deve ser redirecionada para uma porta específica (4444).

  2. Todos os outros pedidos vão para a porta 80.

Como não posso fazê-lo usando módulos de proxy da Web e / ou encaminhamento por vários motivos, estou procurando uma maneira de fazer isso com o iptables. Inspirado por este artigo , usei esta regra para meus iptables:

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

Então eu abri dois processos netcat ouvindo 4444 e 80. No entanto, quando tento testar a regra com:

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

O que eu tenho é sempre apenas a partir da porta 80. O que estou fazendo errado?

    
por janesconference 24.02.2012 / 16:56

1 resposta

2

Você não pode redirecionar significativamente uma conexão como essa usando a correspondência de string. No momento em que a solicitação GET aparecer no fio, a conexão já foi estabelecida. Lembre-se, uma conexão TCP começa com um handshake de três vias ; a troca que estabelece a conexão não inclui nenhum dado do protocolo HTTP.

Além disso, as regras REDIRECT não afetarão o tráfego originado em seu host local. Se você estiver testando as regras REDIRECT , verifique também se está testando em outro sistema.

Você realmente precisa implementar um proxy de nível de protocolo para fazer esse tipo de coisa (por exemplo, o mod_rewrite do Apache com um destino de proxy funcionaria).

    
por 24.02.2012 / 17:13