O serviço não pode se conectar a si mesmo usando IP público, problema NAT

4

Eu tenho um servidor dedicado do serverloft.eu, mas devido a alguma segurança de rede não consigo usar a rede de bridge no meu servidor. Então eu configurei todos os meus IPs para o eth0 principal e usei o NAT para encaminhar o tráfego da rede principal eth0 para a rede interna. Mas eu tenho um problema, os serviços em meus servidores virtuais não podem se conectar usando o ip público, por exemplo. telnet 192.168.122.3 80 funciona bem, mas telnet pub.lic.ip.xx 80 vezes fora. (Quando digitado na máquina virual com ip 192.168.122.3)

Meu script do iptables é assim:

#!bin/sh

iptables -F

iptables -t nat -F

iptables -P FORWARD ACCEPT
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

PORTS="22 25 110 143 587 993 995"
for port in $PORTS;
do
  iptables -t nat -A PREROUTING -p tcp -d xx.xx.xx.189 --dport $port -j DNAT --to 192.168.122.2:$port
done

PORTS="22 80 443"
for port in $PORTS;
do
  iptables -t nat -A PREROUTING -p tcp -d xx.xx.xx.173 --dport $port -j DNAT --to 192.168.122.3:$port
done

PORTS="22 3306 5432"
for port in $PORTS;
do
  iptables -t nat -A PREROUTING -p tcp -d xx.xx.xx.174 --dport $port -j DNAT --to 192.168.122.4:$port
  iptables -t nat -A PREROUTING -p udp -d xx.xx.xx.174 --dport $port -j DNAT --to 192.168.122.4:$port
done

O que estou perdendo?

    
por Mads Madsen 13.10.2009 / 22:00

3 respostas

1

Depois de muita leitura e teste, encontrei uma solução final, modifiquei meu script iptables para isso:

#!/bin/sh

iptables -t nat -F
iptables -F
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P INPUT ACCEPT

iptables -t nat -A POSTROUTING -o eth0 -s 192.168.122.0/24 ! -d 192.168.122.0/24 -j MASQUERADE
iptables -A FORWARD -s 192.168.122.0/24 -j ACCEPT
iptables -A FORWARD -d 192.168.122.0/24 -j ACCEPT
iptables -A FORWARD -s ! 192.168.122.0/24 -j DROP

PORTS="22 25 110 143 587 993 995"
for port in $PORTS;
do
  iptables -t nat -A PREROUTING -p tcp -d xx.xx.xx.189 --dport $port -j DNAT --to 192.168.122.2:$port
done
iptables -t nat -A POSTROUTING -s 192.168.122.2 -j SNAT --to xx.xx.xx.189

PORTS="22 80 443"
for port in $PORTS;
do
  iptables -t nat -A PREROUTING -p tcp -d xx.xx.xx.173 --dport $port -j DNAT --to 192.168.122.3:$port
done
iptables -t nat -A POSTROUTING -s 192.168.122.3 -j SNAT --to xx.xx.xx.173

PORTS="22 3306 5432"
for port in $PORTS;
do
  iptables -t nat -A PREROUTING -p tcp -d xx.xx.xx.174 --dport $port -j DNAT --to 192.168.122.4:$port
  iptables -t nat -A PREROUTING -p udp -d xx.xx.xx.174 --dport $port -j DNAT --to 192.168.122.4:$port
done
iptables -t nat -A POSTROUTING -s 192.168.122.4 -j SNAT --to xx.xx.xx.174

O que eu fiz é que eu adicionei um -j SNAT de seu ip interno ao seu ip externo.

    
por 14.10.2009 / 11:59
3

Com o NAT mascarado (seja NAT no iptables ou NAT simples em um roteador / firewall consumidor) é impossível alcançar o IP externo da rede interna. Nesse caso, a conversão de endereços terminaria com um pacote com o mesmo endereço de origem e destino e nunca retornaria pelo filtro para que seu endereço fosse convertido de volta para o IP interno original.

Eu sei que não é realmente uma solução viável se você estiver usando rede virtual interna para uma máquina, mas eu geralmente consegui contornar isso usando DNS split-horizon com IPs NATed (internos) para a visão interna e externa IP para a visão externa.

    
por 13.10.2009 / 23:55
0

Uma solução melhor seria escrever uma regra que reescreva o endereço IP público ( x.x.x.x ) para localhost:

iptables -t nat -A OUTPUT -d x.x.x.x/32 -p tcp -m tcp --dport 80 \
         -j DNAT --to-destination 127.0.0.1:80
    
por 18.03.2016 / 01:08