O redirecionamento de porta iptables não está funcionando para o host local

54

Quero redirecionar todo o tráfego da porta 443 para a porta 8080 interna. Estou usando esta configuração para o iptables:

iptables -t nat -I PREROUTING --source 0/0 --destination 0/0 -p tcp \
         --dport 443 -j REDIRECT --to-ports 8080

Isso funciona para todos os clientes externos. Mas se estou tentando acessar a porta 443 do mesmo maschine, receberei um erro de conexão recusada.

wget https://localhost

Como posso estender a regra iptables para redirecionar também o tráfego local?

Chris
fonte
Este tópico fornece uma resposta mais geral: serverfault.com/questions/380447/iptables-preroute-localhost
Jeroen
11
Alguém com representante pode adicionar uma barra invertida ao comando antes da quebra de linha?
Ciro Santilli escreveu:

Respostas:

68

PREROUTING não é usado pela interface de loopback, você também precisa adicionar uma regra OUTPUT:

iptables -t nat -I PREROUTING -p tcp --dport 443 -j REDIRECT --to-ports 8080
iptables -t nat -I OUTPUT -p tcp -o lo --dport 443 -j REDIRECT --to-ports 8080
Andy
fonte
3
Não há necessidade da primeira regra. Os pacotes gerados localmente não passam pela cadeia PREROUTING.
Khaled
9
Eu adicionei a regra inicial pelo bem da compulsão, pois ele também deseja que o tráfego externo seja redirecionado. A regra não necessita de origem / destino se eles só dizem para aceitar todos os IPs
Andy
oh desculpas, não vi sua resposta quando respondi.
Andy
Olá Andy, ainda estou obtendo Conexão ao server.com | <ip> |: 443 ... falhou: Conexão recusada.
21710 Chris
Oi, Chris, esse é o Connecting to localhost | 127.0.0.1 | 443 ou esse é o domínio? Se o último e você estiver executando no seu servidor, você pode ter um problema de roteamento interno. Você pode verificar novamente tentando wget server.com:8080 (embora eu assuma que o motivo pelo qual o encaminhamento de porta é porque ele está bloqueado externamente?). Meu próprio VPC tem esse problema, no entanto, você pode colocar uma solução alternativa ao definir o domínio como 127.0.0.1 no seu arquivo / etc / hosts.
21410 Andy As
10

Para redirecionar pacotes do host local para outra máquina, a regra:

 iptables -t nat -A OUTPUT -o lo -d 127.0.0.1 -p tcp --dport 443 -j DNAT  --to-destination 10.x.y.z:port

funcionará, MAS você também precisará habilitar esta opção no kernel:

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

Sem essa configuração do kernel, ele não funcionará.


fonte
Isso funcionaria também. Eu acho que fazer tudo isso no iptables é mais limpo.
quadruplebucky
Na verdade, a configuração do kernel é necessária se o destino estiver em outra máquina, alinhar uma VM ou máquina remota.
é não se você tem as duas regras como Andy sugerido acima.
quadruplebucky
Desculpe, eu estava falando sobre o caso de encaminhar para uma máquina diferente onde o DNAT não funciona. Eu estava procurando nesta resposta uma solução para um problema quando estava tentando encaminhar algo que pensava estar se conectando ao host local a um contêiner na mesma máquina. por exemplo, executando o servidor de nomes em um contêiner para consultas locais.
Na verdade, é 'dependente da versão do kernel> = 3.6, aparentemente.
quadruplebucky
3

Que tal agora?

iptables -t nat -A OUTPUT -d 127.0.0.1 -p tcp --dport 443 -j REDIRECT --para a porta 8080

Athanasios
fonte
2

Você disse que está recebendo erro de conexão recusada . Isso significa que não há processo local atendendo na porta à qual você está tentando se conectar! Para verificar os processos de escuta, use o comando:

$ sudo netstat -lnp | grep 8080

Depois de aplicar a regra, você deverá ter um processo atendendo na porta 8080 para se conectar.

Parece que você deveria ter a seguinte regra:

$ iptables -t nat -I OUTPUT --source 0/0 --destination 0/0 -p tcp
                                       --dport 443 -j REDIRECT --to-ports 8080

Lembre-se de que você está enviando do host local. Então, você precisa redirecionar o pacote de saída.

Khaled
fonte
11
Obrigado pela sua resposta. O processo está escutando na porta 8080. Portanto, desejo redirecionar todo o tráfego para essa porta.
11123 Chris
Você tem certeza de que o processo também está ouvindo a interface do loop? Pode estar apenas ouvindo na sua interface física. Normalmente, seu servidor da
Web