Управление Cisco Secure Client на личном Mac

Если на личном Mac установлен корпоративный Cisco Secure Client, его фоновые процессы работают 24/7 — даже когда VPN не подключён. Скрипт ниже полностью останавливает Cisco когда не нужен и запускает обратно.

Что работает в фоне

ПроцессЗапускЧто делает
vpnagentdroot, автозапуск через SMAppServiceОсновной демон, управляет подключениями
acsockextroot, system extensionSocket filter — перехватывает весь сетевой трафик на уровне ядра
Cisco Secure Client GUIпользовательИнтерфейс

Подробнее о конфликтах при переключении VPN.

Приватность

Без VPN-подключения: исходящих соединений на корпоративные серверы нет. Но acsockext видит весь трафик локально, а телеметрия (CustomerExperienceFeedback/vpn.cef) копится и отправляется при следующем подключении. Содержит только мета VPN-сессий (количество, шифры, тип шлюза), не домены/сайты.

С VPN-подключением: весь трафик через корпоративную инфраструктуру (full tunnel). ИБ видит DNS-запросы и IP-адреса назначения.

Скрипт cisco-vpn.sh

Расположение: ~/bin/cisco-vpn.sh

#!/bin/bash
set -euo pipefail
 
CISCO_APP="/Applications/Cisco/Cisco Secure Client.app"
CISCO_FILTER_APP="/Applications/Cisco/Cisco Secure Client - Socket Filter.app"
CISCO_AGENT="system/com.cisco.secureclient.vpn.service.agent"
 
red()   { printf '\033[1;31m%s\033[0m\n' "$*"; }
green() { printf '\033[1;32m%s\033[0m\n' "$*"; }
gray()  { printf '\033[0;37m%s\033[0m\n' "$*"; }
 
status() {
    local agent_running=false
    local filter_running=false
    local gui_running=false
 
    pgrep -q vpnagentd 2>/dev/null && agent_running=true
    pgrep -qf acsockext 2>/dev/null && filter_running=true
    pgrep -qf "Cisco Secure Client" 2>/dev/null && gui_running=true
 
    if $agent_running || $filter_running; then
        red "Cisco ACTIVE"
    else
        green "Cisco OFF"
    fi
    echo "  vpnagentd:     $($agent_running && echo running || echo stopped)"
    echo "  socket filter: $($filter_running && echo running || echo stopped)"
    echo "  GUI:           $($gui_running && echo running || echo stopped)"
}
 
start() {
    echo "Starting Cisco Secure Client..."
 
    if ! pgrep -q vpnagentd 2>/dev/null; then
        gray "Starting vpnagentd..."
        sudo launchctl enable $CISCO_AGENT 2>/dev/null || true
        sudo /opt/cisco/secureclient/bin/vpnagentd -execv_instance &
        disown 2>/dev/null || true
        sleep 2
    fi
 
    pgrep -qf "Cisco Secure Client" 2>/dev/null || open "$CISCO_APP"
 
    echo ""
    status
}
 
stop() {
    echo "Stopping Cisco Secure Client..."
 
    pkill -f "Cisco Secure Client" 2>/dev/null || true
    pkill -f "Cisco Secure Client - Notification" 2>/dev/null || true
 
    sudo launchctl disable $CISCO_AGENT 2>/dev/null || true
    sudo killall -9 vpnagentd 2>/dev/null || true
 
    if pgrep -qf acsockext 2>/dev/null; then
        gray "Deactivating socket filter..."
        "$CISCO_FILTER_APP/Contents/MacOS/Cisco Secure Client - Socket Filter" \
            -deactivateExt 2>/dev/null || true
        sleep 3
        if pgrep -qf acsockext 2>/dev/null; then
            sudo kill -9 $(pgrep -f acsockext) 2>/dev/null || true
        fi
    fi
 
    sudo dscacheutil -flushcache 2>/dev/null || true
    sudo killall -HUP mDNSResponder 2>/dev/null || true
 
    sleep 1
    echo ""
    status
}
 
case "${1:-status}" in
    on|start)  start ;;
    off|stop)  stop ;;
    status|st) status ;;
    *)
        echo "Usage: $(basename "$0") {on|off|status}"
        exit 1
        ;;
esac

Установка

chmod +x ~/bin/cisco-vpn.sh

Алиасы в ~/.zshrc:

alias work-on='~/bin/cisco-vpn.sh on'
alias work-off='~/bin/cisco-vpn.sh off'
alias work-st='~/bin/cisco-vpn.sh status'

Использование

КомандаДействие
work-onЗапускает vpnagentd + открывает GUI
work-offУбивает всё: GUI, vpnagentd, socket filter. Сбрасывает DNS
work-stПоказывает статус компонентов

launchctl bootout ломает SMAppService

Нельзя использовать launchctl bootout для остановки vpnagentd — после этого kickstart и bootstrap не работают до перезагрузки. Вместо этого: disable + kill для остановки, enable + прямой запуск для старта.

Socket filter не нужен для VPN

Cisco VPN подключается и работает без активного socket filter. Поэтому work-on не активирует его обратно — меньше перехвата трафика на уровне ядра.