iptables redirecionam solicitações externas para 127.0.0.1

33

Eu tenho um serviço rodando em 127.0.0.1 com a porta 2222. Eu preciso encaminhar todas as solicitações para 192.168.2.2:2222 (fora do IP) somente da sub-rede 192.168.1.0/24 para 127.0. 0,1: 2222.

Estou tentando usar isso, mas não está funcionando.

$ iptables -t nat -I PREROUTING -p tcp -d 192.168.1.0/24 --dport 2222 -j DNAT --to-destination 127.0.0.1:2222

Como posso fazer isso funcionar?

UPD: Editar esquema de endereço.

    
por SimWhite 29.01.2014 / 08:03

3 respostas

46

A regra iptables que você está usando funcionará, mas há uma alteração adicional que você precisa fazer:

sysctl -w net.ipv4.conf.eth0.route_localnet=1

(substituindo eth0 pelo nic 192.168.2.2 reside)

Por padrão, esse valor é 0 , que instrui o kernel a não direcionar o tráfego externo destinado a 127.0.0.0/8 . Isso é apenas por segurança, pois esse tráfego não é normal.

Nota adicional: sua regra atual do iptables é muito ampla. Sua regra especifica -d 192.168.1.0/24 --dport 2222 como a correspondência de destino, o que significa que, se a sua máquina tentar conversar com outro host na porta 2222 (ou seja, tráfego de saída), ela também será redirecionada. Você precisa alterar a correspondência -d para -d 192.168.2.2 ou adicionar -i eth0 (ou qualquer que seja seu nic).

    
por 03.02.2014 / 03:30
2

Você pode redirecionar para o host local, mas não para fazer loopback (127.0.0.0/8). Loopback é uma lacuna. Você tem que redirecionar para uma das suas interfaces reais. Tente usar o REDIRECT.

iptables -t nat -A PREROUTING ..... -j REDIRECT --to-port 222

    
por 03.02.2014 / 00:04
2

E se a resposta correta com route_localnet não funcionar?

Se o seu kernel não incluir o patch para route_localnet , então ... atualize o kernel!

Ou existem outras maneiras de encaminhar o tráfego que chega a uma interface para outra porta em outra interface (em particular, para localhost) executando um processo que escutaria na interface externa e encaminharia o tráfego.

netcat ( nc ), xinetd e ssh (e talvez mais) são exemplos de programas capazes de fazer isso (embora escolher ssh seja estranho e ineficaz).

Eu escrevi uma configuração para xinetd para isso. Agora, esse serviço é ativado automaticamente:

# cat /etc/xinetd.d/z-from-outside 
# default: off
# description: Forward connections to the z port.
service z-from-outside
{
    disable         = no
    socket_type     = stream
    type        = UNLISTED
    wait            = no
    user            = nobody
    bind        = vaio.ob
    port        = 7070
    redirect    = localhost 7070
}
# 

( vaio.ob é o nome desse host na interface de rede externa.)

Após um service xinetd reload , vamos verificar se está ouvindo:

# lsof -i -P | fgrep 7070
xinetd    556      root    6u  IPv4 1797906      0t0  TCP vaio.ob:7070 (LISTEN)
sshd    27438 tun_zzoom    4u  IPv4 1059100      0t0  TCP localhost.localdomain:7070 (LISTEN)
# 

E, de fato, as conexões passam!

    
por 01.04.2015 / 01:12