21 marca 2015 blog raspberry openvpn
Oczywiście przed instalacją musimy mieć dostęp do serwera OpenVPN.
Instalujemy potrzebne pakiety:
sudo aptitude install openvpn
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
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
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
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 $*
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.
Jak skonfigurować klienta bittorrent można przeczytać w tym wpisie. Na końcu jest opis, jak uruchamiać go przy uruchamianiu tunelu OpenVPN.