Forticlient OSX El Capitan'da çalışma


10

Öngörülen VPN yazılımı, bölünmüş ufuk kullanıldığında, OSX El Capitan'dan beri gözüküyor. Sorun, DNS isteklerinin normal birincil arabirimde VPN tünelinin DNS'sine gönderilmesidir.

DNS isteklerinin doğru arayüz üzerinden gönderilmesini nasıl sağlayabiliriz (yani VPN tüneli)

Yanıtlar:


11

Düzenlenmiş Yanıt

(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.


Eski cevap

Tam bir çözüm değil, her VPN bağlantı kurulumundan sonra aşağıdaki iki üst düzey şeyi yapmanız gerekir:

  1. Tünelin arayüzünü ppp0
  2. Varsayılan yolları yeniden yap (1. örtük olarak yanlış varsayılan ağ geçidini ayarladığından, bölünmüş tünel bundan böyle düzgün çalışmalıdır)

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

Ancak, bağlantı kesildikten sonra bu adımların geri döndürülmesi gerekir, değil mi?
elmart

1
TL; DR geri döndürmeye gerek yoktur. Hayır, State:/Network/Service/forticlientsslvpn/IPv4anahtar 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

8

@ 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.comalmak için yazın. Sonra:

  • Bunu, yolunuzun herhangi bir yerinde bir dosyaya (örneğin 'fix-vpn') yerleştirin.
  • Yürütme izinlerini verin ( chmod u+x fix-vpn).
  • Vpn'ye sudo fix-vpnbağ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-upbetiğ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.




0

@ 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). xargsboş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 getDNS bağımlılığını ortadan kaldırmak için komutta bir IP adresi kullanmak daha iyi olur .
kasperd

Bu sorunun sorunu beynin bölünmesi ile ilgili olduğundan, VPN bağlandıktan sonra bile varsayılan rotanız muhtemelen ağ geçidinizdir. Sadece $ netstat -rnağ geçidini ve arayüzü almak için kazıyabilirsiniz.
hbogert


0

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 .


Peki şirket ağındaki ana bilgisayar adlarını çözmek için şirketimin DNS'sine ihtiyacım olursa ne olur?
hbogert

Bu, VPN'nin nasıl yapılandırıldığına bağlıdır. Normalde, "dahili" DNS sunucuları makinenize aktarılır. Bunlar "<FORTICLIENT'TAN DNS İÇİN IP ADRESLERİ>" olarak adlandırdığımlardır. Makineniz 8.8.8.8 veya 8.8.4.4 ile bir adresi çözemezse, "<FORTICLIENT'DEN DNS İÇİN IP IP ADRESİ>" içindeki IP adresleri tarafından tanımlanan DNS sunucularını kullanır.
Christoph Hermann

0

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.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.