Como usar um IP local definido em vez de um externo

2

Eu tenho um servidor Gentoo Linux. O servidor está conectado a duas redes: interna e externa.

Internal network ip: 192.168.1.200
External network ip: 192.168.0.2

Se eu estou tentando fazer uma requisição do servidor para si mesmo, ele usa o IP da rede externa. Conectando-se ao nginx usando o Wget me fornece este registro de log:

server ~ # tail -n 1 /var/log/nginx/error_log
192.168.0.2 - - [27/Aug/2014:19:04:42 +0300] "GET / HTTP/1.1" 200 5 "-" "Wget/1.14 (linux-gnu)"

Apesar de eu me conectar diretamente a 192.168.1.200:

server ~ # wget http://192.168.1.200/

Tabela de roteamento (a métrica é mais alta na rede externa, mas parece ignorada): ip route show

server ~ # ip route
192.168.0.0/30 dev wan  scope link  metric 20 
192.168.1.0/24 dev lan  scope link  metric 10 

ip route get :

server ~ # ip route get 192.168.1.200
local 192.168.1.200 dev lo  src 192.168.1.200 
    cache <local> 

Como posso fazer com que esta máquina se conecte usando 192.168.1.200 a si mesma, em vez de 192.168.0.2?

    
por GeekMagus 27.08.2014 / 18:15

2 respostas

2

Como foi mencionado por @Patrick em um dos comentários da minha pergunta, eu estava encontrando um problema com minhas regras iptables NAT.

  • eth0 : rede interna, 192.168.1.200
  • eth1 : rede externa, 192.168.0.2

Minha regra de NAT foi:

$ iptables -t nat -A POSTROUTING ! -o eth0 -j MASQUERADE

Isso significa que todo o tráfego cujo dispositivo de destino de saída não é a interface eth0 será mascarado. O mesmo acontece com o tráfego local, já que ele sai da interface lo .

Depois de corrigir a regra iptables NAT para:

$ iptables -t nat -A POSTROUTING ! -d 192.168.1.0/24 -j MASQUERADE

Meu problema foi resolvido!

    
por 27.08.2014 / 20:19
5

Se você tiver esse problema com cada programa que executa, verifique a regra de firewall do seu servidor. Certifique-se de usar somente NAT para o destino externo. Sua tabela de rotas não faz sentido se você tiver uma regra NAT ampla.

Depois de corrigir a regra de firewall, para wget , você pode usar a opção --bind-address para escolher qual interface deseja usar:

wget --bind-address=192.168.1.200 http://192.168.1.200/

Em documentação do wget :

‘--bind-address=ADDRESS’

When making client TCP/IP connections, bind to ADDRESS on the local machine. ADDRESS may be specified as a hostname or IP address. This option can be useful if your machine is bound to multiple IPs.

Você pode usar um arquivo .wgetrc para torná-lo permanente.

    
por 27.08.2014 / 18:20