Manter IP de origem após NAT [fechado]

4

Até hoje eu usei um roteador mal-humorado para poder compartilhar minha conexão com a Internet e manter um servidor da Web on-line também, enquanto uso o NAT. O IP dos usuários ($ _SERVER ['REMOTE_ADDR']) estava bom, eu estava vendo IPs de classe A dos usuários.

Mas como o tráfego cresceu todos os dias, eu tive que instalar um servidor Linux (Debian) para compartilhar minha conexão com a Internet, porque meu antigo roteador não podia mais manter o tráfego. Eu compartilhei a internet via IPTABLES usando NAT, mas agora, depois de encaminhar a porta 80 para o meu servidor, agora em vez de ver IP de usuários reais, vejo meu IP de gateway (IP interno do Linux) como qualquer endereço IP de usuário.

Como resolver esse problema?

Eu editei minha postagem para poder colar as regras que estou usando no momento.

#!/bin/sh
#I made a script to set the rules

#I flush everything here.
iptables --flush
iptables --table nat --flush
iptables --delete-chain
iptables --table nat --delete-chain
iptables -F
iptables -X


# I drop everything as a general rule, but this is disabled under testing
# iptables -P INPUT DROP
# iptables -P OUTPUT DROP


# these are the loopback rules
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

# here I set the SSH port rules, so I can connect to my server
iptables -A INPUT -p tcp --sport 513:65535 --dport 22 -m state --state NEW,ESTABLISHED     -j ACCEPT
iptables -A OUTPUT -p tcp --sport 22 --dport 513:65535 -m state --state ESTABLISHED -j ACCEPT


# These are the forwards for 80 port
iptables -t nat -A PREROUTING -p tcp -s 0/0 -d xx.xx.xx.xx --dport 80 -j DNAT --to     192.168.42.3:80
iptables -t nat -A POSTROUTING -o eth0 -d xx.xx.xx.xx -j SNAT --to-source 192.168.42.3
iptables -A FORWARD -p tcp -s 192.168.42.3 --sport 80 -j ACCEPT

# These are the forwards for bind/dns
iptables -t nat -A PREROUTING -p udp -s 0/0 -d xx.xx.xx.xx --dport 53 -j DNAT --to 192.168.42.3:53
iptables -t nat -A POSTROUTING -o eth0 -d xx.xx.xx.xx -j SNAT --to-source 192.168.42.3
iptables -A FORWARD -p udp -s 192.168.42.3 --sport 53 -j ACCEPT


# And these are the rules so I can share my internet connection
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -A FORWARD -i eth0:1 -j ACCEPT

Se eu excluir a parte do MASQUERADE, vejo meu IP real ao mesmo tempo em que o ecoa com o PHP, mas não tenho internet. Como fazer, ter internet e ver meu IP real enquanto as portas são encaminhadas também?

** xx.xx.xx.xx - é o meu IP público. Eu escondi por motivos de segurança.

    
por John Miller 26.11.2012 / 13:42

2 respostas

2

Resolvi meu próprio mistério, mas graças àqueles que ajudaram até agora. Estudei um pouco mais a página man do iptables, e cheguei a uma solução que parece funcionar como eu queria:

Substitua a linha que contém MASQUERADE (iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE) com a seguinte linha:

iptables -t nat -A POSTROUTING -s 192.168.42.0/24 -o eth0 -j SNAT --to-source XX.XX.XX.XX

Agora, posso ver meu endereço IP real e também ter internet.

* XX.XX.XX.XX = IP público

    
por 26.11.2012 / 17:59
0

Esse comportamento é normal se você tiver usado a regra de mascaramento ( -j MASQUERADE ). Acho que o que você está usando é "tradução do endereço de rede de destino" ( -j DNAT ), por exemplo, algo como:

/sbin/iptables -t nat -A PREROUTING -p tcp -d {$PUBLICADDRESS} --dport 80 -j DNAT --to {$WEBSERVER}:80

O acima pode ou não funcionar dependendo do resto de suas regras, é claro. Você deve atualizar sua pergunta com pelo menos as regras que você tem atualmente pertinentes ao servidor web.

    
por 26.11.2012 / 14:50