Jak uruchomić skrypt po udanym połączeniu OpenVPN?

50

Jak mogę powiązać skrypt z OpenVPN, aby działał po pomyślnym połączeniu VPN?

Oxwivi
źródło
Chyba w przypadku klienta? Z jakiego oprogramowania korzystasz? OpenVPN, czy opakowanie (np. NetworkManager)?
Lekensteyn
@Lekensteyn, opakowanie network-manger-openvpn.
Oxwivi

Odpowiedzi:

62

network-manager-openvpnnie zapewnia takiej funkcjonalności, musisz użyć openvpnbezpośrednio.

Przejdź --script-security 2 --up /path/to/your/scriptdo niego podczas łączenia. Jeśli używasz pliku konfiguracyjnego znajdującego się w /etc/openvpn/, dodaj kolejne wiersze do pliku konfiguracyjnego:

script-security 2
# run /etc/openvpn/up.sh when the connection is set up
up /etc/openvpn/up.sh

Ze strony OpenVPN :

--script-poziom bezpieczeństwa [metoda]
              Niniejsza dyrektywa oferuje kontrolę na poziomie polityki nad wykorzystaniem OpenVPN
              zewnętrznych programów i skryptów. Wartości niższego poziomu są większe
              restrykcyjne, wyższe wartości są bardziej liberalne. Ustawienia dla
              poziom:

              0 - Całkowicie brak wywoływania programów zewnętrznych.
              1 - (Domyślnie) Wywołaj tylko wbudowane pliki wykonywalne, takie jak ifconfig,
              ip, route lub netsh.
              2 - Zezwól na wywoływanie wbudowanych plików wykonywalnych i zdefiniowanych przez użytkownika
              skrypty.
              3 - Zezwól na przekazywanie haseł do skryptów za pośrednictwem środowiska
              zmienne (potencjalnie niebezpieczne).
       --up cmd
              Polecenie powłoki do uruchomienia po pomyślnym otwarciu urządzenia TUN / TAP (wcześniej
              - zmiana identyfikatora użytkownika). Skrypt up jest przydatny do określania
              polecenia trasujące, które kierują ruch IP przeznaczony do prywatnego
              podsieci, które istnieją na drugim końcu połączenia VPN z
              tunel.
Kolejność wykonywania skryptów
       --up Wykonane po powiązaniu gniazda TCP / UDP i otwarciu TUN / TAP.
       - down Wykonane po zamknięciu TCP / UDP i TUN / TAP.

Istnieje więcej zdarzeń do wykonania skryptu, które można znaleźć na stronie podręcznika .

Utwórz /etc/openvpn/up.shi nadaj mu uprawnienia do wykonywania (powiedzmy 755 lub 700). Przykładowa treść dodawania adresu IPv6 i trasy (wyświetlana w celach edukacyjnych, nie kopiuj go bezpośrednio):

#!/bin/sh
# add an IPv6 address to device $dev (environment variable)
ip -6 addr add 2001:db8::1:2/112 dev $dev
# and the IPv6 route for this net using gateway 2001:db8::1
ip -6 route add 2001:db8::1:0/112 via 2001:db8::1 dev $dev

Zauważ, że ten upskrypt jest uruchamiany jako root. Jeśli nie określiłeś ustawienia Useri Group, OpenVPN będzie uruchamiał skrypty jak downroot.

Lekensteyn
źródło
Jeśli nie wiesz, jak bezpośrednio korzystać z openvpn, dodaj bieżące szczegóły konfiguracji: typ połączenia (np. Certyfikaty X509), port bramy, kompresja LZO, siła TCP, użycie urządzenia zaczepowego, szyfru, HMAC i TLS. Wspomnij również o ustawieniach IP, jeśli nie są one automatyczne. Aby zachować prywatność, pomiń swoje rzeczywiste adresy.
Lekensteyn
Okej, zdecydowałem się użyć OpenVPN bezpośrednio (i tak, mam plik .conf), ale czy automatycznie połączy się ponownie, jeśli połączenie zostanie utracone? I jak sprawić, by łączył się automatycznie, gdy istnieje połączenie z Internetem? I w końcu nie zrozumiałem, gdzie muszę dodać wiersze, o których wspomniałeś w odpowiedzi.
Oxwivi,
Rozszerzyłem odpowiedź do openvpnbezpośredniego użycia . Podczas konfigurowania serwera zauważyłem, że OpenVPN będzie próbował połączyć się ponownie, gdy serwer ulegnie awarii. Nie jestem pewien, czy OpenVPN nadal próbuje, gdy twój interfejs sieciowy przestaje działać.
Lekensteyn,
Mój problem nie dotyczy awarii interfejsu sieciowego - próbuje się połączyć ponownie, gdy połączenie internetowe zostanie utracone i odzyskane. Chcę tylko połączyć się z VPN za każdym razem, gdy otrzymam połączenie z Internetem.
Oxwivi,
Aha, czy skrypt dotyczy wszystkich połączeń VPN? I proszę otagować @Oxwivi, odpowiadając, nie otrzymam powiadomienia inaczej.
Oxwivi,
5

Na pytanie: „W jaki sposób mogę powiązać skrypt z OpenVPN, aby działał, gdy VPN jest prawidłowo podłączony?” Chcę podkreślić, że Lekensteyn udzielił doskonałej odpowiedzi . Ale w chwili, gdy jego odpowiedź była skomponowana, brakowało niejasności co do tego, w jaki sposób należy podać argumenty wiersza poleceń openvpn, aby uruchomić openvpn na maszynie z Ubuntu, szczególnie, aby działał tak samo po ponownym uruchomieniu.


Argumenty wiersza polecenia Openvpn w systemie Ubuntu:

Oczywiście openvpn można uruchomić z wiersza poleceń z dowolnymi dostępnymi opcjami prawnymi. Ale na komputerze Ubuntu, jeśli ktoś chce uruchomić openvpn z tymi samymi argumentami wiersza poleceń po ponownym uruchomieniu, powinien rozważyć edycję pliku /etc/default/openvpn. Sprawdź następujące linie:

# Optional arguments to openvpn's command line
OPTARGS="" 

Ze strony podręcznika społeczności openvpn na--script-security

- poziom bezpieczeństwa skryptu
    Niniejsza dyrektywa oferuje kontrolę na poziomie polityki nad wykorzystaniem zewnętrznych źródeł przez OpenVPN 
    programy i skrypty. Wartości niższego poziomu są bardziej restrykcyjne, wyższe
    wartości są bardziej liberalne. Ustawienia dla poziomu:
0 - Całkowicie brak wywoływania programów zewnętrznych. 
1 - (Domyślnie) Wywołaj tylko wbudowane pliki wykonywalne, takie jak ifconfig, ip, route,
lub netsh. 
2 - Zezwól na wywoływanie wbudowanych plików wykonywalnych i skryptów zdefiniowanych przez użytkownika. 
3 - Zezwól na przekazywanie haseł do skryptów za pomocą zmiennych środowiskowych
(potencjalnie niebezpieczne).

Wersje OpenVPN przed wersją 2.3 wspierały także flagę metody wskazującą jak 
OpenVPN powinien wywoływać zewnętrzne polecenia i skrypty. Może to być albo wykonanie
lub system. Od wersji OpenVPN v2.3 ta flaga nie jest już akceptowana. W większości * nix
środowiska podejście execve () zostało użyte bez żadnych problemów.

Niektóre dyrektywy, takie jak --up, umożliwiają przekazywanie opcji do zewnętrznego skryptu.
W takich przypadkach upewnij się, że nazwa skryptu nie zawiera spacji ani znaku 
parser konfiguracji zadławi się, ponieważ nie może określić, gdzie skrypt 
kończą się nazwy i zaczynają się opcje skryptu.

W połączeniu ze skróconą sekcją na --up

--up cmd
    Uruchom polecenie cmd po pomyślnym otwarciu urządzenia TUN / TAP (zmiana UID użytkownika przed).
    cmd składa się ze ścieżki do skryptu (lub programu wykonywalnego), opcjonalnie podanej
    przez argumenty. Ścieżka i argumenty mogą być jedno- lub podwójnie cytowane i / lub
    uciekł za pomocą odwrotnego ukośnika i powinien być oddzielony jednym lub kilkoma spacjami.

Przykład:

Na moim komputerze z openpvn server.conf mam następujące linie w moim /etc/default/openvpnpliku:

OPTARGS="
    --script-security 2
    --up /etc/openvpn/nat.sh
" 

Nawiasem mówiąc, nat.sh konfiguruje translację adresów sieciowych w celu kierowania prywatnego ruchu sieciowego od klientów openvpn do publicznego Internetu; co jest dobre, gdy nie ufa się publicznemu punktowi dostępowemu WIFI.


Oprócz umożliwienia ponownego uruchomienia zgodnie z oczekiwaniami po ponownym uruchomieniu, kiedy /etc/openvpn/[client or server].confi /etc/default/openvpnpliki są poprawnie skonfigurowane, openvpn można uruchomić lub zatrzymać za pomocą:

sudo service openvpn start
sudo service openvpn stop

Inne przydatne opcje dostępne service openvpnobejmują cond-restart,force-reload,reload, restart,soft-restart, start, status, stop.

Keith Reynolds
źródło
3

Ponieważ jest to dość stary wątek, nie jestem pewien, czy nadal go interesuję. Jeśli nadal chcesz używać Menedżera sieci do łączenia się z VPN, możesz dodać prostą regułę udev w ten sposób:

KERNEL=="vpn0", RUN+="/PATH_TO_THE_SCRIPT/SCRIPT_NAME"

To powinno uruchomić dowolny skrypt po utworzeniu VPN.

Tomasz
źródło
1

Natknąłem się na odpowiedź w swoich badaniach, aby rozwiązać ten problem i odkryłem, że najlepszym rozwiązaniem jest (przy użyciu serwera openvpn), jak następuje:

Utwórz skrypt do wykonania:

# nano /etc/openvpn/up.sh
<file:contents>
#!/bin/sh

# export >> /var/log/openvpn/openvpn-up.log
D=`date "+%Y-%m-%d %H:%M"`
echo "[$D] ($local_port_1:$proto_1) $X509_0_CN: $trusted_ip => $ifconfig_pool_remote_ip" >> /var/log/openvpn/openvpn-up.log
</file>

Dodaj następujące wiersze do konfiguracji openvpn (zwykle /etc/openvpn/server.conf). W powyższej odpowiedzi użyto go w górę iw dół, które są używane podczas uruchamiania serwera (restartowania). Dyrektywa klient-podłącz (i klient-odłącz) jest używany, gdy klient łączy się (odłącza).

# nano /etc/openvpn/server.conf
<file:add>
script-security 2
client-connect /etc/openvpn/up.sh
</file>
CozC
źródło
Jak zamieścisz nazwę konfiguracji klienta w pliku dziennika?
callisto