O iptables redireciona solicitações externas para 127.0.0.1

41

Eu tenho um serviço em execução no 127.0.0.1 com porta 2222. Preciso encaminhar todas as solicitações para 192.168.2.2:2222 (IP externo) apenas 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.

SimWhite
fonte
Precisamos de alguns esclarecimentos. De onde vem o tráfego? Para onde o tráfego está indo originalmente? Para onde o tráfego deve estar indo? Enquanto eu o leio, você deseja que o tráfego de 192.168.1.0/24 para 127.0.0.1:2222 seja redirecionado para 12.23.34.45:2222. Mas a resposta de Warren assume que você quer o tráfego de 192.168.1.0/24 para 12.23.34.45:2222 para ser redirecionado para 127.0.0.1:222
Patrick
11
O tráfego vem da sub-rede 192.168.1.0/24 para 192.168.2.2:2222 e deve ser traduzido para o serviço 127.0.0.1:2222. Eu sou o esquema de endereço corrigido.
SimWhite
11
Você deseja uma regra que permita que o tráfego seja 2222portado na interface de loopback a partir da sub-rede 192.168.1.0/24? Esse não é apenas um único tipo de configuração de regra. Veja aqui: debuntu.org/…
slm
Sim. Pelo que entendi, preciso adicionar a regra de masq? O encaminhamento de IP já está ativado, é claro.
SimWhite
Por que não executá-lo em um IP "real" e filtrar o tráfego proveniente de fontes indesejadas? Isso é o que firewalls são para, essencialmente ...
vonbrand

Respostas:

60

A regra do 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 eth0pelo nic 192.168.2.2reside em)

Por padrão, esse valor é 0, que instrui o kernel a não rotear o tráfego externo destinado 127.0.0.0/8. Isso é apenas para 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 2222como a correspondência de destino, o que significa que, se 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 -dcorrespondência para -d 192.168.2.2ou adicionar -i eth0(ou qualquer que seja o seu nic).

Patrick
fonte
8
Esta informação é surpreendentemente difícil de encontrar.
Wren T.
Sim, informações valiosas e difíceis de encontrar! Obrigado! Mas eu não tenho route_localnet. Já houve outros nomes para isso? (em linux 2.6.30) ls /proc/sys/net/ipv4/conf/lan/: accept_redirects arp_accept arp_filter arp_notify disable_policy force_igmp_version log_martians medium_id proxy_arp secure_redirects shared_media accept_source_route arp_announce arp_ignore bootp_relay disable_xfrm forwarding mc_forwarding promote_secondaries rp_filter send_redirects tag
IMZ - Ivan Zakharyaschev
Entendo, o patch pararoute_localnet é mais recente (7 de junho de 2012) que o meu kernel (SMP de segunda-feira 2.6.30-std-def-alt15 # 1 14 de dezembro de 08:45:48 UTC de 2009). Ok, simplesmente alcançarei o encaminhamento de porta desejado (de fora para dentro) com um processo de encaminhamento como netcat( nc) xinetd, ou as opções de encaminhamento de porta de ssh(o último é ineficaz e estúpido, é claro, mas mencionei, porque, bem, essa possibilidade existe).
imz - Ivan Zakharyaschev 31/03
2
Meus 2 centavos: você pode habilitar esse parâmetro para todas as interfaces com #sysctl -w net.ipv4.conf.all.route_localnet=1
Dmitriusan
Como outros, essa informação era difícil de encontrar. Obrigado, se eu tivesse encontrado isso antes, teria me poupado uma tonelada de esforço.
Stephen Simpson
3

Você pode redirecionar para o host local, mas não para o loopback (127.0.0.0/8). O loopback é uma brecha. Você precisa redirecionar para uma de suas interfaces reais. Tente usar REDIRECIONAR.

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

dresende
fonte
Esta é provavelmente a melhor resposta sem o sysctl voodo ...
Lester Cheung /
Ainda não ajuda se a porta 222 está apenas a ser escutado em localhost (a regra não vai mudar endereço de destino)
sanmai
Nesse caso, use-j DNAT --to-destination w.x.y.z:222
dresende 21/12/16
2

E se a resposta correta com route_localnetnão funcionar?

Se o seu kernel não incluir o patchroute_localnet , então ... atualize o kernel!

Ou há outras maneiras de encaminhar o tráfego que chega a uma interface para outra porta em outra interface (em particular, para o host local) executando um processo que escuta na interface externa e encaminha o tráfego.

netcat( nc), xinetde ssh(e talvez mais) são exemplos de programas capazes de fazer isso (embora a escolha sshseja estranha e ineficaz).

Eu escrevi uma configuração xinetdpara isso. Agora, este 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 a service xinetd reload, vamos verificar se está escutando:

# 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!

imz - Ivan Zakharyaschev
fonte