OpenVPN i Ubuntu w jednym stali domku

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.

5 komentarzy do “OpenVPN i Ubuntu w jednym stali domku

  1. 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?

  2. 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

  3. 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”

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Proszę dokończyć równanie: * Time limit is exhausted. Please reload CAPTCHA.