Como redirecionar o tráfego de saída para a porta 80 usando o iptables localmente?

19

Estou tentando redirecionar localmente as portas na minha máquina Ubuntu usando iptables. Semelhante ao proxy transparente. Quero pegar qualquer coisa tentando deixar meu sistema na porta 80 e redirecioná-lo para um host e porta remotos.

Posso conseguir isso usando as funções NAT e pré-roteamento de iptables?

pjf
fonte

Respostas:

30

Tente esta iptablesregra:

$ sudo iptables -t nat -A OUTPUT -p tcp --dport 80 -j DNAT --to-destination IP:80

O acima diz para:

  • Adicione a seguinte regra à tabela NAT ( -t nat).
  • Esta regra será anexada ( -A) ao tráfego de saída ( OUTPUT).
  • Estamos interessados ​​apenas no tráfego TCP ( -p tcp).
  • Estamos interessados ​​apenas no tráfego cuja porta de destino é 80 ( --dport 80).
  • Quando tivermos uma partida, pule para DNAT ( -j DNAT).
  • Roteie esse tráfego para a porta IP @ de outro servidor 80 ( --to-destination IP:80).

O que é DNAT?

DNAT
    This target is only valid in the nat table, in the PREROUTING and OUTPUT 
    chains, and user-defined chains which are only called from those chains.
    It specifies that the destination address of the packet should be modified 
    (and all future packets in  this  connection will also be mangled), and
     rules should cease being examined.

Referências

slm
fonte
obrigado por isso, mas parece não funcionar. No entanto, desde então, encontrei isso que funciona.
pjf
sudo iptables -t nat -A OUTPUT -p tcp --dport 80 -j DNAT --para o destino xx.xx.xx.xx: 3128
pjf
Isso ocorre porque isso é local e não através de um gateway? seu SNAT funcionaria através de um gateway?
pjf
@pjf - Eu acredito que sim. Eu atualizei minha resposta.
slm
@pjf - Encontrei as duas regras e estava atualizando minha resposta com ambas. Eu não tinha certeza de qual situação você estava.
Slm
6

Isso pode ser mais específico para operar apenas no tráfego para um host de destino específico. Por exemplo, quando o postfix cometeu um erro e os e-mails na fila desejam ser enviados para um endereço IP antigo.

iptables -t nat -A OUTPUT -p tcp -d {ONLY_TO_THIS_DESTINATION} --dport 25 -j DNAT --to-destination {NEW_IP}:25
Widmo
fonte
4

Isso pode permitir a tradução de portas para todos os endereços IP. A principal diferença aqui é a ausência de um endereço IP no --to-destinationcampo.

iptables -t nat -A OUTPUT -p tcp --dport 80 -j DNAT --to-destination :80
Felipe Alvarez
fonte
Dica muito útil; exatamente o que eu precisava. Existe uma maneira de aumentar o número da porta? Digamos que eu tenha um intervalo de 100 portas e queira aumentá-las todas por uma quantidade específica.
Zdenek
Não tenho certeza do que você quer dizer. Você poderia escrever um loop for no Bash?
Felipe Alvarez
Um loop adicionando 100 regras de iptables funcionaria, mas diminuiria a velocidade. Eu preferiria poder dizer a ele para incrementar muitas portas sucessivas em uma única regra.
Zdenek
@Zdenek Não sei se isso é possível com o iptables. Você já olhou firewalld?
Felipe Alvarez