roteamento de tráfego com DNS

2

Eu tenho 2 máquinas de gateway. 1 debian (main - 192.168.1.1), 1 centos (backup 192.168.1.2). Existem 2 redes, 1 LAN e 1 WAN, passando por "main" e a partir daí pelo ISP1 "backup" está na LAN e vai para o ISP2 via PPP (basicamente através do 3G stick)

O problema é que, quando o ISP1 está "morto" ou perdendo pacotes devido ao mau tempo ou qualquer outra coisa, eu quero ser capaz de configurar certas estações da LAN para ter seu tráfego INTERNET sobre ISP2, deixando o resto no ISP1. Então, vamos supor que eu quero que 192.168.1.3 normalmente tenha internet sobre GW1 / ISP1 e, em algum momento, eu queira alternar manualmente para GW2 / ISP2. Eu preciso fazer isso sem "tocar" as configurações de rede das estações, tanto quanto possível, porque ele irá eliminar as conexões de rede locais, o que não deve acontecer.

192.168.1.3 (WinXP) tem gateway padrão 192.168.1.1 e servidor DNS configurado por meio de DHCP para os 2 servidores DNS do ISP1

Eu tentei várias soluções com o DNAT (que parecia substituir qualquer IP externo com 192.168.1.2 e, portanto, a comunicação parou por aí) e o ip route (que atrapalhou as comunicações da rede local)

Acho que não estou vendo algo óbvio na solução DNAT do iptables, mas não consigo colocar meu dedo nela. para referência, a linha parece mentirosa:

iptables -t nat -A PREROUTING -s 192.168.1.3 ! -d 192.168.1.0/8 -j DNAT --to 192.168.1.2

a rota do ip foi feita assim:

ip route add 192.168.1.3 via 192.168.1.2

Ambos feitos no GW1 (192.168.1.1)

O ip forward está habilitado no GW2 (obviamente tudo funciona bem em termos de roteamento e NAT no GW1 - por si só)

As regras do iptables no GW2 se parecem com isso (do iptables-save) porque eu não tenho certeza se está tudo bem.

*nat
:PREROUTING ACCEPT [21038:1379326]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [302:19015]
-A POSTROUTING -o ppp0 -j MASQUERADE
COMMIT
*filter
:INPUT ACCEPT [61306:4073979]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [27660:3745654]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A FORWARD -s 192.168.1.3/32 -j ACCEPT
-A FORWARD -d 192.168.1.3/32 -j ACCEPT
COMMIT

Obrigado.

    
por ciuly 29.07.2015 / 14:53

2 respostas

0

Parece que esqueci de responder. Então é assim que eu finalmente resolvi isso:

  • eu configuro a LAN1 para também hospedar um servidor DNS de encaminhamento
  • Alterei minhas configurações de DHCP e alterei o servidor DNS do ISP para o local uma vez (LAN1)
  • Eu escrevi um script no roteador 3g que obtém informações de rede, se configura como gateway local, altera o gateway LAN para apontar para si mesmo e que basicamente se parece com isso (deve ser executado logo após a conexão 3g via vwdial ser feita ( Eu tenho um script diferente para isso, pois eu gosto de manter isso em dia para ver a conexão bem-sucedida e quaisquer problemas de rede)):
#!/bin/sh

# get info
LOCAL_IP='tail -n 20 /var/log/messages | grep pppd | grep local | sed "s/.*IP address \(.*\)//"'
REMOTE_IP='tail -n 20 /var/log/messages | grep pppd | grep ": remote" | sed "s/.*IP address \(.*\)//"'
DNS1='tail -n 20 /var/log/messages | grep pppd | grep ": primary" | sed "s/.*DNS address \(.*\)//"'
DNS2='tail -n 20 /var/log/messages | grep pppd | grep ": secondary" | sed "s/.*DNS address \(.*\)//"'
echo got info LOCAL_IP=$LOCAL_IP REMOTE_IP=$REMOTE_IP DNS1=$DNS1 DNS2=$DNS2

# setup self as gateway
echo nameserver $DNS1>/etc/resolv.conf
echo nameserver $DNS2>>/etc/resolv.conf
route del default gw 192.168.1.1 eth0
route add default gw $REMOTE_IP ppp0
echo done setting up self with new params

# setup old gateway to forward to self
echo changing dplug routes
ssh [email protected] 'route del default gw X.Y.Z.W eth0'
ssh [email protected] 'route add default gw 192.168.1.7 eth1'
echo removing dplug LAN SNAT
ssh [email protected] 'iptables -t nat -D POSTROUTING -o eth0 -j SNAT --to-source A.B.C.D'
echo deleting WIFI SNAT
ssh [email protected] 'eval "$(cat firewall/iptables | grep "\-A POSTR" | grep -v "\#" | sed "s/-A/iptables -t nat -D/")"'
echo adding new WIFI SNAT
ssh [email protected] 'eval "$(cat firewall/iptables | grep "\-A POSTR" | grep -v "\#" | grep 192.168.2 | sed "s/\(-A .*\) -o .*/iptables -t nat  -o eth1 -j SNAT --to-source 192.168.1.1/")"'
echo setting up dnsmasq DHCP for new values
ssh [email protected] 'echo "# this dnsmasq config file is generated by 3g router. do not edit.">/etc/dnsmasq.3g.conf'
ssh [email protected] "echo server=$DNS1>>/etc/dnsmasq.3g.conf"
ssh [email protected] "echo server=$DNS2>>/etc/dnsmasq.3g.conf"
ssh [email protected] "echo dhcp-option=net:wlan,6,$DNS1,$DNS2>>/etc/dnsmasq.3g.conf"
ssh [email protected] "echo dhcp-option=net:lan,6,$DNS1,$DNS2>>/etc/dnsmasq.3g.conf"
echo restarting dnsmasq
ssh [email protected] '/etc/init.d/dnsmasq restart'
echo all done

/etc/dnsmasq.3g.conf está incluído no dnsmasq.conf e está originalmente vazio. Existe um script para desfazer o acima de uma maneira minimalista, pois eu apenas mato a VM do roteador 3g (desconectando os resultados do usb do 3G em pânico no kernel ...), então eu realmente não me importo com isso.

O script garante que apenas os IPs WAN configurados para acesso à Internet continuem a ter acesso à Internet e nenhum outro. Os IPs da LAN para acesso à Internet são adicionados manualmente ao iptables do roteador 3g. (aqueles não mudam)

    
por 17.12.2015 / 22:51
1

Seu roteador Debian (principal - 192.168.1.1) não deve estar tentando o tráfego NAT para redirecioná-lo ao roteador de backup. Na melhor das hipóteses, isso resultará em NAT duplo (já que o roteador de backup irá NAT novamente na saída de ppp0 conforme sua regra MASQUERADE ) e na pior das hipóteses você irá reescrever os endereços IP de uma maneira que impossibilite para o tráfego de retorno para voltar.

A opção mais simples é usar o VRRP. Configure um endereço de gateway virtual compartilhado entre os dois roteadores. Defina as prioridades para que o roteador principal assuma a função de mestre por padrão, mas diminua quando sua própria conexão com a Internet não estiver disponível. No Linux, use vrrpd para implementar o VRRP. Em seguida, defina o gateway padrão das estações de trabalho que você deseja alternar para o endereço de gateway virtual, enquanto leavign o restante apontou para o endereço IP real do roteador principal.

Se você quiser fazer isso realmente manualmente, você nem precisa de VRRP. Basta gerenciar manualmente o endereço do gateway virtual removendo-o do roteador principal ( ip addr del x.y.z.w/qq dev eth? ) e adicionando-o ao outro ( ip addr add x.y.z.w/qq dev eth? ). Note, entretanto, que o VRRP verdadeiro gerencia endereços MAC além dos endereços IP, então você pode ter alguns problemas de ARP se você for na rota manual (sem trocadilhos).

Outra abordagem é instalar uma rota padrão estática no roteador Debian que aponte para o roteador de backup. Você pode usar o roteamento de políticas (com ip rule ) para aplicar essa rota apenas a pacotes com determinados endereços IP de origem. Essa rota deve ter uma métrica mais alta que a rota padrão que sai da WAN. Assim, quando a rota padrão fora da WAN está presente, ela é usada exclusivamente, e o tráfego segue a rota padrão de fallback. Esse tipo de rota padrão pode ou não resultar no redirecionamento de ICMP para as estações de trabalho. Talvez você queira desabilitá-los para que as estações de trabalho retornem prontamente à rota principal quando ela voltar, supondo que o roteador principal possa manipular o in & de volta tráfego que ele redireciona para o outro roteador. ( /proc/sys/net/ipv4/conf/<intf>/send_redirects )

    
por 29.07.2015 / 16:13