Yanıtlar:
(Yeniden) hemen hemen herkesin gelişmiş cevabı (@elmart, @ user26312, kendim) geliştirildi. Komut dosyasında düzenlemelere gerek yoktur:
#!/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
Bunu koyduğunuz dosyayı çalıştırılabilir yapın ve sudo ile (VPN ile bağlandıktan sonra) yürütün. Komut dosyası herhangi bir değişiklik yapmadan önce geçerli varsayılan rotanıza bakar ve bu nedenle geçerli ağ geçidinizi ve arayüzünüzü bilir.
Tam bir çözüm değil, her VPN bağlantı kurulumundan sonra aşağıdaki iki üst düzey şeyi yapmanız gerekir:
ppp0
scutil-forti
Örneğin adlı bir dosya oluşturun
d.init
get State:/Network/Service/forticlientsslvpn/IPv4
d.add InterfaceName ppp0
set State:/Network/Service/forticlientsslvpn/IPv4
Ağ geçidi rotalarını yeniden yapın, bu yüzden başka bir dosya yapın, routes-forti
(ağınız için belirli ayarlara sahip satırlara dikkat edin):
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
şimdi,
$ cat scutil-forti |sudo scutil ; bash routes-forti
State:/Network/Service/forticlientsslvpn/IPv4
anahtar VPN tüneli çalıştıktan sonra başlamak için oradadır ve VPN tüneli silindiğinde silinir. Yollar aslında olması gerekenden farklı değil.
@ Hbogert'ın çözümünü daha yönetilebilir tek bir senaryoya dönüştürdüm:
#!/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
Bu, en0 arayüzünü ve 192.168.1.1 varsayılan ağ geçidini kullandığınızı varsayar. Değilse, bunları karşılık gelen değerlerinizle değiştirin. Onları bilmiyorsanız, route get www.google.com
almak için yazın. Sonra:
chmod u+x fix-vpn
).sudo fix-vpn
bağlandıktan hemen sonra sudo ( ) ile çalıştırın .Denedim ve işe yarıyor. Dediğim gibi, bu sadece önceki bir çözümün yeniden çalışmasıdır. Sadece ayrı bir cevap olarak gönderdim çünkü bir yorumda yeterli alanım yoktu.
BTW, bunun bir /etc/ppp/ip-up
betiğe eklenebileceğini düşündüm, böylece bağlanırken otomatik olarak yürütülür. Ancak bazı nedenlerden dolayı, bu şekilde çalışmaz. Birisi bunu açıklayabilir / geliştirebilirse, lütfen yapınız.
Forticlient'in eski bir sürümünü kullanabildim ve çalıştığını doğruladım!
İşte benim dropbox üzerinde bağlantı:
https://www.dropbox.com/s/p43ssvp0gusmzeq/forticlientsslvpn_macosx_4.0.2297.dmg?dl=0
GÜNCELLEME: Mac OS X için en yeni ve resmi 5.4.1 sürümünü indirip yüklemek Mac OS X El Capitan'daki tüm sorunları giderir.
Fortinet forumunda açıklandığı gibi , Mac OS X El Capitan'daki sorunları çözmek için FortiClient'in en yeni (henüz yayınlanmamış) sürümünü indirmelisiniz:
https://www.dropbox.com/sh/cb0j4pxw1f8nq84/AABHzZW1bpx1VjzYAmiK00S9a?dl=0
Bu benim için en kolay çözümdü.
@ Elmart'ın cevabını biraz geliştiriyorum (sanırım).
#!/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
Bu şekilde komut dosyasının düzenlenmesi gerekmez (ve arayüzleri değiştirmek sorun yaratmaz). xargs
boşlukları ayırmak için kullanılır.
Ayrıca ekledim (bunun bir gelişme olup olmadığını bilmiyorum):
rootcheck () {
if [ $(id -u) != "0" ]
then
echo "We need sudo permissions to run this script"
sudo "$0" "$@" # Modified as suggested below.
exit $?
fi
}
rootcheck "$@"
Senaryo en başında sudo kullanmasını hatırlatmak için.
route get
DNS bağımlılığını ortadan kaldırmak için komutta bir IP adresi kullanmak daha iyi olur .
$ netstat -rn
ağ geçidini ve arayüzü almak için kazıyabilirsiniz.
Ben hbogert'ın senaryosunu aldım ve kendim ve başka bir çalışan için Applescript'e koydum, burada bulunabilir: https://www.dropbox.com/s/lh0hsqdesk3i0n7/Execute-Post-VPN-Connection.app.zip?dl=0
Sadece VPN'ye bağlanın, ardından uygulamayı yürütün ve yönetici şifrenizi yazın (sudo için gereklidir). NOT: KAYDEDİLMELİDİR / Uygulamalar /
FortiClient tarafından sağlananlardan önce DNS ayarlarını Google DNS sunucularını kullanacak şekilde yeniden yapılandırarak sorunu benim için çözdüm. Ne yazık ki, bu her yeniden bağlandıktan sonra yapılmalıdır.
#!/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
Bununla ilgili ayrıntılar burada bulunabilir .
Mevcut OS X sürümümde (Sierra 10.12.6) & FortiClient 5.6.1'de, SunucuAdreslerinin 2'den fazla adresi varsa, "set" çağrısı hiçbir şey devam etmez ("alırsanız", hiçbir şey olmaz güncellenmiş). Bu sorunu çözmek için, yalnızca ilk FortiClient DNS adresini tutmaya ve genel DNS adresimle (8.8.8.8) birleştirmeye karar verdim.
Ayrıca, bash komut dosyasını FortiClient bağlantısında otomatik olarak çalıştırmanızı öneririm: Bu, FortiClient yapılandırma komut dosyasını dışa aktararak yeniden içe aktararak yapılabilir
Aşağıda tam kılavuz:
1 / Aşağıdaki bash betiğini oluşturun ve bir yerde saklayın (benim durumumda oldu ~/bashscripts/update-forticlient-dns.sh
) ve FortiClient bağlantınız açıkken <FIRST IP ADDRESS FOR FORTICLIENT DNS>
sonucunu değiştirmeyi unutmayın.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 / Çalıştır FortiClient ardından gitmek Tercihler > Genel tıklamanız Yedekleme bir dosya halinde FortiClient yapılandırmasını ihraç edecek düğmesini
3 / Bu dosyada, / forticlient_configuration / vpn / sslvpn / connections / connection [name = "SİZİN BAĞLANTINIZ"] / on_connect / script / script düğümünü bulup düzenleyin ve içindeki komut dosyasını çağırın:
<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 konsoluna geri dönün, sol alt köşedeki kilidi tıklayın, ardından Tercihler > Genel'e gidin ve Geri Yükle düğmesini tıklayın: güncellenmiş yapılandırma dosyanızı bulun ve işte bu, DNS yapılandırmanız her seferinde güncellenecek VPN'ye bağlanın.