OSX El Capitan에서 forticlient를 사용하는 방법


10

OSX El Capitan부터 분할 수평선을 사용할 때 forticlient VPN 소프트웨어가 중단됩니다. 문제는 DNS 요청이 일반 기본 인터페이스에서 VPN 터널의 DNS로 전송된다는 것입니다.

올바른 인터페이스 (예 : VPN 터널)를 통해 DNS 요청을 보내려면 어떻게해야합니까

답변:


11

수정 된 답변

(다시) 다른 사람의 개선 된 답변 (@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

그러나 연결을 끊은 후이 단계를 되돌려 야합니까?
elmart

1
TL; DR 되돌릴 필요가 없습니다. 아니, State:/Network/Service/forticlientsslvpn/IPv4키는 VPN 터널이 실행되고 VPN 터널이 연결 해제를 삭제할 때 삭제되면 거기 시작하는 것입니다. 경로는 실제로 원래 경로와 다르지 않습니다.
hbogert

8

@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 ( )로 실행하십시오 .

나는 그것을 시도하고 작동합니다. 내가 말했듯이, 이것은 단지 이전 솔루션의 재 작업입니다. 주석에 충분한 공간이 없기 때문에 방금 별도의 답변으로 게시했습니다.

BTW, 나는 이것이 /etc/ppp/ip-up스크립트에 포함되어 연결시 자동으로 실행될 수 있다고 생각 했습니다. 그러나 어떤 이유로 든 그렇게 작동하지 않습니다. 누군가 설명하거나 향상시킬 수 있다면 그렇게하십시오.




0

@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를 사용하도록 상기시키기 위해 스크립트의 맨 처음에.


route get명령에 IP 주소를 사용하여 DNS에 대한 종속성을 제거하는 것이 좋습니다 .
kasperd

이 질문의 문제는 split brain과 관련이 있기 때문에 VPN이 연결된 후에도 기본 경로가 게이트웨이 일 가능성이 큽니다. $ netstat -rn게이트웨이와 인터페이스를 얻기 위해 긁을 수 있습니다 .
hbogert


0

FortiClient가 제공 한 서버보다 먼저 Google DNS 서버를 사용하도록 DNS 설정을 재구성하여 문제를 해결했습니다. 불행히도이 작업은 각 재 연결 후에 수행해야합니다.

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

이에 대한 자세한 내용은 여기를 참조하십시오 .


회사 네트워크에서 호스트 이름을 확인하기 위해 회사의 DNS가 필요한 경우 어떻게됩니까?
hbogert

VPN 구성 방법에 따라 다릅니다. 일반적으로 "내부"DNS 서버는 시스템으로 전달됩니다. 이것들은 내가 "<강제로부터 DNS에 대한 IP 주소>"라고 불렀습니다. 컴퓨터에서 8.8.8.8 또는 8.8.4.4의 주소를 확인할 수없는 경우 "<FORTICLIENT에서 DNS의 IP 주소>"에있는 IP 주소로 정의 된 DNS 서버를 사용합니다.
Christoph Hermann

0

현재 OS X 버전 (Sierra 10.12.6) 및 FortiClient 5.6.1에서 ServerAddresses에 2 개 이상의 주소가있는 경우 "set"호출은 아무 것도 유지하지 않습니다 ( "get"인 경우 아무 것도 없었 음) 업데이트). 이 문제를 해결하기 위해 먼저 FortiClient DNS 주소 만 유지하고 공용 DNS 주소 (8.8.8.8)와 병합하기로 결정했습니다.

또한 FortiClient connect에서 bash 스크립트를 자동으로 실행하는 것이 좋습니다. FortiClient 구성 스크립트를 내 보낸 다음 다시 가져 오면됩니다.

아래의 전체 가이드 :

1 / 다음 bash 스크립트를 작성하고 어딘가에 저장하십시오 (내 경우에는 ~/bashscripts/update-forticlient-dns.sh). FortiClient 연결이 설정된 동안 <FIRST IP ADDRESS FOR FORTICLIENT DNS>결과 를 바꾸는 것을 잊지 마십시오scutil --dns | grep "nameserver\[0\]"

#!/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 / FortiClient를 실행 한 다음 환경 설정 > 일반 으로 이동 하여 백업 버튼을 클릭 하여 FortiClient 구성을 파일로 내 보냅니다.

3 /이 파일에서 / forticlient_configuration / vpn / sslvpn / connections / connection [name = "YOUR CONNECTION"] / on_connect / script / script 노드를 찾아서 편집 하십시오.

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

4 / FortiClient 콘솔로 돌아가서 왼쪽 하단에서 잠금을 클릭 한 다음 기본 설정 > 일반으로 이동 하고 복원 버튼을 클릭 하십시오. 업데이트 된 구성 파일을 찾으면 DNS 구성이 즉시 업데이트됩니다. VPN에 연결하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.