Resposta editada

Resposta editada

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

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

Responder1

Resposta editada

(Re)melhorou a resposta aprimorada de quase todo mundo (@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

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


Resposta antiga

Não é uma solução completa, você terá que fazer as duas coisas de alto nível a seguir após cada configuração de conexão VPN:

  1. Teremos que configurar a interface do túnel parappp0
  2. Refazer rotas padrão (porque 1. define implicitamente o gateway padrão errado, o túnel dividido ainda deve funcionar corretamente daqui em diante)

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-forti, com (atenção às 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

Responder2

Reformulei a solução do @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-os pelos 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.
  • Dê-lhe permissões de execução ( chmod u+x fix-vpn).
  • Execute-o com sudo ( sudo fix-vpn) logo após conectar-se à VPN.

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

Aliás, também pensei que isso poderia ser incluído em um /etc/ppp/ip-upscript para que fosse executado automaticamente durante a conexão. Mas, por alguma razão, não funciona assim. Se alguém puder explicar/melhorar isso, por favor, faça.

Responder3

Consegui usar uma versão mais antiga do Forticlient e confirmei que funciona!

Aqui está o link para ele na minha caixa de depósito:

https://www.dropbox.com/s/p43ssvp0gusmzeq/forticlientsslvpn_macosx_4.0.2297.dmg?dl=0

Responder4

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 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 "$@"

Bem no início do script, para lembrar as pessoas de usar o sudo.

informação relacionada