OpenVPN jest jednym z popularniejszych darmowych VPNów. Konfiguracja jego jest z jednej strony prosta, a z drugiej – cóż, zawsze się o czymś zapomni a później kombinowanie jak to naprawić…
Dlatego też opiszę jak zrobić VPN z wyjściem na świat. Klientem w moim przypadku jest Ubuntu, ale klient jest najmniej ważny. Ważniejszy jest serwer, na którym również jest Ubuntu (w wersji 14.04, ale 12.04 też działa poprawnie).
1. Zakładam, że system jest aktualny, a ja tylko pokazuję co zainstalować.
2. Używam VIM, jako edytora tekstowego. Można go zastąpić przez „ee” lub co się lubi.
Podstawowa konfiguracja
Wszystkie komendy wydajemy z poziomu administratora (root), więc albo przed każdą komendą dodajemy sudo komenda
lub wpisujemy sudo su -
i przechodzimy na administratora
apt-get install openvpn easy-rsa
mkdir /etc/openvpn/easy-rsa/
cp -r /usr/share/easy-rsa/* /etc/openvpn/easy-rsa/
Krok opcjonalny!
vim /etc/openvpn/easy-rsa/vars
Tutaj wprowadzamy, domyślne zmienne dla kluczy. Jeśli zostawimy domyślne – też będzie działać.
cd /etc/openvpn/easy-rsa/
source vars
./clean-all
./build-ca
Certyfikaty serwera:
./build-key-server myservername
./build-dh
cd keys/
cp myservername.crt myservername.key ca.crt dh2048.pem /etc/openvpn/
Certyfikaty dla klienta (jeśli mamy więcej te kroki wykonujemy dla każdego klienta)
cd /etc/openvpn/easy-rsa/
source vars
./build-key client1
Interesują nas pliki:
/etc/openvpn/ca.crt
/etc/openvpn/easy-rsa/keys/client1.crt
/etc/openvpn/easy-rsa/keys/client1.key
Należy je skopiować w bezpieczny sposób do klienta (np za pomocą scp).
Podstawowa konfiguracja serwera:
Powinniśmy mieć podstawowe pliki konfiguracyjne:
ls -l /usr/share/doc/openvpn/examples/sample-config-files/
I powinniśmy zobaczyć coś takiego:
total 68
-rw-r--r-- 1 root root 3427 Feb 4 2014 client.conf
..........
-rw-r--r-- 1 root root 4141 Feb 4 2014 server.conf.gz
..........
Kopiujemy i modyfikujemy co potrzeba.
cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/
gzip -d /etc/openvpn/server.conf.gz
vim etc/openvpn/server.conf
Należy sprawdzić czy nazwy plików (i ścieżki – jeśli zostały zmienione) są poprawne:
ca ca.crt
cert myservername.crt
key myservername.key
dh dh2048.pem
push "redirect-gateway def1 bypass-dhcp"
Powinno być odkomentowane (usunięty ; z początku linii)
service openvpn start
ifconfig tun0
powinniśmy otrzymać:
tun0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
inet addr:10.8.0.1 P-t-P:10.8.0.2 Mask:255.255.255.255
Plus trochę innych dodatkowych informacji. W każdym bądź razie, „tun0” musi być stworzony.
Teraz teoretycznie działa nam VPN i powinna być już możliwość z nim się połączyć. Jednak nie działa jeszcze „wyjście/wejście” – czyli nie możemy się maskować. Do tego jest kilka szkół, ja wykorzystuję „iptables”.
vim /etc/sysctl.conf
należy odkomentować tą linię:
net.ipv4.ip_forward=1
Następnie:
echo 1 > /proc/sys/net/ipv4/ip_forward
Aktualizujemy wpis w „iptables”
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -s 10.8.0.0/24 -j ACCEPT
iptables -A FORWARD -j REJECT
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
Teraz wrzucamy do konsoli i do pliku rc.local (lub po skończonej konfiguracji robimy:
iptables-save > iptables.fw
i w pliku rc.local:
/sbin/iptables-restore < /root/iptables.fw
Oczywiście przed "exit 0"
Ostatnim korkiem jest restart usługi service openvpn restart
Po połączeniu do VPN już wszystko działa jak należy.
echo 1 > /proc/sys/net/ipv4/ip_forward
wrzucamy do konsoli, czy dodajemy do pliku sysctl.conf?
Łączę się poprawnie, ale nie mogę wyjść na adresy wewnętrzne albo zewnętrzne. W statystyce połączenia mam 0 bajtów przychodzących (server postawiony na ubuntu 14.04, klient openvpn android).
echo 1 > /proc/sys/net/ipv4/ip_forward
Dodajemy do pliku /etc/sysctl.conf
Ten wpis ma zapewnić w momencie restartu poprawność działania. Jeśli go wrzucisz w konsolę powinno działać od razu do restartu systemu.
Powiem Ci, że „czemu nie działa na zewnątrz” to temat rzeka. Możliwe, że działa – ale problemem jest np DNS próbowałeś ping IP?
W moim przypadku okazało się, że za brak wyjścia do internetu i sieci LAN odpowiadał routing. Po wprowadzeniu poniższego, problem został rozwiązany (może komuś się przyda):
#
#forwardowanie pakietow
iptables -F
iptables -A INPUT -i tap0 -j ACCEPT
iptables -A FORWARD -o tap0 -j ACCEPT
#otwieranie portow dla serwera i klienta openvpn
iptables -A INPUT -p tcp -m state –state NEW -m tcp –dport 5000 -j ACCEPT #openvpn
iptables -A INPUT -p udp -m state –state NEW -m udp –dport 5000 -j ACCEPT #openvpn
#routing dla adresu ip klienta
iptables -t nat -A POSTROUTING -s 10.8.0.2/255.255.255.0 -j MASQUERADE
iptables -A FORWARD -s 10.8.0.2/255.255.255.0 -j ACCEPT
#10.8.0.0 adresy ip sieci wirtualnej klient-server vpn
#
W konfiguracji serwera posiłkowałem się powyższym pomocnikiem Grzegorza – bardzo dziękuję, jest świetny.
Dodatkowo wygenerowałem klucz ta.key
Mam jeszcze kłopot z forwardowaniem pakietów po restarcie komputera. Gdzie umieszczamy te wpisy, w rc.local?
iptables-save > iptables.fw
/sbin/iptables-restore < /root/iptables.fw
plus całą konfigurację iptables
Przed „exit 0”. A czy będzie to pierwszy czy ostatni – nie ma znaczenia, ważne tylko aby było przed „exit 0”