como rotear IP externo para interno sem MASQUERADE

1

Ok, ainda estou trabalhando na criação de um servidor http dmz'd

Então, agora eu tenho um túnel ethernet usando ssh -w 0: 0 e tenho interfaces em cada extremidade que podem se comunicar:

pergunta anterior

Então, agora estou lutando para que esse servidor http fique visível para a rede externa. Aqui está a configuração completa

Então eu crio uma nova instância ec2 e executo a configuração:

source ./HOST

scp -i green.pem server/* root@$HOST:
ssh -i green.pem root@$HOST ./setup

por sua vez, executa a configuração na máquina remota:

apt-get update
apt-get install telnet

echo 1 | tee /proc/sys/net/ipv4/ip_forward
echo "PermitTunnel yes" >> /etc/ssh/sshd_config
/etc/init.d/ssh restart

inicio a conexão ssh:

sudo ./runserver $ HOST:

HOST=$1
ssh -i green.pem root@$HOST -w 0:0 -o Tunnel=ethernet -o ServerAliveInterval=60

então dentro desse termo ssh eu começo a rotear o redirecionamento do iptables:

#####
# server routing
# bring up the tap
ifconfig tap0 up
# route all traffic for 192.168.2.* through it
ip route add 192.168.2.0/24 dev tap0

#####
# server iptables
REMOTE_INTERNAL_IP=$1

iptables -F
iptables -t nat -F

### end init firewall .. Start DMZ stuff ####
# forward traffic between DMZ and LAN
iptables -A FORWARD -i eth0 -o tap0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i tap0 -o eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT

# Route incoming port to DMZ server 192.168.2.1
iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 8000 -j DNAT --to-destination 192.168.2.1:8000
iptables -t nat -A POSTROUTING -p tcp -o eth0 -j SNAT --to $REMOTE_INTERNAL_IP
### End DMZ .. Add other rules ###

finalmente no cliente adiciono as rotas e o encaminhamento de porta


##########
# client
HOST=$1

# bring up the tap
ifconfig tap0 up
# put an ip on it so we can listen
ifconfig tap0 192.168.2.1
# add an explicit route for our ssh
ip route add $HOST via 192.168.1.1 dev eth0

# make the tap the default routing
ip route replace default dev tap0
# remove the default link
#ip route del 192.168.2.0/24 dev tap0  proto kernel scope link src 192.168.2.1

e eu inicio o servidor web

python -m SimpleHTTPServer

quando eu faço um telnet 192.168.2.1 de qualquer servidor ele passa bem. mas se eu fizer um telnet para $ THE_REAL_IP, não funciona.

se eu colocar uma regra de iptables MASQUERADE, então funciona bem, mas estou fazendo isso para evitar o MASQUERADE. Eu quero que o IP de origem fique no pacote.

Alguma idéia do que estou fazendo errado?

-----

mais informações

-----

Ok, agora eu tentei muito mais conjuntos de tentativas. E ainda nada funciona.

O que eu pensei que poderia funcionar seria adicionar isso ao cliente:

# these should route packets back to tap0
ip rule add from 192.168.2.0/24 table 42
ip route add default dev tap0 table 42

Porque isso deve colocar uma regra forçada para tudo o que está escrito para 192.168.2.1 deve voltar através dessa interface tap0. Mas isso não funciona, infelizmente.

Também tentei associar um ip com o tap0 no lado remoto.

ifconfig tap0 192.168.2.5

E isso parece interessante porque agora eu não preciso configurar o roteamento, o sistema parece fazer quase automaticamente:

#####
# server routing
# bring up the tap
ifconfig tap0 192.168.2.5
ifconfig tap0 up
# route all traffic for 192.168.2.* through it
ip route add 192.168.2.0/24 dev tap0


#####
# server iptables

iptables -F
iptables -t nat -F

# forward traffic between DMZ and LAN
iptables -A FORWARD -i eth0 -o tap0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i tap0 -o eth0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

# Route incoming port to DMZ server 192.168.2.1
iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 8000 -j DNAT --to-destination 192.168.2.1:8000
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

### End Server ####

#############################
#############################

##########
# client
echo 1 | tee /proc/sys/net/ipv4/ip_forward

# bring up the tap
ifconfig tap0 up
# put an ip on it so we can listen
ifconfig tap0 192.168.2.1

# these should route packets back to tap0
# but they actually don't make any difference
#ip rule add from 192.168.2.0/24 table 42
#ip route add default dev tap0 table 42

    
por iamacomputer 23.03.2013 / 21:27

2 respostas

1

Sei que você afirmou que deseja manter o endereço IP original no seu servidor Python, mas pode estar adotando a abordagem errada aqui. É prática padrão passar pelo endereço IP original via HTTP no cabeçalho X-Forwarded-For. A maioria das estruturas da Web selecionará esse cabeçalho e o usará no lugar do endereço IP original, se for especificado.

Se você quiser seguir esse caminho, tudo o que você precisa é de um servidor Web front-end. É uma boa ideia ter um front-end, de qualquer forma: é mais seguro porque ninguém tem acesso direto ao seu servidor de aplicativos e você pode implementar facilmente serviços como HTTPS e cache sem exigir mais ciclos de CPU no servidor de aplicativos. Algo como Nginx faria o truque lindamente.

    
por 24.03.2013 / 01:43
0

Se você usar DNAT em vez de MASQUERADE , deverá manter o endereço IP de origem como está nos pacotes de entrada.

É claro que com o DNAT, como o endereço de origem não é alterado, você precisa ter cuidado para garantir que a outra extremidade saiba enviar pacotes de resposta de volta da mesma maneira - no seu caso, volte pelo túnel em vez de pela interface pública qual será o gateway padrão.

    
por 23.03.2013 / 22:06