ซอฟต์แวร์ VPN forticlient นั้น borked เมื่อใช้ split horizon ตั้งแต่ OSX El Capitan ปัญหาคือคำร้องขอ DNS ถูกส่งออกไปบนอินเทอร์เฟซหลักปกติไปยัง DNS ของอุโมงค์ VPN
เราจะรับคำร้องขอ DNS ให้ส่งผ่านอินเตอร์เฟซที่ถูกต้องได้อย่างไร (เช่นอุโมงค์ VPN)
ซอฟต์แวร์ VPN forticlient นั้น borked เมื่อใช้ split horizon ตั้งแต่ OSX El Capitan ปัญหาคือคำร้องขอ DNS ถูกส่งออกไปบนอินเทอร์เฟซหลักปกติไปยัง DNS ของอุโมงค์ VPN
เราจะรับคำร้องขอ DNS ให้ส่งผ่านอินเตอร์เฟซที่ถูกต้องได้อย่างไร (เช่นอุโมงค์ VPN)
คำตอบ:
(Re) ปรับปรุงเกี่ยวกับคำตอบที่ดีขึ้นของทุกคน (@elmart, @ user26312, ตัวฉันเอง) ไม่ควรทำการแก้ไขในสคริปต์:
#!/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
จัดทำไฟล์ที่คุณใส่ไว้ในไฟล์เรียกใช้และเรียกใช้งาน (หลังจากเชื่อมต่อกับ VPN) ด้วย sudo ก่อนที่สคริปต์จะทำการเปลี่ยนแปลงใด ๆ สคริปต์จะพิจารณาเส้นทางเริ่มต้นปัจจุบันของคุณดังนั้นจึงรู้เกตเวย์และอินเตอร์เฟสปัจจุบันของคุณ
ไม่ใช่โซลูชันที่สมบูรณ์คุณจะต้องทำสองสิ่งต่อไปนี้ระดับสูงหลังจากการตั้งค่าการเชื่อมต่อ 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ฉันลองแล้วใช้งานได้ ดังที่ฉันได้กล่าวมานี่เป็นเพียงการนำกลับมาทำใหม่ของวิธีแก้ปัญหาก่อนหน้า ฉันเพิ่งโพสต์เป็นคำตอบแยกต่างหากเนื่องจากฉันมีพื้นที่ไม่เพียงพอในความคิดเห็น
BTW ฉันคิดว่านี่อาจรวมอยู่ใน/etc/ppp/ip-up
สคริปต์เพื่อที่จะได้รับการดำเนินการโดยอัตโนมัติเมื่อเชื่อมต่อ แต่ด้วยเหตุผลบางอย่างมันไม่ทำงานอย่างนั้น หากใครบางคนสามารถอธิบาย / ปรับปรุงเกี่ยวกับเรื่องนั้นได้โปรดทำ
ฉันสามารถใช้ Forticlient รุ่นเก่ากว่าและยืนยันว่าใช้งานได้!
นี่คือลิงค์ของมันในดรอปบ็อกซ์ของฉัน:
https://www.dropbox.com/s/p43ssvp0gusmzeq/forticlientsslvpn_macosx_4.0.2297.dmg?dl=0
อัปเดต: การดาวน์โหลดและติดตั้งเวอร์ชันใหม่ล่าสุดและเป็นทางการ 5.4.1 สำหรับ Mac OS X แก้ไขปัญหาทั้งหมดใน Mac OS X El Capitan
ดังที่ได้อธิบายไว้ในฟอรัม Fortinetเราควรดาวน์โหลด FortiClient รุ่นใหม่ล่าสุด (ยังไม่เผยแพร่) เพื่อแก้ไขปัญหาใน Mac OS X El Capitan:
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
คำสั่งเพื่อกำจัดการพึ่งพา DNS
$ netstat -rn
เพื่อรับเกตเวย์และส่วนต่อประสาน
ฉันใช้สคริปต์ของ hbogert และเขียนไว้ใน Applescript สำหรับตัวฉันเองและพนักงานคนอื่น ๆ มันมีให้ที่นี่: https://www.dropbox.com/s/lh0hsqdesk3i0n7/Execute-Post-VPN-Connection.app.zip?dl=0
เพียงเชื่อมต่อกับ VPN จากนั้นดำเนินการแอพและพิมพ์รหัสผ่านผู้ดูแลระบบของคุณ (จำเป็นสำหรับ sudo) หมายเหตุ: ต้องบันทึกไว้ใน / แอปพลิเคชัน /
ฉันแก้ไขปัญหาให้ฉันด้วยการกำหนดการตั้งค่า DNS ใหม่เพื่อใช้เซิร์ฟเวอร์ Google DNS ก่อนที่ FortiClient จะได้รับ น่าเสียดายที่ต้องดำเนินการหลังจากเชื่อมต่ออีกครั้ง
#!/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 ปัจจุบันของฉัน (เซียร์ 10.12.6) และ FortiClient 5.6.1 ดูเหมือนว่าถ้า ServerAddresses มีที่อยู่มากกว่า 2 ที่อยู่การโทร "set" จะไม่คงอยู่ต่อไป (ถ้าคุณ "ได้รับ" จะไม่มีอะไรเกิดขึ้น ปรับปรุง) เพื่อแก้ไขปัญหานี้ฉันตัดสินใจที่จะเก็บที่อยู่ DNS FortiClient แรกเท่านั้นและรวมกับที่อยู่ DNS สาธารณะของฉัน (8.8.8.8)
นอกจากนี้ฉันขอแนะนำให้รันสคริปต์ทุบตีโดยอัตโนมัติในการเชื่อมต่อ FortiClient: สิ่งนี้สามารถทำได้โดยการส่งออกสคริปต์การกำหนดค่า FortiClient จากนั้นนำเข้าอีกครั้ง
คู่มือเต็มรูปแบบด้านล่าง:
1 / สร้างสคริปต์ทุบตีต่อไปนี้และเก็บไว้ที่ใดที่หนึ่ง (ในกรณีของฉันมันเป็น~/bashscripts/update-forticlient-dns.sh
) และอย่าลืมที่จะแทนที่<FIRST IP ADDRESS FOR FORTICLIENT DNS>
ด้วยผลของscutil --dns | grep "nameserver\[0\]"
การเชื่อมต่อ FortiClient ของคุณ
#!/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 / การเชื่อมต่อ / การเชื่อมต่อ [name = "Your CONNECTION"] / โหนด on_connect / สคริปต์ /และสคริปต์ของคุณภายใน:
<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