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/
(Tutaj wpisujemy kolejno informacje potrzebne do wystawienia certyfikatu, należy zapamiętać wartość "Common Name", dla uproszecznia polecam użyć: vpn-server)
source ./vars
./clean-all
./build-ca
./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.
Publikowane komentarze są prywatnymi opiniami użytkowników witryny Michała Sternadela. Witryna Michała Sternadela nie ponosi odpowiedzialności za treść tych opinii.
|