Como posso configurar o OpenVPN com IPv4 e IPv6 usando um dispositivo de toque?

7

Consegui configurar o OpenVPN para conectividade IPv4 completa usando tap0. Agora quero fazer o mesmo para o IPv6.

Endereços e configuração de rede (observe que meu prefixo real é substituído por 2001: db8):

2001:db8::100:0:0/96    my assigned IPv6 range
2001:db8::100:abc:0/112 OpenVPN IPv6 range
2001:db8::100:abc:1     tap0 (on server) (set as gateway on client)
2001:db8::100:abc:2     tap0 (on client)
2001:db8::1:2:3:4       gateway for server

 Home laptop   (tap0: 2001:db8::100:abc:2/112 gateway 2001:db8::100:abc:1/112)
  |      | |      (running Kubuntu 10.10; OpenVPN 2.1.0-3ubuntu1)
  | wifi | |
   router  |
      |   OpenVPN
  INTERNET |
eth0  |   /tap0
     VPS        (eth0:2001:db8::1:2:3:4/64    gateway 2001:db8::1)
               (tap0: 2001:db8::100:abc:1/112)
                  (running Debian 6; OpenVPN 2.1.3-2)

O servidor tem conectividade IPv4 e IPv6 nativa, o cliente tem apenas IPv4.

Eu posso fazer ping6 de e para o meu servidor através do OpenVPN, mas não para outras máquinas (por exemplo, ipv6.google.com ).

net.ipv6.conf.all.forwarding está definido como 1 , já tentei desativar net.ipv6.conf.all.accept_ra , sem sorte.

Usando tcpdump no servidor e no cliente, vejo que os pacotes são realmente transferidos de tap0 para eth0. O roteador (2001: db8 :: 1) envia uma solicitação de vizinho para o cliente (2001: db8 :: 100: abc: 2) para eth0 após receber a solicitação de eco ICMP6. O servidor não responde a essa solicitação, o que faz com que a solicitação de eco ICMP6 não seja roteada para o destino.

Como posso fazer essa conexão IPv6 funcionar?

    
por Lekensteyn 20.02.2011 / 15:14

2 respostas

5

A resposta de Timothy Baldwins colocou-me no caminho certo, embora a resposta fosse bastante enigmática. Propagandas / solicitações vizinhas IPv6 são como o ARP para IPv6. É usado para "ver" outras máquinas na rede. O roteador envia uma solicitação vizinha na qual a máquina (servidor ou cliente) deve responder com um anúncio vizinho.

Mesmo com net.ipv6.conf.all.forwarding definido como 1 , as propagandas e solicitações vizinhas não são encaminhadas. Para fazer anúncios e solicitações vizinhas de eth0, eth0 deve ser definido como proxy para o endereço IPv6 do cliente por trás de tap0, e o proxy para coisas vizinhas deve estar ativado para eth0:

echo 1 > /proc/sys/net/ipv6/conf/eth0/proxy_ndp
/sbin/ip -6 neigh add proxy 2001:db8::100:abc:2 dev eth0

Infelizmente, não é possível recuperar a lista de proxies adicionados, nem ip -6 mostra mensagens de erro ao executar repetidamente o comando. Nem tenho certeza se "neigh del proxy" funciona, ele não fornece uma mensagem de erro e o fonte C não é realmente significativo para mim.

Como não quero fazer tudo manualmente, criei um script que faz o trabalho para mim.

Configuração do servidor

Os endereços IPv6 são baseados na parte IPv4 (a 1 em 10.8.0. 1 ). O prefixo e a máscara de rede são armazenados em /etc/openvpn/variables .

As próximas etapas são feitas para configurar o OpenVPN com conectividade IPv4 / IPv6 criptografada para a Internet em uma conexão IPv4 nativa. chaves RSA e tls-auth é usado para autenticação e prevenção de MITM.

/etc/openvpn/variables contém variáveis que são usadas para o script up (executado na inicialização, após a criação do dispositivo tap0) e script de conexão do cliente (executado após a autenticação do cliente).

# this prefix is handled out by the provider, replace it with your own prefix
prefix=2001:db8::abc
# netmask, 2001:db9::abc:0000 - 2001:db9::abc:FFFF
prefixlen=112

/etc/openvpn/server-clientconnect.sh é executado como root e garante que o IPv6 seja roteado adequadamente, adicionando o endereço IPv6 ao proxy eth0. Como client-connect é chamado depois que o OpenVPN alternou para o usuário especificado pela configuração User , sudo é necessário para fornecer ao script permissões suficientes para execução como raiz. É claro, as variáveis devem ser verificadas antes de usar, o número deve ser entre e incluindo 2 ad 254. (1 é o gateway, 255 o endereço de transmissão).

#!/bin/sh
. /etc/openvpn/variables
if [ -z "$ifconfig_pool_remote_ip" ]; then
        echo "Missing environment variable."
        exit 1
fi
ipp=$(echo "$ifconfig_pool_remote_ip" | cut -d. -f4)
if ! [ "$ipp" -ge 2 -a "$ipp" -le 254 ] 2>/dev/null; then
        echo "Invalid IP part."
        exit 1
fi
hexipp=$(printf '%x' $ipp)
/sbin/ip -6 neigh add proxy $pfx:$hexipp dev eth0

Para que isso funcione, o usuário vpn deve ter permissão para executar o script enquanto preserva $ifconfig_pool_remote_ip , que contém o endereço IPv4 da rede remota. Adicione as próximas linhas ao arquivo sudoers executando sudo visudo e anexando:

Defaults:vpn env_keep=ifconfig_pool_remote_ip
vpn ALL=NOPASSWD: /etc/openvpn/server-clientconnect.sh

/etc/openvpn/server-up.sh habilita o IPv4, o encaminhamento de IPv6 (eth0 + tap0 não funcionou, ele realmente precisava ser all ) e proxy vizinho na eth0. Adiciona o endereço do gateway aos servidores tap0 também.

#!/bin/sh
. /etc/openvpn/variables
/sbin/ip -6 addr add $pfx:1/$pfxlen dev $dev
echo 1 > /proc/sys/net/ipv4/ip_forward
echo 1 > /proc/sys/net/ipv6/conf/all/forwarding
echo 1 > /proc/sys/net/ipv6/conf/eth0/proxy_ndp

Finalmente, o arquivo de configuração do OpenVPN em /etc/openvpn/internet.conf :

proto udp
dev tap
ca ca.crt
cert server.crt
key server.key
dh dh1024.pem
server 10.8.0.0 255.255.255.0
script-security 2
up /etc/openvpn/server-up.sh
client-connect "/usr/bin/sudo -u root /etc/openvpn/server-clientconnect.sh"
# encrypt all traffic
push "redirect-gateway def1"
# keep the same IP addresses each time
ifconfig-pool-persist ipp.txt
keepalive 10 120
tls-auth ta.key 0
cipher BF-CBC
comp-lzo
# OpenVPN will switch to this user, it is also used for sudo
user vpn
group vpn
persist-key
persist-tun

Para integridade, permissões e propriedades de arquivos em /etc/openvpn :

drwx------  root root  .
-rw-------  root root  ca.crt
-rw-------  root root  dh1024.pem
drwx------  root root  easy-rsa      <-- left from creation of keys
-rw-------  root root  ipp.txt
-rwx------  root root  server-clientconnect.sh
-rw-------  root root  internet.conf
-rw-------  root root  variables
-rwx------  root root  server-up.sh
-rw-------  root root  server.crt
-rw-------  root root  server.key
-rw-------  root root  ta.key
-rwx------  root root  update-resolv-conf <-- this was installed by default

Configurações do firewall:

itpables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -s 10.8.0.0/24 -i tap0 -o eth0 -j ACCEPT
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
ip6tables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
ip6tables -A FORWARD -s 2001::db8::abc:0/112 -i tap0 -o eth0 -j ACCEPT

Configuração no cliente

/etc/openvpn/client.conf :

client
dev tap
proto udp
remote 178.21.112.251 1194
script-security 2
up /etc/openvpn/client-up.sh
resolv-retry infinite
nobind
user nobody
group nogroup
persist-key
persist-tun
ca ca.crt
cert home.crt
key home.key
ns-cert-type server
tls-auth ta.key 1
cipher BF-CBC
comp-lzo

ta.key e ca.key são os mesmos arquivos do servidor. home.key e home.crt são arquivos criados no servidor.

client-up.sh adiciona o endereço IPv6 e a rota (com base no endereço IPv4):

#!/bin/sh
pfx='2001:db8::abc'
pfxlen=112
hexippart='printf '%x' "$(echo $ifconfig_local | cut -d. -f4)"'
/sbin/ip -6 addr add $pfx:$hexippart/$pfxlen dev $dev
/sbin/ip -6 route add default via $pfx:1 dev $dev

O guia no link foi muito útil e OpenVPN é útil para informações sobre várias configurações.

    
por 21.02.2011 / 23:23
0

O roteador upstream está configurado para 2001: db8 :: 100: abc: 2 para estar no link diretamente conectado, defina net.ipv6.conf.eth0.proxy_ndp = 1 para fingir que é.

    
por 21.02.2011 / 15:18