Use iptables para encaminhar ipv6 para ipv4?

15

Atualmente, tenho uma configuração em que, devido à configuração que levaria uma eternidade para ser corrigida, tenho um servidor que só pode ser acessado pelo ipv4. No entanto, também tenho um servidor que pode ser acessado pelo ipv6. Eu queria saber se eu poderia usar o iptables para encaminhar o tráfego ipv6 em uma determinada porta de um dos servidores para outro servidor usando o tráfego ipv4.

Eli
fonte
2
O que você está procurando é chamado NAT64, o que não acho que o iptables faça (ainda).
Chris S
Chris está certo - os RFCs NAT64 acabaram de ser publicados, eu daria um tempo até que algo realmente o suportasse. Dito isso, você pode conseguir seu objetivo de uma maneira diferente, mas não temos detalhes suficientes para ter certeza. Por exemplo, se for um servidor HTTP, você pode fazer proxy reverso das solicitações entre protocolos.
Shane Madden

Respostas:

16

No momento, as tabelas IP não podem fazer isso; portanto, você precisa de um processo no espaço do usuário para fazer proxy das conexões. O socat é uma ferramenta adequada para isso:

socat TCP6-LISTEN:1234,fork TCP4:1.2.3.4:1234
mgorven
fonte
1
obrigado, isso foi útil! No caso de alguém está à procura de uma solução UDP: socat UDP6-Recvfrom: 64444, garfo UDP4-SENDTO: localhost: 64443 funcionou para mim
Alexander
10

Conforme observado nos comentários da sua pergunta , o NAT64 está longe de estar pronto, mesmo três anos depois.

Você pode, no entanto, tentar 6tunnel, conforme sugerido por perplexidade.

Felizmente, ele está presente nos repositórios Debian e Ubuntu, para que você possa instalá-lo com muita facilidade usando sudo apt-get install 6tunnel. Se você estiver usando outro sistema, precisará construí-lo a partir da fonte .

Construir a partir do código-fonte realmente não é difícil, e é apenas uma questão de executar alguns comandos (como root):

git clone https://github.com/wojtekka/6tunnel && cd 6tunnel && ./autogen.sh && make && make install

Aqui está sua sintaxe, simplificada:

6tunnel [-4|-6] [-l local-host] original-port destination-host destination-port
  • O [-4|-6]é opcional e permite especificar se você deve ligar (escutar) no IPv4 ou IPv6 (respectivamente).
  • -ltambém é opcional. Permite escolher em qual endereço (IPv4 ou IPv6) você deseja vincular.
  • A porta original é a porta na qual você ligará.
  • O host de destino é para onde você encaminhará o tráfego. Pode estar em qualquer lugar: host local ou em outro lugar da sua rede ou da Internet.
  • A porta de destino é a porta no host de destino que receberá seu tráfego encaminhado.

Por exemplo, se você deseja permitir que um servidor somente IPv4, escutando na porta 1337, seja acessado pelo IPv6, use:

6tunnel -6 1337 localhost 1337

O comando acima escutará na porta 1337 no IPv6 e encaminhará o tráfego para a porta 1337 na mesma máquina via IPv4. Ele será executado em segundo plano, para que você não precise se preocupar com isso.

Na verdade, você deve configurar um trabalho cron para garantir que ele ainda esteja em execução. 6tunnelfornece um exemplo para sua conveniência! Executá-lo na inicialização também não deve ser uma má idéia.

Para mais documentação, execute 6tunnel -hou man 6tunnel.

Léo Lam
fonte
A publicação como nova resposta, pois a edição da resposta atual por confusão mudaria demais e poderia ser rejeitada como uma edição sugerida!
Léo Lam
5

As versões recentes xinetdtambém podem escutar no IPv6 e, em seguida, encaminhar a conexão para um endereço IPv4.

Uma configuração de amostra que escuta conexões IPv6 na porta 3389 e as encaminha para a porta 3389 de um endereço IPv4 interno:

service rdp_port_forward
{
    flags           = IPv6
    disable         = no
    type            = UNLISTED
    socket_type     = stream
    protocol        = tcp
    user            = nobody
    wait            = no
    redirect        = 10.187.20.42 3389
    port            = 3389
}

Isso pode ser útil em ambientes mais restritos, pois xinetdprovavelmente será instalado com o sistema básico ou disponível em repositórios de fornecedores aprovados.

Michael Hampton
fonte
3

Eu queria comentar sobre a resposta de Leo Lams e votar, mas não tenho reputação suficiente. Primeiro de tudo: muito obrigado Leo Lam!

Para qualquer pessoa que acompanhe esse segmento: Meu ISP mudou minha conexão de IPv4 para IPv6 com o Dual Stack Lite, o que significa que não tenho mais meu próprio endereço IPv4. Esse foi um problema, pois desejo acessar minha câmera IP de qualquer lugar que não seja compatível com IPv6. Para resolver isso, tentei o seguinte:

  1. Habilitando o IPv6 Forward para a porta 99 do meu roteador na minha máquina Ubuntu.
  2. Máquina Ubuntu (rede doméstica): sudo 6tunnel -6 99 192.168.178.35 80
  3. vServer Debian com endereço IPv4 e IPv6 estático: sudo 6tunnel -4 99 IPV6PREFIXROUTER:IPV6INTERFACEIDUUBUNTUMACHINE 99
  4. vServer Debian: Permite conexões TCP de entrada na porta 99 no iptables

O prefixo ipv6 foi indicado no meu roteador e o ID da interface foi mapeado no processo de encaminhamento do IPv6.

Agora posso acessar a câmera de qualquer lugar usando o domínio vServer example.com:99 .. Perfeito! Estou pensando em obter uma framboesa que cumpra esse trabalho ou um banana pi m3 para outras tarefas também.

Crumar
fonte
1
Agora você sabe o que fazer quando precisar de outra câmera IP. É 2015; comprar um que não suporte IPv6 é um completo desperdício de dinheiro.
Michael Hampton
não é como se a câmera tivesse alguns anos: p
Crumar
2

Mais para o benefício de as pessoas encontrarem esta página do que o OP necessariamente (eu vim aqui procurando uma solução para conectividade IPv6 para um aplicativo IPv4 (Twisted)), uma possibilidade é o aplicativo 6tunnel, escuta no IPv6 e encaminha solicitações para outra interface e porta.

perplexidade
fonte