수정된 답변

수정된 답변

OSX El Capitan 이후 분할 지평선을 사용할 때 강력한 VPN 소프트웨어가 작동하지 않습니다. 문제는 DNS 요청이 일반 기본 인터페이스에서 VPN 터널의 DNS로 전송된다는 것입니다.

DNS 요청이 올바른 인터페이스(예: VPN 터널)를 통해 전송되도록 하려면 어떻게 해야 합니까?

답변1

수정된 답변

다른 모든 사람의 향상된 답변(@elmart, @user26312,myself)을 (재)개선했습니다. 스크립트에는 편집이 필요하지 않습니다.

#!/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

이것을 넣은 파일을 실행 가능하게 만들고 sudo를 사용하여 (VPN에 연결한 후) 실행합니다. 스크립트는 변경을 수행하기 전에 현재 기본 경로를 확인하므로 현재 게이트웨이와 인터페이스를 알고 있습니다.


이전 답변

완전한 솔루션은 아닙니다. 각 VPN 연결 설정 후에 다음 두 가지 상위 수준 작업을 수행해야 합니다.

  1. 터널의 인터페이스를 다음으로 설정해야 합니다.ppp0
  2. 기본 경로 다시 실행(1. 암시적으로 잘못된 기본 게이트웨이를 설정하기 때문에 분할 터널은 이후에도 계속 올바르게 작동해야 함)

scutil-forti예를 들어 이름으로 파일을 만듭니다.

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

게이트웨이 경로를 다시 실행하므로 다음을 routes-forti사용하여 다른 파일을 만듭니다(네트워크에 대한 특정 설정이 있는 줄에 유의).

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

이제 실행해 보세요.

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

답변2

@hbogert의 솔루션을 보다 관리하기 쉬운 단일 스크립트로 재작업했습니다.

#!/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

이는 en0 인터페이스와 192.168.1.1 기본 게이트웨이를 사용한다고 가정합니다. 그렇지 않은 경우 해당 값으로 바꾸십시오. 모르는 경우 입력 route get www.google.com하여 가져오세요. 그 다음에:

  • 이를 경로 어딘가에 파일(예: 'fix-vpn')에 넣습니다.
  • 실행 권한( )을 부여합니다 chmod u+x fix-vpn.
  • sudo fix-vpnVPN 연결 후 바로 sudo( )로 실행하세요 .

나는 그것을 시도했고 작동합니다. 내가 말했듯이 이것은 이전 솔루션을 재작업한 것일 뿐입니다. 댓글에 공간이 부족해서 방금 별도의 답변으로 게시했습니다.

/etc/ppp/ip-up그런데, 나는 이것이 연결 시 자동으로 실행되도록 스크립트 에 포함될 수도 있다고 생각했습니다 . 하지만 어떤 이유에서인지 그런 식으로 작동하지 않습니다. 누군가 이에 대해 설명하거나 개선할 수 있다면 그렇게 해주세요.

답변3

이전 버전의 Forticlient를 사용할 수 있었고 작동하는 것을 확인했습니다!

내 보관용 계정에 있는 링크는 다음과 같습니다.

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

답변4

@elmart의 답변이 약간 개선되었습니다.

#!/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

이렇게 하면 스크립트를 편집할 필요가 없습니다. 인터페이스를 변경하는 것도 문제가 되지 않습니다. xargs공백을 제거하는 데 사용됩니다.

나는 또한 다음을 추가했습니다(이것이 개선되었는지는 모르겠지만):

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

rootcheck "$@"

사람들에게 sudo를 사용하도록 상기시키기 위해 스크립트의 맨 처음 부분에 표시됩니다.

관련 정보