21 marca 2015 blog raspberry openvpn

Jak zainstalować i skonfigurować OpenVPN? Jak uzyskać dostęp z zewnątrz do Raspberry przy uruchomionym VPN? Jak skorzystać z kilkugodzinnego darmowego dostępu do VPN?

Instalacja OpenVPN

Oczywiście przed instalacją musimy mieć dostęp do serwera OpenVPN.

Instalujemy potrzebne pakiety:

sudo aptitude install openvpn

Konfiguracja

Od dostawcy VPN otrzymujemy zestaw plików (bądź tylko jeden plik, zależy od serwera). Prawdopodobnie jeden z nich ma rozszerzenie .ovpn. Jeśli tak jest, należy je zmienić na .conf. Następnie wszystkie pliki kopiujemy do /etc/openvpn.

Klient VPN wyszukuje we wskazanym katalogu plików z rozszerzeniem .conf i używa ich jako konfiguracji.

Automatyczne uruchamianie przy starcie systemu:

sudo update-rc.d openvpn enable

Konfiguracja zaawansowana

Często w pliku konfiguracyjnym jest odwołanie do skryptu, który zostaje uruchomiony po starcie lub przed lub zamknięciu usługi. Jeśli nie ma, można je dopisać.

script-security 3 system
up "/etc/openvpn/script.sh up"
down "/etc/openvpn/script.sh down"

Przykładowa zawartość skryptu:

#! /usr/bin/env bash

case "$1" in
	up) export action="up" ;;
	pre-down) export action="down" ;;
	down) export action="down" ;;
	*) echo "No action specified." && exit 1 ;;
esac

if [ "$action" = "up" ]; then
   mv /etc/resolv.conf /etc/resolv.conf.bak
   echo 'nameserver 8.8.8.8' > /etc/resolv.conf
fi

if [ "$action" = "down" ]; then
   mv /etc/resolv.conf.bak /etc/resolv.conf
fi

Dostęp z zewnątrz (opcjonalnie)

Po uruchomieniu OpenVPN, tracimy możliwość połączenia się do naszej maszyny z zewnątrz. Dzieje się tak dlatego, że cały ruch wychodzący jest wysyłany do serwera VPN, a cały przychodzący, o ile nie pochodzi od serwera VPN, ignorowany.

Można na to wpłynąć dodając wpis do tablicy routingu.

Dopisujemy na końcu /etc/openvpn/script.sh (lub dowolnego skryptu, który jest uruchamiany przez konfigurację):

/etc/openvpn/available-from-wan.sh $1

Wklejamy zawartość do /etc/openvpn/available-from-wan.sh:

#! /usr/bin/env bash

addRoute() {
	local device=$1

	l1=`ip route show | grep $device | head -n 1`
	l2=`ip route show | grep $device | tail -n 1`

	mask=${l2/ *}
	mask=${mask// }
	gateway=${l1/*via }
	gateway=${gateway/ dev*}
	gateway=${gateway// }
	ip=${l2/*src }
	ip=${ip// }
	dev=${l1/*dev }
	dev=${dev// }

	echo "ip rule add:: dev: $dev, ip: $ip, mask: $mask, gateway: $gateway"

	ip rule add from "$ip" table 128
	ip route add table 128 to $mask dev $dev
	ip route add table 128 default via $gateway

	# check it: ip route show; ip rule show; ip route show table 128
}

delRoute() {
	local device=$1

	l2=`ip route show | grep $device | tail -n 1`

	ip=${l2/*src }
	ip=${ip// }

	echo "ip rule del:: ip: $ip"
	ip rule del from "$ip"
	ip route flush table 128
}

interfaces() {
	# tap0 -- state UNKNOWN
	ip link show | grep BROADCAST | \
		grep -v NO-CARRIER | grep -v 'state DOWN' | \
		grep -v tap | grep -v tun | grep -v 'NOARP' | \
		grep ',UP' | \
		while read l; do
			l=${l/: <*}
			l=${l/*: }
			echo "$l"
		done
}

interfaces_list=`interfaces`
action=$1

if [[ "" == "$interfaces_list" ]]; then
	echo 'no lan interfaces' >&2
else
	for i in $interfaces_list ; do
		if [ "$action" = "up" ]; then
			addRoute $i
		elif [ "$action" = "down" ]; then
			delRoute $i
		fi
	done
fi

Przykład

Kilku dostawców usług VPN umożliwia dostęp testowy. Jednym z nich jest Mullvad.

Otwieramy stronę i przepisujemy kod CAPTCHA. Dostajemy 3 godziny na testy usługi. Ściągamy paczkę z plikami konfiguracyjnymi.

Rozpakowujemy i kopiujemy do /etc/openvpn.

ca.crt
crl.pem
mullvad.crt
mullvad.key
mullvad_linux.conf
mullvad_windows.conf.ovpn

Uruchamiamy daemon OpenVPN:

/etc/init.d/openvpn start

I niestety:

[FAIL] Starting virtual private network daemon: mullvad_linux failed!

Zaglądamy do logów:

grep ovpn-mullvad_linux /var/log/daemon.log

I widzimy:

Mar 21 19:35:26 pi2 ovpn-mullvad_linux[1548]: OpenVPN 2.2.1 arm-linux-gnueabihf [SSL] [LZO2] [EPOLL] [PKCS11] [eurephia] [MH] [PF_INET6] [IPv6 payload 20110424-2 (2.2RC2)] built on Dec  1 2014
Mar 21 19:35:26 pi2 ovpn-mullvad_linux[1548]: NOTE: the current --script-security setting may allow this configuration to call user-defined scripts
Mar 21 19:35:26 pi2 ovpn-mullvad_linux[1548]: WARNING: file 'mullvad.key' is group or others accessible
Mar 21 19:35:26 pi2 ovpn-mullvad_linux[1548]: Problem with cipher list: TLS-DHE-RSA-WITH-AES-256-CBC-SHA:TLS-DHE-RSA-WITH-CAMELLIA-256-CBC-SHA:TLS-DHE-RSA-WITH-3DES-EDE-CBC-SHA:TLS-DHE-RSA-WITH-AES-128-CBC-SHA:TLS-DHE-RSA-WITH-SEED-CBC-SHA:TLS-DHE-RSA-WITH-CAMELLIA-128-CBC-SHA: error:1410D0B9:SSL routines:SSL_CTX_set_cipher_list:no cipher match
Mar 21 19:35:26 pi2 ovpn-mullvad_linux[1548]: Exiting

Edytujemy mullvad_linux.conf i usuwamy ostatnią linijkę, rozpoczynającą się od tls-cipher. Jeśli nie używamy IPv6, możemy też usunąć tun-ipv6.

Po restarcie powinno być już OK:

/etc/init.d/openvpn start
[ ok ] Starting virtual private network daemon: mullvad_linux.

Dla pewności sprawdzamy zewnętrzny adres IP:

curl https://devsite.pl/tools/ip.php

Teraz skofigurujemy dostęp z zewnątrz. Edytujemy mullvad_linux.conf zmieniając:

up /etc/openvpn/update-resolv-conf
down /etc/openvpn/update-resolv-conf

na

up "/etc/openvpn/script.sh up"
down "/etc/openvpn/script.sh down"

Upewniamy się, że skopiowaliśmy /etc/openvpn/available-from-wan.sh z poprzedniego punktu.

Edytujemy /etc/openvpn/script.sh:

#! /usr/bin/env sh
/etc/openvpn/update-resolv-conf
/etc/openvpn/available-from-wan.sh $*

Wskazówki

Klienta OpenVPN można uruchomić bezpośrednio z linii komend, niekoniecznie jako usługę systemową:

openvpn --config mullvad_linux.conf

Wszystkie komunikaty będą wyświetlane w konsoli, łatwiej dzięki temu odnaleźć i naprawić błąd.

Torrent

Jak skonfigurować klienta bittorrent można przeczytać w tym wpisie. Na końcu jest opis, jak uruchamiać go przy uruchamianiu tunelu OpenVPN.

Linki