Como posso forçar todo o tráfego da Internet através de uma VPN PPTP, mas ainda permitir acesso à LAN local?

4

Eu tenho um servidor rodando o Linux Mint 12 que eu quero manter conectado a uma VPN PPTP o tempo todo. O servidor VPN é bastante confiável, mas cai de vez em quando, então eu só quero fazer com que toda a atividade da internet seja desabilitada se a conexão VPN estiver quebrada.

Eu também gostaria de descobrir uma maneira de reiniciá-lo automaticamente, mas isso não é um problema tão grande, já que isso acontece muito raramente.

Eu também quero sempre poder conectar-me à caixa da minha lan, independentemente de a VPN estar ativa ou não.

Veja como o ifconfig se parece com a VPN conectada corretamente:

eth0      Link encap:Ethernet  HWaddr 00:22:15:21:59:9a  
          inet addr:192.168.0.171  Bcast:192.168.0.255  Mask:255.255.255.0
          inet6 addr: fe80::222:15ff:fe21:599a/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:37389 errors:0 dropped:0 overruns:0 frame:0
          TX packets:29028 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:37781384 (37.7 MB)  TX bytes:19281394 (19.2 MB)
          Interrupt:41 Base address:0x8000 

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:1446 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1446 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:472178 (472.1 KB)  TX bytes:472178 (472.1 KB)

tun0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  
          inet addr:10.10.11.10  P-t-P:10.10.11.9  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:14 errors:0 dropped:0 overruns:0 frame:0
          TX packets:23 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100 
          RX bytes:1368 (1.3 KB)  TX bytes:1812 (1.8 KB)

Aqui está um script iptables que encontrei em outro lugar que parecia ser o problema que estou tentando resolver, mas acabou bloqueando todo o acesso, mas não tenho certeza do que preciso alterar:

#!/bin/bash

#Set variables
IPT=/sbin/iptables
VPN='ifconfig|perl -nE'/dr:(\S+)/&&say$1'|grep 10.'
LAN=192.168.0.0/24

#Flush rules
$IPT -F
$IPT -X

#Default policies and define chains
$IPT -P OUTPUT DROP
$IPT -P INPUT DROP
$IPT -P FORWARD DROP

#Allow input from LAN and tun0 ONLY
$IPT -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
$IPT -A INPUT -i lo -j ACCEPT
$IPT -A INPUT -i tun0 -m conntrack --ctstate NEW -j ACCEPT
$IPT -A INPUT -s $LAN -m conntrack --ctstate NEW -j ACCEPT
$IPT -A INPUT -j DROP

#Allow output from lo and tun0 ONLY
$IPT -A OUTPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
$IPT -A OUTPUT -o lo -j ACCEPT
$IPT -A OUTPUT -o tun0 -m conntrack --ctstate NEW -j ACCEPT
$IPT -A OUTPUT -d $VPN -m conntrack --ctstate NEW -j ACCEPT
$IPT -A OUTPUT -j DROP
exit 0

Obrigado pela sua ajuda.

    
por user126715 01.07.2012 / 21:20

4 respostas

3

Essas regras de iptables não permitem tráfego para o servidor VPN, portanto, a VPN não pode ser estabelecida. Você precisa das seguintes regras na cadeia OUTPUT antes da regra final DROP , em que 1.2.3.4 é o endereço IP do servidor VPN. Eles permitem conexões TCP à porta 1723 (o canal de controle PPTP) e aos pacotes GRE (o canal de dados).

iptables --append OUTPUT --destination 1.2.3.4 --protocol tcp --dport 1723 --jump ACCEPT
iptables --append OUTPUT --destination 1.2.3.4 --protocol gre --jump ACCEPT
    
por 01.07.2012 / 22:17
2

Existem duas abordagens para isso, baseadas em roteamento e baseadas em firewall.

Abordagem de roteamento

A tabela de roteamento típica de uma máquina não conectada a uma VPN é semelhante a esta:

10.23.11.0/24 dev eth0
default via 10.23.11.1

A primeira rota é para hosts na LAN, e a segunda rota envia tudo para o gateway padrão. Quando conectado a uma VPN, a tabela de roteamento se parece com algo assim (onde 1.2.3.4 é o IP público do servidor VPN e 10.8.0.1 é o IP privado do servidor VPN):

10.23.11.0/24 dev eth0
1.2.3.4 via 10.23.11.1
default via 10.8.0.1

A primeira rota é a mesma e a terceira rota é o que envia tudo pela VPN. Observe a segunda regra, no entanto: ele diz que para alcançar os pacotes IP públicos do servidor VPN deve ser enviado através do gateway padrão. Isso é para que os pacotes sintonizados criados pelo cliente VPN realmente alcancem o servidor; se essa rota não estiver no lugar, os pacotes criados pelo cliente VPN serão enviados pela VPN novamente e nunca chegarão ao servidor.

Agora, se a terceira rota for removida, os pacotes destinados a qualquer lugar na Internet, exceto o servidor VPN, não terão uma rota correspondente e, portanto, o host nunca os enviará para fora. Portanto, queremos que a tabela de roteamento tenha essa aparência quando a VPN não estiver conectada:

10.23.11.0/24 dev eth0
1.2.3.4 via 10.23.11.1

Os hosts na LAN ainda podem ser acessados e o servidor VPN ainda pode ser acessado (já que precisamos iniciar a VPN), mas o restante não será encaminhado. Obter essa configuração pode ser um pouco complicado, especialmente se você estiver usando DHCP. Uma configuração estática no Debian envolveria o seguinte em /etc/network/interfaces :

auto eth0
iface eth0 inet static
    address 10.23.11.10
    netmask 255.255.255.0
    up ip route add 1.2.3.4 via 10.23.11.1

Observe que não há instrução gateway , pois é isso que instala a rota padrão.

A desvantagem dessa abordagem é que o tráfego não VPN para o servidor VPN ainda é permitido sem criptografia. Se você executar outros serviços no servidor VPN e precisar garantir que eles estejam protegidos, será necessário usar a abordagem de firewall.

Editar : @JamesRyan sugere que essa abordagem é frágil porque uma rota padrão pode ser adicionada automaticamente ou acidentalmente. Outra abordagem é adicionar uma rota blackhole, que envia o tráfego para algum lugar que não o encaminha mais. Isso não funcionará com uma rota padrão automaticamente adicionada, pois ela já usa a métrica de prioridade mais alta 0. A rota padrão ainda precisa ser removida, mas algo como o seguinte pode ser adicionado.

default via 127.255.255.255

Abordagem de firewall

A ideia aqui é bloquear todo o tráfego de saída na interface física, além do tráfego de tunnells criado pelo cliente VPN e do tráfego destinado à LAN. O tráfego para permitir a VPN depende do protocolo que está sendo usado. O PPTP usa a porta TCP 1723 como um canal de controle e GRE como o túnel real. O OpenVPN usa a porta UDP 1194. As regras do firewall se parecem com isso:

iptables --append OUTPUT --out-interface eth0 --destination 10.23.11.0/24 --jump ACCEPT
iptables --append OUTPUT --out-interface eth0 --destination 1.2.3.4 --protocol tcp --dport 1723 --jump ACCEPT
iptables --append OUTPUT --out-interface eth0 --destination 1.2.3.4 --protocol gre --jump ACCEPT
iptables --append OUTPUT --out-interface eth0 --jump REJECT

A primeira regra aceita tráfego para a LAN. A segunda e terceira regras aceitam tráfego de VPN para o servidor VPN. A quarta regra rejeita todo o outro tráfego que sai da interface física.

A outra coisa que você pode precisar aceitar é o DNS se você usar um servidor DNS que não esteja na LAN, porque o cliente VPN provavelmente precisará fazer uma pesquisa de DNS para encontrar o servidor VPN. A regra a seguir inserida antes do REJECT permitiria o tráfego DNS para o serviço de DNS público do Google.

iptables --append OUTPUT --out-interface eth0 --destination 8.8.8.8 --protocol udp --dport 53 --jump ACCEPT
    
por 02.07.2012 / 02:03
1

Adicione outra rota padrão com uma métrica mais alta apontando para uma interface nula. Quando a VPN não está disponível, a segunda rota irá entrar e fechar o tráfego

    
por 02.07.2012 / 00:41
0

Este não é um queston do iptables - você não precisa do iptables para isso.

Basta definir a rota padrão para passar pela VPN e pronto. Você também pode adicionar outra rota padrão com uma métrica pior para usar quando a VPN estiver inativa.

Sua LAN está conectada diretamente, por isso tem prioridade sobre o gateway padrão.

    
por 01.07.2012 / 21:24