iptables: proxy de tráfego tcp transparente

1

problema:

Eu tenho um servidor TCP e cliente que cada um escuta na porta 9000. Eu tenho o servidor e o cliente implantados em dois hosts diferentes, onde o tráfego só pode passar pela porta 80 entre eles. Eu quero que a porta de origem (9000) seja mantida quando os pacotes forem enviados entre eles (consulte a regra SNAT abaixo) para que a regra PREROUTING possa identificar os pacotes com --source-port .

abordagem:

Estou tentando configurar regras iptables de forma que o servidor roteie seu tráfego da porta 9000 para a porta 80 e uma regra complementar para o cliente em que o tráfego de entrada na porta 80 seja roteado para 9000 localmente.

Eu criei este script para aplicar as regras. Eu tentei isso com algumas variações e os pacotes parecem ser aceitos pelo host do servidor, mas não aceitos pela regra PREROUTING (entrada).

       #!/bin/bash

       apply_inbound_rules() {
            # Allow incoming server traffic from port 80 to the TCP client
            sudo iptables -t nat \
                -I PREROUTING \
                -p tcp --destination-port $PROXY_PORT \
                -j REDIRECT --to-port $TCP_PORT
        }

        apply_outbound_rules() {
            # Setup outgoing packets created by the TCP server to route through local port 80 
            # and received on port 80 on the client host
            sudo iptables -t nat \
                -I OUTPUT \
                -p tcp --destination-port $TCP_PORT \
                -j DNAT --to-destination :$PROXY_PORT

            # To maintain the TCP_PORT
            sudo iptables -t nat \
                -I POSTROUTING \
                -p tcp --destination-port $PROXY_PORT \
                -j SNAT --to-source :$TCP_PORT 
        }

        apply_inbound_rules
        apply_outbound_rules

Alguém tem experiência em criar regras como essa? Parece que seria um problema comum, mas não consigo descobrir.

    
por delos 30.12.2017 / 06:21

1 resposta

2

Esta é uma tradução do meu comentário para uma resposta.

As regras devem ser ajustadas para depender de um MASQUERADE de saída da porta de origem para manipular os pacotes de retorno. Assim, os pacotes de saída devem ser DNAT-ed com a regra que você tem e MASQUERADE-ed com uma regra:

iptables -t nat -A POSTROUTING -p tcp --destination-port $PROXY_PORT -j MASQUERADE --to-ports $TCP_PORT

Use essa regra em vez de sua regra SNAT.

Os pacotes recebidos relativos àqueles que foram MASQUERADE-ed terão suas portas de destino devidamente mapeadas de retorno.

(corrigido de acordo com o comentário)

    
por 31.12.2017 / 00:45