Zestawianie wielu VPN z autoryzacją użytkownika - Michał Sternadel Zestawianie wielu VPN z autoryzacją użytkownika

Światło: Zapal | Zgaś

Zestawianie wielu VPN z autoryzacją użytkownika

Dodano: 28.05.2013, 14:21:50

W obecnych czasach sporo osób posiada własne serwery, czy to wirtualne, czy sprzętowe, rozsiane po wielu krajach świata. Wiele osób pracuje w małych przedsiębiorstwach z siecią lokalną i wielu również potrzebuje dostępu do zasobów tej sieci z każdego miejsca, na chwilę, na stałe, awaryjnie, z każdego mądrzejszego urządzenia, jakie ma się pod ręką. Niektóre osoby często również chcą zmienić swój wychodzący adres IP na inny, ulokowany w innym kraju, aby uzyskać dostęp do treści nieosiągalnych na danym terenie. Z pomocą przychodzi serwer oparty o OpenVPN, bardzo elastyczny w konfiguracji, bezpieczny i wspaniale radzący sobie w wielu warunkach. Przykładów konfiguracji w sieci jest wiele, przedstawię również i swój. Konfiguracja pozwoli na obsłużenie wielu użytkowników jednocześnie, autoryzowanych za pośrednictwem loginu i hasła, w miarę potrzeb również na przekazywanie pakietów przez serwer (Zmianę IP wyjściowego na świat).

Załóżmy, że na serwerze, do którego będziemy się łączyć zainstalowany jest system operacyjny Linux z dostępnym już w systemie pakietem OpenVPN w wersji 2 (Dla uproszczenia, przyjmę, że jest to Debian). Konfigurację rozpoczniemy od wygenerowania odpowiednich certyfikatów i kluczy, następnie od utworzenia pliku konfiguracyjnego serwera, niezbędnych skryptów autoryzujących użytkownika oraz samych użytkowników poprzez utworzenie pliku konfiguracyjnego dla klientów.

Kopiujemy easy-rsa w dowolne miejsce - polecam, aby się nie pogubić, umieścić kopię w /etc/openvpn/easy-rsa/:
cp /usr/share/doc/examples/easy-rsa/2.0 /etc/openvpn/easy-rsa/ -R

Następnie przechodzimy do tego katalogu i wykonujemy szereg poleceń:
cd /etc/openvpn/easy-rsa/
source ./vars
./clean-all
./build-ca
(Tutaj wpisujemy kolejno informacje potrzebne do wystawienia certyfikatu, należy zapamiętać wartość "Common Name", dla uproszecznia polecam użyć: vpn-server)
./build-key-server WARTOŚĆ_COMMON_NAME (Tutaj wpisujemy potrzebne informacje do certyfikatu ("A challenge password" zostawiamy puste), a następnie wybieremy "y", aby podpisać certyfikat i potwierdzamy jeszcze na końcu "y". Jeżeli poprzednio, jako "Common Name" wpisano vpn-server, polecenie będzie miało postać: ./build-key-server vpn-server)
./build-dh
openvpn -genkey -secret ./keys/ta.key

Następnie tworzymy katalog /etc/openvpn/keys/ i kopiujemy do niego niezbędne pliki: mkdir /etc/openvpn/keys
cd /etc/openvpn/keys
cp /etc/openvpn/easy-rsa/keys/ca.crt .
cp /etc/openvpn/easy-rsa/keys/COMMON_NAME.{key,crt} .
cp /etc/openvpn/easy-rsa/keys/dh1024.pem .
cp /etc/openvpn/easy-rsa/keys/ta.key .

Tworzymy plik konfiguracyjny serwera o nazwie vpn-server.conf w katalogu /etc/openvpn/:
local IP_ZEWNĘTRZNE_SERWERA
port 1194
proto udp
dev tap
tun-mtu 1500
server 10.119.202.0 255.255.255.0
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/COMMON_NAME.crt
key /etc/openvpn/keys/COMMON_NAME.key
dh /etc/openvpn/keys/dh1024.pem
tls-auth /etc/openvpn/keys/ta.key 0
cipher AES-256-CBC
persist-key
persist-tun
keepalive 5 60
reneg-sec 0
comp-lzo
user nobody
group nogroup
client-to-client
client-config-dir ccd
username-as-common-name
client-cert-not-required
auth-user-pass-verify /etc/openvpn/scripts/login.sh via-env
auth-nocache
max-clients 10
push "persist-key"
push "persist-tun"
ifconfig-pool-persist vpn-ipp.txt
# Przekierowanie całego ruchu przez VPN: push "redirect-gateway def1"
push "explicit-exit-notify 1"
script-security 3
status /var/log/vpn-server.status
log-append /var/log/vpn-openvpn.log
verb 0

Następnie tworzymy niezbędny skrypt autoryzujący użytkowników, o nazwie login.sh w katalogu /etc/openvpn/scripts/ (Tutaj autoryzacja jest oparta na pliku, ale nic nie stoi na przeszkodzie, aby użytkowników trzymać w bazie danych SQL czy w jakimś tam worku):
#!/bin/bash
hash=`echo -n $password|md5sum|awk {'print $1'}`
user_id=$(cat /etc/openvpn/vpn-passwd | grep "$username:$hash" | awk -F":" {'print $1'})
[ "$user_id" != '' ] && [ "$user_id" = "$username" ] && echo "user : $username" && echo 'authentication ok.' && exit 0 || echo 'authentication failed.'; exit 1

Należy jeszcze pamiętać, aby utworzyć jakiegoś użytkownika w pliku /etc/openvpn/vpn-passwd (format: user:md5(hasło)). Można się posłużyć trywialnym skryptem (o nazwie adduser.sh), aby ułatwić sobie pracę:
#!/bin/bash
echo -n "Login: "
read login
echo -n "Password: "
read pass
password=`echo -n "$pass" | md5sum | awk {'print $1'}`
echo $login:$password >> /etc/openvpn/vpn-passwd
echo "OK"

Aby utworzyć użytkownika należy wpisać w konsoli: /etc/openvpn/scripts/adduser.sh oraz podać login i hasło.

Powyższe skrypty zapisujemy w katalogu /etc/openvpn/scripts/ i pamiętamy, aby ustawić odpowiednie uprawnienia zarówno do katalogów jak i do pliku z hasłami: chmod a+r /etc/openvpn/vpn-passwd
chmod o-r /etc/openvpn/keys -R
chmod a+r,a+x /etc/openvpn/scripts -R

Możemy przystąpić do konfiguracji po stronie klienta. Tworzymy plik tekstowy o następującej zawartości:
client
dev tap
proto udp
remote IP_ZEWNĘTRZNE_SERWERA 1194
nobind
persist-key
persist-tun
cipher AES-256-CBC
auth-user-pass
reneg-sec 14400
auth-nocache
comp-lzo
tun-mtu 1500
script-security 3
remote-cert-tls server
ca [inline]
tls-auth [inline] 1

ZAWARTOŚĆ PLIKU ca.crt


ZAWARTOŚĆ PLIKU ta.key

Jeżeli przerzucamy cały ruch przez nasz serwer VPN należy jeszcze pamiętać o odpowiedniej konfiguracji firewalla i przełączania pakietów:
echo "1" > /proc/sys/net/ipv4/ip_forward
iptables -A FORWARD -i eth0 -o tap0 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -s 110.119.202.0/24 -o eth0 -j ACCEPT
iptables -t nat -A POSTROUTING -s 10.119.202.0/24 ! -d 10.119.202.0/24 -o eth0 -j MASQUERADE

Możemy uruchomić już nasz serwer VPN (dla testów: openvpn -config /etc/openvpn/vpn-server.conf) i połączyć się wpisując openvpn -config vpn-server-client.ovpn. W przypadku, gdy wszystko okaże się działające możemy zautomatyzować start, zmieniając odpowiednie wpisy w pliku /etc/default/openvpn.

Jeżeli z jakichś powodów chcemy routować ruch tylko niektórym użytkownikom, należy w katalogu /etc/openvpn/ccd utworzyć plik Nazwa_użytkownika i zawrzeć w nim odpowiednie opcje konfiguracyjne: push "redirect-gateway def1", pamiętając, aby usunąć tą opcję w konfigu głównym. Dzięki dodatkowym plikom konfiguracyjnym można również powiedzieć, że klient może trasować pakiety do swojej lokalnej sieci lub w dowolną sieć. Możliwości jest pełno, zapraszam do eksperymentowania.

W załączeniu znajduje się gotowa konfiguracja z użytkownikiem guest i hasłem guest, powinna zadziałać w większości przypadków, ale zalecam do utworzenia własnej konfiguracji.

Dodane załączniki:
  1. vpn-server.tar.gz (5.3 KB)
  2. vpn-server-client.ovpn (2.3 KB)

Dodaj komentarz
Komentarze (4)
Publikowane komentarze są prywatnymi opiniami użytkowników witryny Michała Sternadela. Witryna Michała Sternadela nie ponosi odpowiedzialności za treść tych opinii.
#4
Data utworzenia:14.10.2016, 16:23:04
Tytuł:DNSMasq
Autor:Michał Sternadel
Treść:Można spróbować użyć DNSMasq i podać mu w konfiguracji wygenerowany plik hosts na podstawie ipp.txt: cat /etc/openvpn/ipp.txt |awk -F',' {'print $2 " " $1'} >/etc/openvpn/hosts Uruchamiać przez: dnsmasq -H /etc/openvpn/hosts (...) Pozdrawiam.
#3
Data utworzenia:09.10.2016, 12:34:56
Tytuł:rozwiązywanie nazw
Autor:Lukasz
Treść:Masz jakiś sprawdzony sposób na rozwiązywanie nazw hostów wykorzystując do tego np plik ipp.txt ?
#2
Data utworzenia:11.01.2015, 13:29:30
Tytuł:U mnieniestety nie dziala
Autor:Maciej Ziemirski
Treść:Po wpisaniu polecenia "iptables -A FORWARD -i eth0 -o tap0 -m state -state ESTABLISHED,RELATED -j ACCEPT" wywala komunikat ze niema takiego polecenia i i nie można się połączyć z serwerem. Debian 7 x64
#1
Data utworzenia:27.12.2013, 10:33:57
Tytuł:Działa
Autor:ZigZag
Treść:To działa! Dzięki.

1

Szybki kontakt:

Pozostaw zółtą karteczkę-wlepkę pod adresem:
Kraków, ul. Pawia 3 z id: #776AFFDA# oraz wiadomością. Jak nie zginie -- odczytam.

Ostatnie fotografie


Paproć
Paproć

Grzyb
Grzyb

  Więcej...