Скриптовете стартират VPN клиенти на слоя, който авторът е избрал, и този слой рядко е този, от който задачата се е нуждаела. Командният ред на доставчика, набиращият на операционната система и намерението на мобилно приложение се връщат в различни моменти от живота на връзката. Те третират тайната също различно, и тази разлика решава дали паролата е видима за всеки потребител на машината. Изберете слоя, преди да напишете първия ред от скрипта.

Слой 1: командният ред на доставчика

Повечето настолни клиенти предоставят команден ред, който приема име на профил и, твърде често, парола. Старият клиент на Cisco приемаше глагол connect с аргументи за потребител и парола; macOS излага вградената услуга чрез networksetup; NetworkManager отговаря на nmcli. Тези извиквания се връщат, когато командата приключи, което не е същият момент, в който тунелът става използваем. Прочетете документацията на доставчика за версията, която внедрявате, защото тези интерфейси се променят и някои се премахват напълно.

nmcli connection up "Work VPN"
networksetup -connectpppoeservice "Work VPN"

Предимството е, че доставчикът познава собствения си профилен магазин, така че извикването използва същата конфигурация, която би използвал GUI. Недостатъкът е, че всеки доставчик измисля свои глаголи и скрипт, написан за един клиент, не се пренася към друг. Разглеждайте този слой като най-краткия път, когато клиентът е фиксиран и версията е закрепена.

Слой 2: собствената услуга на операционната система

В Windows набиращият е част от операционната система и работи срещу запис в телефонния указател, вместо профилния магазин на доставчика. Това го прави по-преносим между клиенти и по-лесен за скриптиране от сервизен акаунт. Това също означава, че връзката може да съществува на едно място, а не на другото, което обърква хората, които гледат в грешния списък.

rasdial "Work VPN" user pass
Get-VpnConnection -Name "Work VPN" | Select-Object ConnectionStatus

Използвайте повърхността на PowerShell, когато трябва да създадете или премахнете записа, вместо да го набирате. Слоевете WMI и cmdlet излагат същите обекти под различни имена, а премахването е отделна операция от прекъсването. Скрипт, който само набира, ще остави остарели записи след миграция. Проверете в кой магазин пише автоматизацията ви, преди да обещаете, че почистването ще се случи.

Remove-VpnConnection -Name "Old VPN" -Force
Get-VpnConnection

В macOS еквивалентът е списъкът с мрежови услуги, където съществуваща услуга се свързва по име, вместо да се създава в движение.

Идентификационните данни изтичат на всеки слой, затова изберете канала

Всичко, което подадете на командния ред, се появява в таблицата на процесите за всеки локален потребител и обикновено оцелява и в историята на shell-а. Поддържаната алтернатива на OpenVPN е четене на тайната от файл с --askpass, а самият файл се нуждае от разрешения, които отговарят на доверието, което влагате в него. Именувана тръба избягва записването на тайната на диск, но позволява на всеки процес, който може да я отвори, да пише там. В Windows съхранявайте тайната в мениджъра на идентификационни данни или във файл, който само сервизният акаунт може да чете, и никога като литерал в batch файл.

openvpn --config /etc/openvpn/work.conf --askpass /etc/openvpn/work.secret --auth-nocache --daemon
ls -l /etc/openvpn/work.secret

Същото правило важи за токени и еднократни кодове: ако автоматизацията се нуждае от тях, тя се нуждае от канал, който не е аргумент на командния ред. Завъртете тайната, когато смените механизма, защото старата стойност е лежала някъде в лог. Скрипт, който работи и изтича, не е работещ скрипт.

Изчакайте състоянието, после наблюдавайте един собственик

Всяко от тези извиквания се връща, преди тунелът да е готов, затова проверявайте състоянието, което клиентът излага, или опитайте дестинация вътре в него с времево ограничение. Копирането на файлове или отварянето на връзка с база данни веднага след извикването за свързване е състезание и се проваля периодично по начин, който изглежда като мрежова повреда.

ip link show tun0
nmcli -t -f GENERAL.STATE connection show "Work VPN"
curl -sS --max-time 5 https://app.internal.example/health -o /dev/null

Прекъсването има същия проблем в обратна посока: процесът може да излезе, преди маршрутите да са изчезнали. Използвайте куките на клиента, където съществуват, като скриптовете up и down на OpenVPN или ExecStartPost на systemd unit, защото те се изпълняват в точката, която наистина ви интересува. Куките се изпълняват с привилегиите на това, което ги е извикало, така че кука, която рестартира мрежата, се нуждае от изрично правило, а не от предположение. Поддържайте точно един собственик за целия живот на връзката.

Когато двама надзорници стартират и спират един и същ профил, резултатът е цикъл на повторно свързване, който се чете като прекъсване на доставчика. Runbook-ът завършва, когато слоят е документиран, тайната има канал, който не е argv, условието за изчакване е проверка на състоянието с времево ограничение и един процес притежава жизнения цикъл.

Подобни статии