Настройка NordVPN на Linux

NordVPN не предлагает автоматическую настройку для Linux, только файлы конфигурации VPN. Каков наилучший способ реализовать это?

(моя собственная реализация ниже, пожалуйста, не стесняйтесь комментировать или предлагать улучшения!)

РЕДАКТИРОВАТЬ: Когда я писал это, я не знал, что NordVPN представил инструмент командной строки для Linux недавно.


person maddingl    schedule 02.11.2018    source источник


Ответы (1)


Я написал небольшой скрипт, который загружает файлы конфигурации, переименовывает их и включает автоматическую аутентификацию. Вставьте свои учетные данные для входа в NordVPN в часть generate authentification file.

#!/bin/bash
# run as root!!!

# install openvpn. I'm running arch, this might be different on your system.
pacman -S openvpn

# go to openvpn config folder
cd /etc/openvpn

# download config files, extract and clean up
wget https://downloads.nordcdn.com/configs/archives/servers/ovpn.zip
unzip ovpn.zip
rm ovpn.zip

# rename tcp config files and put them in /etc/openvpn/client
cd ovpn_tcp
for file in *; do mv "${file}" "${file/.nordvpn.com.tcp.ovpn/}tcp.conf"; done
cp * ../client

# rename udp config files and put them in /etc/openvpn/client
cd ../ovpn_udp
for file in *; do mv "${file}" "${file/.nordvpn.com.udp.ovpn/}udp.conf"; done
cp * ../client

# generate authentification file
cd ../client
printf "<your email>\n<your password>" > auth.txt

# make all configs use authentification file
find . -name '*.conf' -exec sed -i -e 's/auth-user-pass/auth-user-pass\ auth.txt/g' {} \;

# clean up
cd ..
rm -r ovpn_tcp/
rm -r ovpn_udp

Теперь вы можете запускать и останавливать vpn-соединения, например, через

systemctl start [email protected]

а также

systemctl stop [email protected]

Чтобы автоматизировать это и подключиться к серверу, рекомендованному NordVPN, я написал два скрипта. Сделайте их исполняемыми и поместите куда-нибудь в свой $PATH. Передайте код страны (например, us, de или uk) в качестве аргумента командной строки для start-vpn, если вы хотите выбрать конкретную страну. Он автоматически выбирает соединение tcp. Вы можете изменить это на udp, если хотите.

start-vpn

#!/usr/bin/python
import sys

import requests
import os
import time

# you don't necessarily need the following. It's for monitoring via i3blocks.

def notify_i3blocks():
    os.system('pkill -RTMIN+12 i3blocks')


def fork_and_continue_notifying_in_background():
    newpid = os.fork()
    if newpid == 0:  # if this is the child process
        for i in range(60):
            notify_i3blocks()
            time.sleep(1)


if __name__ == '__main__':

    notify_i3blocks()

    # below is what you do need.

    suffix = ''
    if len(sys.argv) > 1:
        countries = requests.get('https://nordvpn.com/wp-admin/admin-ajax.php?action=servers_countries').json()
        for country in countries:
            if country["code"].lower() == sys.argv[1].lower():
                suffix = '&filters={"country_id":' + str(country["id"]) + '}'

    result = requests.get('https://nordvpn.com/wp-admin/admin-ajax.php?action=servers_recommendations' + suffix)
    profile = result.json()[0]['subdomain'] + 'tcp'

    command = 'systemctl start openvpn-client@' + profile + '.service'

    os.system(command)

    # the following is for i3blocks again.        

    fork_and_continue_notifying_in_background()

stop-vpn

#!/bin/bash

function service {
    systemctl |
    grep openvpn |
    grep running |
    head -n1 |
    awk '{print $1;}'
}

while [[ $(service) ]]; do
    systemctl stop $(service)
done

# notify i3blocks
pkill -RTMIN+12 i3blocks

Для удобства у меня есть два псевдонима в моем ~/.bashrc:

alias start-vpn='sudo start-vpn'
alias stop-vpn='sudo stop-vpn'

если вы хотите отслеживать его через i3blocks, поместите это в свою конфигурацию i3blocks:

[vpn]
interval=once
signal=12

и это в вашем каталоге i3blocks-scripts (с именем vpn):

#!/bin/bash

function name {
    systemctl |
    grep openvpn |
    grep running |
    head -n1 |
    awk '{print $1;}' |
    cut -d @ -f 2 |
    cut -d . -f 1
}

starting=$(pgrep -f start-vpn) # this might not be the most accurate, but it works for me. Improvement suggestions are welcomed.

if [[ $(name) ]]; then
    echo $(name)
    echo && echo "#00FF00"
else
    if [[ ${starting} ]]; then
        echo starting vpn...
        echo && echo "#FFFF00"
    else
        echo no vpn
        echo && echo "#FF0000"
    fi
fi

Чтобы автоматически запускать и останавливать vpn при включении/отключении сетевого интерфейса, введите следующее в /etc/NetworkManager/dispatcher.d/10-openvpn. Чтобы активировать функцию, вам нужно enable и start NetworkManager-dispatcher.service. Подробнее здесь.

В моем университете я подключаюсь к eduroam, который не разрешает vpn. Вот почему я это исключаю.

/etc/NetworkManager/dispatcher.d/10-openvpn

#!/bin/bash

case "$2" in
    up)
        if ! nmcli -t connection | grep eduroam | grep wlp3s0 ; then
            start-vpn
        fi
        ;;
    down)
        stop-vpn
        ;;
esac

Я надеюсь, что это поможет другим людям, которые хотят использовать NordVPN в Linux. Опять же, не стесняйтесь комментировать и предлагать улучшения. В частности, я не уверен, насколько большой риск для безопасности представляет собой запись пароля NordVPN в виде простого текста в файл.

person maddingl    schedule 02.11.2018