답변:
(다시) 다른 사람의 개선 된 답변 (@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 연결 설정 후 다음 두 가지 고급 작업을 수행해야합니다.
ppp0
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
State:/Network/Service/forticlientsslvpn/IPv4
키는 VPN 터널이 실행되고 VPN 터널이 연결 해제를 삭제할 때 삭제되면 거기 시작하는 것입니다. 경로는 실제로 원래 경로와 다르지 않습니다.
@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
하여 입력하십시오 . 그때:
chmod u+x fix-vpn
).sudo fix-vpn
VPN에 연결 한 직후 sudo ( )로 실행하십시오 .나는 그것을 시도하고 작동합니다. 내가 말했듯이, 이것은 단지 이전 솔루션의 재 작업입니다. 주석에 충분한 공간이 없기 때문에 방금 별도의 답변으로 게시했습니다.
BTW, 나는 이것이 /etc/ppp/ip-up
스크립트에 포함되어 연결시 자동으로 실행될 수 있다고 생각 했습니다. 그러나 어떤 이유로 든 그렇게 작동하지 않습니다. 누군가 설명하거나 향상시킬 수 있다면 그렇게하십시오.
이전 버전의 Forticlient를 사용할 수 있었고 작동하는지 확인했습니다!
내 dropbox에 대한 링크는 다음과 같습니다.
https://www.dropbox.com/s/p43ssvp0gusmzeq/forticlientsslvpn_macosx_4.0.2297.dmg?dl=0
업데이트 : Mac OS X 용 최신 공식 버전 5.4.1을 다운로드하여 설치하면 Mac OS X El Capitan의 모든 문제가 해결됩니다.
포티넷 포럼에 설명 된대로, Mac OS X El Capitan의 문제를 해결하기 위해 FortiClient의 최신 (아직 공개되지 않은) 버전을 다운로드해야합니다.
https://www.dropbox.com/sh/cb0j4pxw1f8nq84/AABHzZW1bpx1VjzYAmiK00S9a?dl=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에 대한 종속성을 제거하는 것이 좋습니다 .
$ netstat -rn
게이트웨이와 인터페이스를 얻기 위해 긁을 수 있습니다 .
나는 hbogert의 스크립트를 가져 와서 자신과 다른 직원을 위해 Applescript로 포장했습니다. https://www.dropbox.com/s/lh0hsqdesk3i0n7/Execute-Post-VPN-Connection.app.zip?dl=0
VPN에 연결 한 다음 앱을 실행하고 관리자 비밀번호 (sudo에 필요)를 입력하십시오. 참고 : / Applications /에 저장해야합니다
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
이에 대한 자세한 내용은 여기를 참조하십시오 .
현재 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에 연결하십시오.