Manter a porta de destino dos pacotes TCP depois de sair através de outra porta local

1

problema:

Eu tenho um aplicativo em um host (vamos chamá-lo de host1 ) que envia pacotes TCP criptografados por TLS para a porta 5015 de outro host (vamos chamá-lo de host2 ). Devido a restrições de rede, o host1 deve ter todo o tráfego de entrada e saída entrando e saindo por 80 ou 443. Não tenho acesso a host2 .

abordagem:

Meu pensamento é que eu poderia criar uma regra iptables em host1 que irá rotear / redirecionar / encaminhar o tráfego 5015 de 443 e ter que chegar em host2:5015 . O problema que estou tendo é criar a regra certa. Aqui está o que eu tenho até agora:

TCP_TRAFFIC_PORT=5015
PROXY_PORT=443

_apply_outbound_rules() {
    # Forward outgoing packets through the proxy port
    sudo iptables -t nat \
        -I OUTPUT 1 \
        -p tcp --destination-port $TCP_TRAFFIC_PORT \
        -j DNAT --to-destination :$PROXY_PORT

    # Send packets to host2:5015 port (this is likely the rule to fix)
    sudo iptables -t nat \
        -I POSTROUTING 1 \
        -p tcp --destination-port $PROXY_PORT \
        -j SNAT --to-source :$TCP_TRAFFIC_PORT
}

apply_outbound_rules

Alguém sabe como fazer isso? Parece uma coisa comum de se deparar, mas estou tendo problemas com isso.

    
por delos 16.04.2018 / 19:06

2 respostas

1

Primeiro, o NAT no linux é stateful. Significa que você não precisa de uma regra de saída e de entrada. Quando o tráfego volta em que foi enviado NAT, o linux irá automaticamente un-NAT que retornam o tráfego.

Embora o principal problema que você terá é que uma sessão TCP é definida pela combinação de:

  • IP de origem
  • porta de origem
  • IP de destino
  • porto de destino

O IP de origem já está limitado a um único valor (IP do host1). O IP de destino já é um valor único (IP do host2). Porta de origem tem apenas 2 valores possíveis (80 e 443). E o porto de destino está limitado a um único valor (5015).
Isso significa que você só pode estabelecer um máximo de 2 conexões simultâneas (se você balancear a carga do SNAT pelas duas portas). E mesmo com conexões seqüenciais, é provável que você tenha problemas com a reutilização de portas, como a porta que está em um estado TIME_WAIT.

No entanto, se você realmente quiser tentar isso, a regra que deve ser feita é:

iptables -t nat -I POSTROUTING \
  -d $HOST2_IP -p tcp --dport $TCP_TRAFFIC_PORT \
  -j SNAT --to-source :$PROXY_PORT
    
por 16.04.2018 / 21:07
0

Você sabe em qual porta o aplicativo é executado em seu host, se não, então você precisa mapear todas as portas de origem para 80 ou 443

Tente abaixo com a substituição de host2ip.

iptables -t nat -A POSTROUTING -p tcp -d host2ip -j SNAT -m multiport  --sports 1:65535 --to-source :443
    
por 17.04.2018 / 06:54