Como faço para que hosts internos usem uma conexão VPN configurada em um roteador do FreeBSD?

3

Pergunta em poucas palavras: Como faço para obter tráfego de um host em uma rede interna, usando o NAT por trás de um roteador, para usar uma conexão VPN configurada no roteador?

Eu tenho um roteador do FreeBSD 9 com 4 interfaces de rede. Um externo conectado ao meu provedor e os outros conectados a sub-redes internas. As interfaces internas usam NAT (por pf) para se conectar ao mundo externo.

Agora, gostaria que todo o tráfego de um host em uma das sub-redes usasse uma conexão VPN PPTP configurada na máquina FreeBSD. O resultado final seria que um host na rede interna usa uma VPN sem ter que usar um cliente VPN no próprio host.

Consegui configurar o cliente VPN com o mpd5. Conectando a partir do roteador para o servidor VPN com mpd5, recebo uma nova interface de rede - ng0 - com um endereço IP.

O meu problema é que não sei para onde ir a partir daqui. Há apenas uma interface (ng0) com um endereço IP. Como faço para que o tráfego da rede interna, NATed, use a conexão VPN?

Se você está tentando responder ou me apontar na direção certa, pode começar com a suposição de que eu não sei ou entendo nada sobre VPNs, roteamento, NAT ou pf - o que eu claramente não sei. (Adicionando uma rota de onde para onde? Adicionando regras pf fazendo o que a entrada e saída de pacotes? Etc.)

Configuração

Isso ocorre logo após a conexão ao servidor VPN do roteador.

Meu/etc/pf.conf:

ext_if="em0"
local_if = "em1"
wifi_if = "em2"
misc_if = "em3"
localnet = "{" $local_if:network $wifi_if:network $misc_if:network "}"
nat on $ext_if from $localnet to any -> ($ext_if)
pass in all
pass out all keep state

Tabela de roteamento:

Destination        Gateway            Flags    Refs      Use  Netif Expire
default            188.60.52.1        UGS         0   998893    em0
10.0.1.0/24        link#10            U           0   159240    em1
10.0.1.1           link#10            UHS         0      358    lo0
10.0.2.0/24        link#11            U           0   503719    em2
10.0.2.1           link#11            UHS         0        0    lo0
10.0.3.0/24        link#12            U           0  3773731    em3
10.0.3.1           link#12            UHS         0        0    lo0
98.158.118.1       link#15            UH          0        0    ng0
98.158.118.63      link#15            UHS         0        0    lo0
127.0.0.1          link#13            UH          0        0    lo0
188.60.52.0/22     link#9             U           0        0    em0
188.60.55.17       link#9             UHS         0        0    lo0

Para se conectar ao servidor VPN, eu tenho isso em /usr/local/etc/mpd/mpd.conf:

strongvpn:
    create bundle static B1
    set bundle yes compression
    set ipcp ranges 0.0.0.0/0 0.0.0.0/0
    set ccp yes mppc
    set mppc yes e128
    set mppc yes stateless

    # Not using these yet, as I don't know what to put in them ...
    #set iface up-script /usr/local/etc/mpd5/ip-up.sh
    #set iface down-script /usr/local/etc/mpd5/ip-down.sh

    create link static L1 pptp
    set link action bundle B1
    set auth authname XXXXXXXXX
    set auth password XXXXXXXXX
    set link max-redial 0
    set link mtu 1460
    set link keep-alive 20 75
    set pptp peer 98.158.112.17
    set pptp disable windowing
    open
    
por Erik Tjernlund 09.02.2012 / 02:29

3 respostas

1

A questão principal aqui é: "Você já tentou a VPN?" Tudo parece bem. Se a sua caixa FreeBSD já puder ser encaminhada para o lado remoto da VPN, seu trabalho estará quase pronto. Isso significa que a conexão é válida e está ciente da rota para a rede remota.

O host por trás do roteador não deve exigir nenhuma alteração para se comunicar "através da VPN". Se ele tiver o roteador configurado como seu gateway padrão, todo o tráfego para redes remotas (incluindo o outro lado da VPN) deve passar pelo roteador, que, como dissemos, já está ciente da rota apropriada. Se você quiser ser muito explícito, adicione uma rota estática à tabela de roteamento do host em questão para garantir que esteja ciente da rota correta para o lado remoto da VPN.

    
por 11.02.2012 / 05:08
0

Para verificar se a sua VPN está funcionando como esperado, você pode iniciar o ping do outro lado do túnel VPN a partir da sua caixa FreeBSD.

ping 98.158.118.1

O principal problema, uma vez que você tenha certeza de que sua VPN está ok, está "roteando" todo o tráfego proveniente de suas interfaces internas para a interface gn0 e fazendo NAT também nesta interface. Você não pode fazer isso simplesmente modificando o roteador padrão ou atiraria em você, pois a VPN exige que seus pacotes sejam roteados através do seu ISP;)

A palavra aqui é " desvio ", mas até onde eu sei (veja " O suporte a PF diverte como IPFW? "), isto não é suportado pela atual porta "pf" do FreeBSD (esta porta é sempre mais antiga que o OpenBSD "pf", como sendo a original ). Talvez no futuro ...

Aqui estão algumas dicas para uma solução que implica mudar de "pf" para " ipfw " que suportam " desvio ":

  • leia a documentação oficial do FreeBSD ipfw , já que é um bom começo para os próximos passos.
  • reconstrua seu kernel com o "ipfw" e o "desvio" enable (capítulo 31.6.2 da documentação do "ipfw")
  • habilite "ipfw" e defina a interface "natd" do seu arquivo "/etc/rc.conf":

    firewall_enable="YES"
    firewall_script="/etc/rc.firewall-myown"
    natd_enable="YES"
    natd_flags="-f /etc/natd.conf"
    natd_interface="ng0"
    
  • escreva o seu próprio "/etc/rc.firewall-myown" (você pode usar o padrão "/etc/rc.firewall" como ponto de partida):

    ipfw -f flush 
    ipfw add 10002 divert natd all from any to any via em2
    ipfw add 10003 divert natd all from any to any via em3
    ipfw add 10004 divert natd all from any to any via em4
    

A configuração do daemon "natd" é bastante simples e é usada principalmente para definir o encaminhamento de porta.

Eu não verifiquei tudo, especialmente o fato de que você tem 3 interfaces para NAT, mas eu uso "ipfw" para minha própria caixa de roteamento do FreeBSD e fiz algumas VPNs desviando no passado.

Aproveite!

    
por 12.02.2012 / 19:51
0

Eu não sei se o FreeBSD tem o comando ip , mas o mais parecido é algo similar para conseguir isso.

# create special routing table
echo 7 special >> /etc/iproute2/rt_tables
# add default route for special table
ip route add table special default via 98.158.118.1
# see special table
ip route show table special
# add source based routing rule
ip rule add from 10.0.1.10/32 table special
# + add your nat rules unless the other end knows how to route back
# to your 10.0.1.0/24 network

@ver guia de administração de rede da camada ip (linux)

    
por 15.02.2012 / 16:28