Skrypt hooka uruchamia się, czyta ppp0 i stosuje trasy do tego interfejsu, który w tej chwili ma tę nazwę. Czasami to tunel, który miałeś na myśli; czasami to sesja, która połączyła się minutę wcześniej. Następne ponowne połączenie przesuwa numer, a ten sam skrypt po cichu konfiguruje złe łącze. Rozwiązaniem jest wzięcie interfejsu z wywołania, które właśnie się odbyło, i niesienie zamierzonego profilu obok niego.

Śledź jedną sesję od opcji do hooka

Zacznij tam, gdzie powstaje sesja. xl2tpd uruchamia pppd z plikiem opcji wskazanym przez pppoptfile tego tunelu, więc wtyczka, numer jednostki i każdy znacznik profilu są ustalane tam, a nie w pliku globalnym. Menedżer połączeń może generować własne opcje, co oznacza, że edycja /etc/ppp/options nie jest dowodem, że tunel, na którym ci zależy, się zmienił. Gdy łącze wstaje, pppd uruchamia skrypty powiadomień z dyspozytora dystrybucji. Te skrypty otrzymują nazwę interfejsu jako pierwszy argument, a znacznik profilu jako szósty.

Środowisko niesie te same fakty pod nazwami takimi jak IFNAME i PPP_IPPARAM, ale ich dostępność zależy od zainstalowanego dyspozytora. Przeczytaj dyspozytor, zanim zaufasz zmiennej: niektóre dystrybucje zachowują kolejność argumentów upstream, inne filtrują środowisko przed wywołaniem twojego skryptu. Skrypt, który używa tylko $1 i szóstego argumentu, działa w obu układach.

Czytaj interfejs z wywołania

Tradycyjny hook otrzymuje interfejs jako pierwszy. Ta wartość pozycyjna to identyfikator interfejsu opisujący sesję, która uruchomiła skrypt. Zapisz go w zmiennej na górze, a następnie używaj tej zmiennej do tras, reguł zapory i demontażu.

ipparam office-vpn

Dołącz znacznik profilu tam, gdzie definiowane są opcje, a nie w skrypcie. Z tym wierszem w pliku opcji tunelu każda sesja utworzona z tego pliku niesie office-vpn jako szósty argument. Skrypt może rozgałęziać się na znaczniku, działając jednocześnie na rzeczywistym interfejsie. Trzymaj oba osobno w kodzie, ponieważ znacznik jest stabilny, a interfejs jest przydzielany na sesję.

Proś o nazwę tylko wtedy, gdy odmowa jest właściwa

Stała nazwa wygląda prościej niż czytanie argumentów, ale zmienia zachowanie przy błędzie. Opcja unit prosi o numer dla połączenia wychodzącego, a pppd przechodzi na przydział dynamiczny, gdy ta jednostka jest już zajęta. Nic w tym wyniku nie rezerwuje ppp0 dla twojego profilu.

ifname ppp-office

Opcja ifname zachowuje się inaczej: jeśli żądana nazwa jest już używana lub nie można jej przypisać, pppd kończy działanie zamiast wybierać inną. To wybór polityki, a nie kosmetyczna zmiana nazwy. Użyj jej, gdy druga równoczesna instancja tego samego profilu ma zostać odrzucona, i potwierdź, że zainstalowany pppd i twój menedżer połączeń przekazują tę opcję.

Tak czy inaczej, nazwa, którą widzi skrypt, jest tą, na której trzeba działać. Skonfigurowana nazwa nie usuwa potrzeby czytania wywołania, ponieważ zrestartowana sesja wciąż może przedstawić inną nazwę niż poprzednia.

Dopasuj demontaż do skonfigurowanej sesji

Trasy i reguły zapory przeżywają skrypt, który je utworzył, więc demontaż musi usunąć dokładnie te obiekty, które należą do sesji. Oznacz reguły znacznikiem profilu oraz interfejsem i usuwaj po tym znaczniku. Jeśli dwa tunele mogą być aktywne, usuwanie wszystkiego, co wspomina ppp, jest sposobem, w jaki jedno rozłączenie psuje drugie połączenie.

Przetestuj przypadek, który ujawnia błąd: podnieś drugą sesję PPP, gdy pierwsza jest jeszcze połączona, następnie połącz ponownie pierwszą i obserwuj, który interfejs zgłasza hook. Udane uruchomienie z jedną sesją niczego nie dowodzi o przydzielaniu nazw. Powtórz z zatrzymanym VPN, aby potwierdzić, że demontaż nie zostawia przestarzałej trasy.

Przechowuj znacznik, interfejs i ścieżkę hooka w notatkach wdrożeniowych. Gdy numer zmienia się po restarcie, te trzy wartości wyjaśniają, dlaczego skrypt zachował się inaczej bez żadnej zmiany konfiguracji.

Powiązane artykuły