systemd-ൽ OpenVPN ക്രമരഹിത തിരഞ്ഞെടുപ്പ്: ExecStart എന്തുകൊണ്ട് പരാജയപ്പെടുന്നു
systemd ഒരു ഷെൽ അല്ല, അതിനാൽ ExecStart-നുള്ളിൽ കലർത്തിയ പകർപ്പ് മരിക്കുന്നു. തിരഞ്ഞെടുപ്പ് ExecStartPre-ലേക്ക് മാറ്റുക, അല്ലെങ്കിൽ OpenVPN തന്നെ സെർവർ തിരഞ്ഞെടുക്കട്ടെ.
ഒരു രാജ്യത്തിനായി നാൽപ്പത് .ovpn ഫയലുകൾ ഒരു ദാതാവിൽ നിന്ന് എത്തുന്നു, ഒപ്പം പദ്ധതി വ്യക്തമായി തോന്നുന്നു: ക്രമരഹിതമായ ഒന്ന് അതിന്റെ സ്ഥാനത്തേക്ക് പകർത്തുക, പിന്നീട് ടണൽ ആരംഭിക്കുക. ExecStart-നുള്ളിൽ പൈപ്പ്ലൈൻ ആയി എഴുതുമ്പോൾ, ആ പദ്ധതി ബൂട്ട് സമയത്ത് ഒന്നും വിശദീകരിക്കാത്ത ഒരു സ്റ്റാറ്റസ് കോഡിനൊപ്പം മരിക്കുന്നു. യൂണിറ്റ് ഫയൽ ഒരു സ്ക്രിപ്റ്റ് അല്ല, ഒപ്പം പരിഹാരം എന്നത് ഒരു ഷെൽ വ്യക്തമായി കൊണ്ടുവരികയോ ഫയലുകൾ തിരഞ്ഞെടുക്കുന്നത് പൂർണ്ണമായി നിർത്തുകയോ ആണ്.
ലക്ഷണം: ആരംഭിച്ച് ഉടൻ മരിക്കുന്ന ഒരു യൂണിറ്റ്
സേവനം ഒരു സെക്കൻഡിന്റെ ഒരു ഭാഗത്തിനുള്ളിൽ പരാജയപ്പെട്ടുവെന്ന് സ്റ്റാറ്റസ് കാണിക്കുന്നു, ഒപ്പം ജേണൽ വരി ഒരു ഷെല്ലും ഒരിക്കലും സ്വീകരിക്കാത്ത ഒരു കമാൻഡ് പേരിടുന്നു. ടണലിനെക്കുറിച്ച് ഒന്നും പ്രത്യക്ഷപ്പെടുന്നില്ല, കാരണം ടണൽ ഒരിക്കലും ആരംഭിച്ചില്ല.
ജേണലിൽ നിന്ന് കൃത്യമായ കമാൻഡ് ലൈൻ വായിക്കുന്നതാണ് ഇത് സ്ഥിരീകരിക്കാനുള്ള വേഗതയേറിയ വഴി. systemd താൻ പ്രവർത്തിപ്പിച്ചത് ആവർത്തിക്കുന്നു, ഒപ്പം പൈപ്പ്ലൈൻ അക്ഷരങ്ങൾ ഓപ്പറേറ്റർമാരായി അല്ല, അക്ഷരാർത്ഥത്തിലുള്ള ആർഗ്യുമെന്റുകളായി സ്ട്രിംഗ് കാണിക്കും.
ExecStart-ന് ഒരു പൈപ്പ്ലൈൻ പ്രവർത്തിപ്പിക്കാൻ കഴിയാത്തത് എന്തുകൊണ്ട്
systemd തന്നെ കമാൻഡ് ലൈൻ വിഭജിക്കുന്നു, സ്വന്തം ഉദ്ധരണിയും വേരിയബിൾ പകരവും പ്രയോഗിക്കുന്നു, പിന്നീട് ഫലം നേരിട്ട് പ്രവർത്തിപ്പിക്കുന്നു. പൈപ്പുകൾ, റീഡയറക്ഷൻ, ഷെൽ ചെയ്യുന്ന ഗ്ലോബ് വിപുലീകരണം, കമാൻഡ് പകരം എന്നിവ ഈ വ്യാകരണത്തിന്റെ ഭാഗമല്ല. ഇത് ഒരു രൂപകൽപ്പനാ തിരഞ്ഞെടുപ്പാണ്, വിട്ടുപോകലല്ല: യൂണിറ്റ് എന്ത് പ്രവർത്തിപ്പിക്കണമെന്ന് പ്രഖ്യാപനപരമായി പറയുന്നു, ഷെൽ യുക്തി യൂണിറ്റ് വിളിക്കുന്ന സ്ക്രിപ്റ്റിൽ പെടുന്നു. രണ്ട് പരിഹാരങ്ങളും അതിൽ നിന്നാണ് വരുന്നത്, ഒന്നും യൂണിറ്റിന് കൂടുതൽ അനുമതി നൽകേണ്ടതില്ല.
തെറ്റിദ്ധരിപ്പിക്കുന്ന എക്സിറ്റ് കോഡും ഇത് വിശദീകരിക്കുന്നു. ആദ്യത്തെ ആർഗ്യുമെന്റ് ബൈനറിയായി കണക്കാക്കുന്നു, അതിനാൽ നിങ്ങളുടെ യുക്തിയുടെ ഏതെങ്കിലും ഭാഗം പ്രവർത്തിക്കുന്നതിന് മുമ്പ് തന്നെ തെറ്റായ വരി പരാജയപ്പെടുന്നു.
തിരഞ്ഞെടുപ്പ് ExecStartPre-യിൽ ചെയ്യുക
നേരിട്ടുള്ള പരിഹാരം ഒരു ഷെൽ വ്യക്തമായി വിളിക്കുന്ന ഒരു തയ്യാറെടുപ്പ് ഘട്ടമാണ്, തിരഞ്ഞെടുപ്പും ആരംഭവും ഒരേ യൂണിറ്റിൽ നിർത്തുന്നു, അതിനാൽ ഒന്നിലെ പരാജയം മറ്റൊന്നിനെ ഒറ്റയ്ക്ക് പ്രവർത്തിപ്പിക്കാൻ വിടില്ല.
[Service]
Type=notify
ExecStartPre=/bin/bash -c "ls /etc/openvpn/profiles/au* | shuf -n 1 | xargs -r -I{} cp -f {} /etc/openvpn/%i.conf"
ExecStart=/usr/sbin/openvpn --config /etc/openvpn/%i.conf
മൂന്ന് വിശദാംശങ്ങൾ യഥാർത്ഥ യന്ത്രവുമായുള്ള സമ്പർക്കം ഇത് അതിജീവിക്കുമോ എന്ന് തീരുമാനിക്കുന്നു. പേരിടൽ ആദ്യത്തെ കെണിയാണ്: യൂണിറ്റ് പാഴ്സ് ചെയ്യുമ്പോൾ തന്നെ, bash പ്രവർത്തിക്കുന്നതിന് വളരെ മുമ്പേ, systemd %i മാറ്റിസ്ഥാപിക്കുന്നു, അതിനാൽ സ്പെസിഫയർ ഒറ്റ ഉദ്ധരണികൾക്ക് പുറത്ത് നിൽക്കണം. ഗ്ലോബ് ഒന്നുമായും പൊരുത്തപ്പെടാത്തപ്പോൾ cp-ന് ആർഗ്യുമെന്റ് ഇല്ലാതെ പ്രവർത്തിക്കുന്നത് xargs -r തടയുന്നു. പരാജയപ്പെട്ട തയ്യാറെടുപ്പ് ഘട്ടം യൂണിറ്റ് നിർത്തുന്നു, അതാണ് ശരിയായ ഫലം: ഇന്നലത്തെ കോൺഫിഗറേഷനുമായി ആരംഭിക്കുന്നത് ആരംഭിക്കാതിരിക്കുന്നതിനേക്കാൾ മോശമാണ്. എപ്പോഴും ഒരേ ഫയൽ എടുക്കുന്ന ക്രമരഹിത തിരഞ്ഞെടുപ്പ് സാധാരണയായി ദൗർഭാഗ്യമല്ല. പകർത്തിയ ഫയൽ ഒരു പാക്കേജ് അപ്ഡേറ്റ് മേലെഴുതുന്നുണ്ടോ, അല്ലെങ്കിൽ ഗ്ലോബ് ഒരു പഴയ എൻട്രിയുമായി മാത്രം പൊരുത്തപ്പെടുന്നുണ്ടോ എന്ന് പരിശോധിക്കുക.
അല്ലെങ്കിൽ OpenVPN എൻഡ്പോയിന്റ് തിരഞ്ഞെടുക്കട്ടെ
OpenVPN-ന് ഇതിനകം ഒരു പ്രൊഫൈലിൽ നിരവധി എൻഡ്പോയിന്റുകൾ സൂക്ഷിക്കാനും അവയിൽ നിന്ന് ക്രമരഹിതമായി തിരഞ്ഞെടുക്കാനും കഴിയും, ഇത് ഷെൽ, പകർപ്പ്, എഴുത്ത് അനുമതി എന്നിവ ബൂട്ട് പാതയിൽ നിന്ന് പൂർണ്ണമായി നീക്കം ചെയ്യുന്നു.
client
remote-random
<connection>
remote au1.example.net 1194 udp
</connection>
<connection>
remote au2.example.net 1194 udp
</connection>
ഈ രൂപം സെർവർ തിരഞ്ഞെടുപ്പ് ദാതാവ് എഴുതിയ ഫയലിനുള്ളിൽ നിർത്തുന്നു, അതിനാൽ ഫയലുകൾ പുനർനാമകരണം ചെയ്യുന്ന റൊട്ടേഷൻ യൂണിറ്റ് തകർക്കുന്നില്ല. ഡയറക്ടറിയിലെ ഗ്ലോബിന് ഒരിക്കലും ഇല്ലാത്ത ഒരു ഗുണമാണ്, സ്ഥാനാർത്ഥികളുടെ പട്ടിക ഓഡിറ്റ് ചെയ്യാവുന്നതാക്കുന്നതും. പ്രൊഫൈലുകൾ എൻഡ്പോയിന്റിനേക്കാൾ കൂടുതലുള്ള കാര്യങ്ങളിൽ വ്യത്യാസപ്പെടുമ്പോൾ ഷഫിൾ ഇപ്പോഴും സ്ഥാനം നേടുന്നു: വ്യത്യസ്ത സർട്ടിഫിക്കറ്റുകൾ, വ്യത്യസ്ത റൂട്ടിംഗ് നിർദ്ദേശങ്ങൾ, വ്യത്യസ്ത സൈഫർ നയം. ആ സാഹചര്യത്തിൽ തിരഞ്ഞെടുപ്പ് പൂർണ്ണ കോൺഫിഗറേഷനുകൾക്കിടയിലാണ്, ഷെൽ ഘട്ടമാണ് അത് സത്യസന്ധമായി പ്രകടിപ്പിക്കാനുള്ള വഴി.
ഉപയോഗിച്ച ഇൻസ്റ്റൻസും ഫയലും വീണ്ടും വായിക്കുക
ഉള്ളടക്കം ഡീബഗ് ചെയ്യുന്നതിന് മുമ്പ് ഏത് യൂണിറ്റാണ് യഥാർത്ഥത്തിൽ പ്രവർത്തിക്കുന്നതെന്ന് ഉറപ്പാക്കുക. പാക്കേജ് ചെയ്ത മെറ്റാ സേവനവും ടെംപ്ലേറ്റും ഇൻഫ്രാസ്ട്രക്ചർ ആണ്; നിങ്ങളുടെ ഫയലുകളുമായി യോജിക്കുന്ന യൂണിറ്റുകളാണ് അവയുടെ പേരിലുള്ള ഇൻസ്റ്റൻസുകൾ.
systemctl list-units 'openvpn*'
systemctl cat [email protected]
journalctl -u openvpn@au -n 30 --no-pager
ആരും പ്രവർത്തനക്ഷമമാക്കിയതായി ഓർക്കാത്ത ഒരു ഇൻസ്റ്റൻസ് സാധാരണയായി പാക്കേജ് ഡയറക്ടറിയിലെ ഒരു അലയുന്ന കോൺഫിഗറേഷൻ ഫയലിലേക്ക് നയിക്കുന്നു. ടെംപ്ലേറ്റിനു പകരം ആ പേരുള്ള ഇൻസ്റ്റൻസ് ഓഫ് ചെയ്യുക, അല്ലെങ്കിൽ അടുത്ത പാക്കേജ് അപ്ഗ്രേഡ് അതിനെ തിരികെ കൊണ്ടുവരും. മാറ്റത്തിന് ശേഷം യൂണിറ്റ് ആരംഭിച്ച് ജേണൽ റിപ്പോർട്ട് ചെയ്യുന്ന കമാൻഡ് ലൈൻ വായിക്കുക, പിന്നീട് അത് യഥാർത്ഥത്തിൽ തുറന്ന കോൺഫിഗറേഷൻ പാത സ്ഥിരീകരിക്കുക. ആ ഒരു പരിശോധന പ്രവർത്തിക്കുന്ന ക്രമരഹിത തിരഞ്ഞെടുപ്പിനെ കഴിഞ്ഞ മാസത്തെ ഫയൽ നിശ്ശബ്ദമായി വീണ്ടും ഉപയോഗിക്കുന്ന സേവനത്തിൽ നിന്ന് വേർതിരിക്കുന്നു.