Como começar a trabalhar no OSX El Capitan


10

O software VPN forticlient é acionado, ao usar o horizonte dividido, desde o OSX El Capitan. O problema é que as solicitações de DNS são enviadas na interface principal normal para o DNS do túnel da VPN.

Como fazemos para que as solicitações de DNS sejam enviadas pela interface correta (ou seja, túnel VPN)

Respostas:


11

Resposta editada

(Re) aprimorei quase a resposta aprimorada de todos os outros (@elmart, @ user26312, eu mesmo). As edições não devem ser necessárias no script:

#!/bin/bash
default_line=$(netstat -rn |grep default)
gateway=$(echo $default_line | awk '{print $2}')
interface=$(echo $default_line | awk '{print $6}')
echo $gateway
echo $interface

scutil <<EOF
d.init
get State:/Network/Service/forticlientsslvpn/IPv4
d.add InterfaceName ppp0
set State:/Network/Service/forticlientsslvpn/IPv4
EOF

route delete default
route delete -ifscope $interface default
route add -ifscope $interface default $gateway
route add -net 0.0.0.0 -interface $interface

Faça com que o arquivo que você colocou seja executável e execute (após conectar-se à VPN) com o sudo. Antes que o script faça alterações, ele analisa sua rota padrão atual e, portanto, conhece seu gateway e interface atuais.


Resposta antiga

Não é uma solução completa, você deverá executar as seguintes ações de alto nível após cada configuração de conexão VPN:

  1. Teremos que definir a interface do túnel para ppp0
  2. Refazer rotas padrão (porque 1. define implicitamente o gateway padrão errado, o túnel dividido ainda deve funcionar corretamente a seguir)

Crie um arquivo com o nome, scutil-fortipor exemplo

d.init
get State:/Network/Service/forticlientsslvpn/IPv4
d.add InterfaceName ppp0
set State:/Network/Service/forticlientsslvpn/IPv4

Refaça as rotas do gateway, então crie outro arquivo, routes-forticom (observe as linhas com configurações específicas para sua rede):

sudo route delete default
sudo route delete  -ifscope en0 default # This line depends on your interface
sudo route add -ifscope en0 default 192.168.2.252  # This depends on your normal local gateway.
sudo route add -net 0.0.0.0 -interface en0

agora execute,

$ cat scutil-forti |sudo scutil ; bash routes-forti

Mas, essas etapas devem ser revertidas após a desconexão, não?
elmart

1
TL; DR nenhuma reversão é necessária. Não, a State:/Network/Service/forticlientsslvpn/IPv4chave está lá para começar quando o túnel da VPN estiver em execução e será excluído quando o túnel da VPN for excluído. As rotas não são realmente diferentes do que deveriam ser.
Hbogert 14/10/2015

8

Reescrevi a solução da @ hbogert em um script único mais gerenciável:

#!/bin/bash

scutil <<EOF
d.init
get State:/Network/Service/forticlientsslvpn/IPv4
d.add InterfaceName ppp0
set State:/Network/Service/forticlientsslvpn/IPv4
EOF

route delete default
route delete -ifscope en0 default
route add -ifscope en0 default 192.168.1.1
route add -net 0.0.0.0 -interface en0

Isso pressupõe que você esteja usando a interface en0 e o gateway padrão 192.168.1.1. Caso contrário, substitua aqueles pelos seus valores correspondentes. Se você não os conhece, digite route get www.google.compara obtê-los. Então:

  • Coloque isso em um arquivo (por exemplo, 'fix-vpn') em algum lugar do seu caminho.
  • Conceda permissões de execução ( chmod u+x fix-vpn).
  • Execute-o com sudo ( sudo fix-vpn) logo após conectar-se ao vpn.

Eu tentei e funciona. Como eu disse, isso é apenas um retrabalho de uma solução anterior. Acabei de postá-lo como uma resposta separada porque não tinha espaço suficiente em um comentário.

BTW, eu também pensei que isso poderia ser incluído em um /etc/ppp/ip-upscript para que seja executado automaticamente ao conectar. Mas, por alguma razão, não funciona dessa maneira. Se alguém puder explicar / melhorar isso, por favor.




0

Melhorando um pouco a resposta do @ elmart (eu acho).

#!/bin/bash
scutil <<EOF
d.init
get State:/Network/Service/forticlientsslvpn/IPv4
d.add InterfaceName ppp0
set State:/Network/Service/forticlientsslvpn/IPv4
EOF
ROUTE_OUT=$(route get www.google.com)
GATEWAY=$(echo "${ROUTE_OUT}"|grep gateway|cut -d':' -f2|xargs)
INTERFACE=$(echo "${ROUTE_OUT}"|grep interface|cut -d':' -f2|xargs)

echo "Fixing $INTERFACE with gateway $GATEWAY"

route delete default
route delete -ifscope $INTEFACE default
route add -ifscope $INTERFACE default $GATEWAY
route add -net 0.0.0.0 -interface $INTERFACE

Dessa forma, o script não precisa ser editado (e alterar as interfaces não deve ser um problema). xargsé usado para remover o espaço em branco.

Também adicionei (embora não saiba se isso é uma melhoria):

rootcheck () {
  if [ $(id -u) != "0" ]
    then
      echo "We need sudo permissions to run this script"
      sudo "$0" "$@"  # Modified as suggested below.
      exit $?
  fi
}

rootcheck "$@"

No início do script, para lembrar as pessoas de usarem o sudo.


Seria melhor usar um endereço IP no route getcomando para eliminar a dependência do DNS.
kasperd

Como o problema desta pergunta está no cérebro dividido, mesmo após a conexão da VPN, sua rota padrão provavelmente é seu gateway. Você pode simplesmente raspar $ netstat -rnpara obter o gateway e a interface.
Hbogert 27/10/2015


0

Resolvi o problema redefinindo as configurações de DNS para usar os servidores DNS do Google antes dos fornecidos pelo FortiClient. Infelizmente, isso deve ser feito após cada nova conexão.

#!/bin/bash
scutil <<EOF
d.init
d.add ServerAddresses 8.8.8.8 8.8.4.4 <IP ADDRESSES FOR DNS FROM FORTICLIENT>
set State:/Network/Service/forticlientsslvpn/DNS
quit
EOF

Detalhes sobre isso podem ser encontrados aqui .


Então, o que acontece se eu precisar do DNS da minha empresa para resolver nomes de host na rede da empresa?
Hbogert 16/05

Isso depende de como a VPN está configurada. Normalmente, os servidores DNS "internos" são transferidos para a sua máquina. Esses são os que chamei de "<ENDEREÇOS IP PARA DNS DO FORTICLIENT>". Se a sua máquina não conseguir resolver um endereço com 8.8.8.8 ou 8.8.4.4, ela usará os servidores DNS definidos pelos endereços IP em "<ENDEREÇOS DE IP PARA DNS DO FORTICLIENT>".
Christoph Hermann

0

Na minha versão atual do OS X (Sierra 10.12.6) e FortiClient 5.6.1, parece que se os ServerAddresses tiverem mais de 2 endereços, a chamada "set" não persistirá em nada (se você "receber", nada terá sido) Atualizada). Para contornar isso, decidi manter apenas o primeiro endereço DNS do FortiClient e mesclar com o meu endereço DNS público (8.8.8.8).

Além disso, sugiro executar automaticamente o script bash no FortiClient connect: isso pode ser feito exportando o script de configuração do FortiClient e reimportando-o

Guia completo abaixo:

1 / Crie o seguinte script bash e armazene-o em algum lugar (no meu caso, ele estava dentro ~/bashscripts/update-forticlient-dns.sh) e não se esqueça de substituí-lo <FIRST IP ADDRESS FOR FORTICLIENT DNS>pelo resultado scutil --dns | grep "nameserver\[0\]"enquanto sua conexão FortiClient estiver ativa

#!/bin/bash

ROOT_PASSWORD=$1

# Uncomment this if you want to log everything happening during this script execution into a dedicated log file
# exec >/tmp/forticlient-log 2>&1

# Ensuring we did a sudo correctly once
# Because we cannot both use a pipe and an stdin redirection at the same time
# (or at least, my bash knowledge is not wide enough for that :-))
echo "$ROOT_PASSWORD" | sudo -S ls /dev/null
sudo scutil <<EOF
get State:/Network/Service/forticlientsslvpn/DNS
d.add ServerAddresses 8.8.8.8 <FIRST IP ADDRESS FOR FORTICLIENT DNS>
set State:/Network/Service/forticlientsslvpn/DNS
quit
EOF

2 / Execute o FortiClient, vá em Preferências > Geral e clique no botão Backup , que exportará sua configuração do FortiClient para um arquivo

3 / Neste arquivo, localize e edite o nó / forticlient_configuration / vpn / sslvpn / connections / connection [name = "YOUR CONNECTION"] / on_connect / script / script e chame seu script dentro dele:

<on_connect>
   <script>
      <os>mac</os>
      <script>/Users/fcamblor/bashscripts/update-forticlient-dns.sh "your_secret_root_password_here"</script>
    </script>
</on_connect>

4 / Volte para o console FortiClient, clique no cadeado no canto inferior esquerdo, vá para Preferências > Geral e clique no botão Restaurar : localize seu arquivo de configuração atualizado e pronto , sua configuração de DNS será atualizada rapidamente sempre que você conectar-se à VPN.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.