절전/최대 절전 모드 후에 VPN 연결을 재개하도록 Network Manager를 어떻게 설정합니까?

절전/최대 절전 모드 후에 VPN 연결을 재개하도록 Network Manager를 어떻게 설정합니까?

Wireguard(이 경우 Wireguard)가 설치된 데스크톱에서 VPN 연결을 사용하는 경우 NetworkManager시스템이 최대 절전 모드 또는 일시 중지 후 다시 온라인 상태가 되면 VPN 연결이 재개되지 않습니다. (OpenVPN 및 기타 VPN 프로토콜도 영향을 받습니다.)

자동 연결을 활성화하는 기능이 있지만 이는 영구 VPN 터널을 위한 것입니다. 여기서 요구 사항은 일시 중지/최대 절전 모드 후에 모든 활성 터널을 다시 연결하는 것입니다.

절전 또는 최대 절전 모드 작업 후 기존 VPN 연결을 자동으로 복원하려면 어떻게 해야 합니까?

답변1

WireGuard와 Openvpn의 답변은 다릅니다. 즉, NetworkManager는 Openvpn을 NetworkManager VPN 플러그인으로 구현하는 반면 WireGuard는 데몬에 의해 직접(기본적으로) 구현되기 때문입니다.

NetworkManager에는 프로파일을 자동으로 연결하는 두 가지 메커니즘이 있습니다. 하나는 connection.autoconnect설정이고, 하나는 connection.secondaries기본 프로필이 활성화될 때 보조 프로필이 활성화되는 곳입니다. 현재 WireGuard, 이더넷, Wi-Fi와 같은 기본 유형만 지원되는 connection.autoconnet반면, VPN 플러그인은 현재 지원 실행으로만 구현됩니다. 이러한 차이가 발생하는 이유는 기능이 없기 때문입니다.

시스템이 절전 모드로 전환되면 NetworkManager는 먼저 장치 연결을 끊습니다. 절전 모드에서 돌아오면 적절한 프로필 및 장치에 자동으로 연결되기 시작합니다.

이 질문에서는 왜 이 두 가지 메커니즘이 작동하지 않는지 명확하지 않습니다. 자동으로 연결되도록 프로필을 구성했습니까? 이력서에는 어떤 일이 발생하나요? 항상 그렇듯이 데몬이 수행하는 작업을 정확히 알고 싶다면 디버그 로깅을 활성화하고 로그를 검사하세요.

제공된 자동화가 적합하지 않은 경우 프로필을 활성화하는 스크립트를 작성할 수도 있습니다. 그러나 이것은 불필요해 보입니다(왜 자동으로 작동하지 않는지 먼저 이해하지 못한 채).

답변2

Wireguard는 상태 비저장이며 절전/최대 절전 모드 작업 후에 VPN 연결이 유지되어야 하지만 데스크톱 구현에서는 NetworkManager가 절전/최대 절전 모드에서 모든 연결을 끊기 때문에 Wireguard의 상태 비저장 기능이 손실됩니다. 여기에는 복원할 자동 bash 스크립트 정의 설정이 있습니다. 이 기능은 OpenVPN과 같은 다른 VPN 시스템에서도 사용할 수 있습니다. 이는 KDE의 맥락에서 설명되지만 다른 데스크탑 환경에서도 쉽게 사용할 수 있습니다.

절전/최대 절전 모드 후 VPN 연결 복원(사용하는 경우)

특징:

  • 현재 IP 표시
  • WAN IP가 변경되면 경고
  • 잠자리에 들기 전에 VPN을 사용했다면 VPN에 다시 연결하세요.

설정:

  1. 먼저 KDE에서는 위젯을 사용합니다.명령 출력15초마다 "sh Ip.Vpn.Watcher.sh"를 실행하도록 위젯을 설정합니다(IP 변경을 모니터링 및 알리고, 현재 IP를 표시하며, 현재 사용되는 네트워크를 에 저장합니다 /tmp/used-conn).
  2. suspend-vpnSystemd는 sleep/hibernate: 후에 스크립트를 실행하도록 구성되었습니다./usr/lib/systemd/system-sleep/
  3. suspend-vpn방아쇠Wait.Network.And.Restore.VPN.sh

그게 다야 :)

**Ip.Vpn.Watcher.sh**
#!/bin/bash

wget -q http://internet.adress.that.return.myip.in.text/ip.php -O /tmp/ip --force-clobber

ip=$( cat /tmp/ip )
wantedip=$( cat /tmp/ip-old )

if [[ $ip = $wantedip ]]
then
    echo $ip
    nmcli --fields name connection show --active | tail -n +2 | head -n 1 > /tmp/used-conn
else
    if [[ $ip != "" ]]
    then
        echo $ip
        zenity --warning --title="VPN Watcher" --width=250 --text="\nWARNING : Wan IP Changed !"
        nmcli --fields name connection show --active | tail -n +2 | head -n 1 > /tmp/used-conn
        cp -f /tmp/ip /tmp/ip-old
    else
        echo $ip
        zenity --warning --title="VPN Watcher" --width=250 --text="\nWARNING : Wan Connection Gone !"
        cp -f /tmp/ip /tmp/ip-old
    fi
fi
**suspend-vpn**
#!/bin/bash

# $1 values ('pre' or 'post')
# $2 values ('suspend', 'hibernate', or 'hybrid-sleep')
# case "$1/$2" in

case $1 in
    pre)
        # Save connection state
        # Too late for this network is already gone... 
        # Implemented via check ip (plasmoid)
        # nmcli --fields name connection show --active | tail -n +2 | head -n 1 > /tmp/used-conn
    ;;
    post)
        # Restore connection 
        su username -c "export DISPLAY=:0; export XDG_RUNTIME_DIR='/run/user/2000'; /scripts/location/Wait.Network.And.Restore.VPN.sh &"
    ;;
esac
**Wait.Network.And.Restore.VPN.sh**
#!/bin/bash

timer=1
conn=$( cat /tmp/used-conn )

printf "%s" "Waiting For Online State ..."

while ! ping -c 1 -n -w 1 8.8.8.8 &> /dev/null
do
    printf "%c" "."
    sleep 1
    let "timer++"
    
    if [[ ( $timer -ge 300 ) ]] ; then
        printf "\n%s\n"  "Script Timeout"
        exit
    fi
    
done

printf "\n%s\n"  "Network Is Online"

if [[ $conn == VPNCONNECTIONAME* ]] || [[ $conn == VPNCONNECTIONAME2* ]] 
then
    # Need to wait network to be up 
    sleep 5
    nmcli connection up $conn
fi

관련 정보