Docker-ൽ OpenVPN /dev/net/tun തുറക്കാനാകുന്നില്ല: എന്താണ് കാണാത്തത്
TUN നോഡും നെറ്റ്വർക്ക് കഴിവും രണ്ട് വെവ്വേറെ അനുമതികളാണ്. രണ്ടും തുറക്കുക, പിന്നീട് അതേ പരിഹാരം ആവർത്തിക്കുന്നതിന് പകരം അടുത്ത പിശക് അതിന്റെ സ്വന്തം വ്യവസ്ഥകളിൽ വായിക്കുക.
കണ്ടെയ്നർ ഇമേജുകൾക്ക് അവയ്ക്ക് ആവശ്യമായ എല്ലാ OpenVPN ബൈനറിയും കോൺഫിഗറേഷൻ ഫയലും വഹിക്കാനാകും, എന്നിട്ടും ആദ്യ നെറ്റ്വർക്ക് വിളിയിൽ പരാജയപ്പെടാം. പിശക് /dev/net/tun എന്ന് പറയുന്നത് ആപ്ലിക്കേഷൻ കർണലിനോട് TUN ഇന്റർഫേസ് ആവശ്യപ്പെട്ടതിനാലാണ്, കണ്ടെയ്നറിൽ ഡിവൈസ് നോഡോ അത് സൃഷ്ടിക്കാനുള്ള കഴിവോ ഉണ്ടായിരുന്നില്ല. ഇവ രണ്ട് വെവ്വേറെ അനുമതികളാണ്, ഒന്ന് ശരിയാക്കിയാലും മറ്റൊന്ന് ഉണ്ടായിരുന്നിടത്തുതന്നെ നിൽക്കും.
അവ വേർതിരിക്കാൻ ഓരോന്നിനും ഓരോ കമാൻഡ് വേണം. തുടർന്നുള്ള പിശക് സന്ദേശം നിങ്ങൾ യഥാർത്ഥത്തിൽ ഏത് അതിർത്തിയിലാണ് നിന്നതെന്ന് പറയുന്നു.
ഡിവൈസ് നോഡും കഴിവും രണ്ട് വാതിലുകളാണ്
ഡിവൈസ് നോഡ് ഫയൽസിസ്റ്റം ഒബ്ജക്റ്റാണ്, അതിനാൽ കണ്ടെയ്നർ അത് സ്വന്തം മൗണ്ട് നെയിംസ്പേസിൽ കാണണം. കഴിവ് ഒരു അനുമതിയാണ്, അതിനാൽ ഇന്റർഫേസ് സൃഷ്ടിക്കുന്ന നെയിംസ്പേസിൽ പ്രോസസ്സിന് CAP_NET_ADMIN ആവശ്യമാണ്. കഴിവില്ലാതെ ഡിവൈസ് കൈമാറിയാൽ തുറക്കുന്ന നോഡും പരാജയപ്പെടുന്ന ioctl-ഉം ലഭിക്കും. ഡിവൈസ് ഇല്ലാതെ കഴിവ് നൽകിയാൽ ആപ്ലിക്കേഷന് ഒന്നും തുറക്കാനാകില്ല, അതുകൊണ്ടാണ് ഉദാഹരണങ്ങളിൽ രണ്ടും സാധാരണയായി ഒരുമിച്ച് കാണുന്നത്.
Docker-ന്റെ devices ക്രമീകരണം ഹോസ്റ്റ് ഡിവൈസ് കണ്ടെയ്നറിലേക്ക് മാപ്പ് ചെയ്യുന്നു, അതേസമയം cap_add കഴിവ് സെറ്റ് ക്രമീകരിക്കുന്നു. അതേ പാതയുടെ bind mount ഡിവൈസ് ആക്സസ് സെമാന്റിക്സ് പ്രയോഗിക്കാതെ ഫയൽ കാഴ്ചയിലെത്തിക്കുന്നു.
Compose ഫയലിന് പുറത്ത് ഇത് പുനർനിർമ്മിക്കുക
സേവനം എഡിറ്റ് ചെയ്യുന്നതിന് മുൻപ് ഹോസ്റ്റിൽ ഡിവൈസ് ഉണ്ടെന്നും വെറും കണ്ടെയ്നറിന് ഇന്റർഫേസ് സൃഷ്ടിക്കാനാകുമെന്നും പരിശോധിക്കുക. താഴെയുള്ള കമാൻഡ് ഉദ്ദേശ്യപൂർവം ഏറ്റവും ചെറുതാണ്, അതിന്റെ ഏക ലക്ഷ്യം ഹോസ്റ്റ് പ്രശ്നത്തെ compose പ്രശ്നത്തിൽ നിന്ന് വേർതിരിക്കുക എന്നതാണ്. അത് പരാജയപ്പെട്ടാൽ ഒരു compose മാറ്റവും സഹായിക്കില്ല.
ls -l /dev/net/tun
docker run --rm --cap-add NET_ADMIN --device /dev/net/tun:/dev/net/tun alpine sh -c 'apk add -q iproute2 && ip tuntap add dev tun9 mode tun && ip link show tun9'
ഹോസ്റ്റിൽ നോഡ് ഇല്ലാതിരിക്കുക എന്നത് tun മൊഡ്യൂൾ ലഭ്യമല്ല എന്നാണ്, ഇത് കണ്ടെയ്നറിന്റെയല്ല ഹോസ്റ്റ് വശത്തിന്റെ പരിഹാരമാണ്. നോഡ് ഉണ്ടായിട്ടും കണ്ടെയ്നറിനുള്ളിൽ തുറക്കാനാകാത്തത് ഡിവൈസ് ആക്സസിലേക്ക് വിരൽ ചൂണ്ടുന്നു, സന്ദേശം no such file എന്നല്ല permission denied എന്ന് പറയും. ഈ രണ്ട് പരാജയങ്ങളുടെ ക്രമമാണ് മുഴുവൻ രോഗനിർണയം. ഏതെങ്കിലും ഫ്ലാഗ് മാറ്റുന്നതിന് മുൻപ് നിങ്ങൾ ഏതാണ് കണ്ടതെന്ന് എഴുതി വയ്ക്കുക.
TUN-ന് ശേഷമുള്ള പിശകുകൾ വ്യത്യസ്ത പ്രശ്നങ്ങളാണ്
ഇന്റർഫേസ് പ്രത്യക്ഷപ്പെട്ടാൽ അടുത്ത പരാജയത്തിന് മറ്റൊരു ഉടമയുണ്ട്. ഓതന്റിക്കേഷൻ പിശകുകൾ അർത്ഥമാക്കുന്നത് ടണൽ സെർവറിൽ എത്തി ക്രെഡൻഷ്യലുകൾ നിരസിക്കപ്പെട്ടു എന്നാണ്, അതിനാൽ കഴിവ് മാറ്റങ്ങൾ സഹായിക്കില്ല. ആപ്ലിക്കേഷനുകൾ ഇപ്പോഴും പരാജയപ്പെടുമ്പോൾ ടണൽ സ്ഥാപിക്കപ്പെടുന്നത് റൂട്ടുകൾ, ഫോർവേഡിംഗ്, കണ്ടെയ്നറിനുള്ളിലെ DNS റിസോല്യൂഷൻ അല്ലെങ്കിൽ കണ്ടെയ്നറിന്റെ സ്വന്തം നെറ്റ്വർക്ക് ലേഔട്ടിലേക്ക് വിരൽ ചൂണ്ടുന്നു. അവയിൽ ഓരോന്നും TUN അനുമതിക്ക് ഉത്തരം നൽകാനാകാത്ത സാധാരണ നെറ്റ്വർക്കിംഗ് ചോദ്യമാണ്. ഓരോ മാറ്റത്തിന് ശേഷവും യഥാർത്ഥ പരിശോധന ആവർത്തിച്ചാൽ പരാജയങ്ങൾ ഒരൊറ്റ മതിപ്പായി ലയിക്കുന്നത് തടയാം.
പ്രവർത്തിക്കുന്ന ഉദാഹരണത്തിൽ നിന്ന് എല്ലാ ക്രമീകരണവും പകർത്തുന്നതാണ് ഏറ്റവും ചെറിയ പരിഹാരത്തെ വായിക്കാനാകാത്ത സേവന നിർവചനമാക്കി മാറ്റുന്ന വഴി. ഈ വിന്യാസത്തിന് ആവശ്യമുള്ളവ മാത്രം കൊണ്ടുവരിക, ഓരോന്നും എന്തിനാണെന്ന് രേഖപ്പെടുത്തുക.
കണ്ടെയ്നറിനുള്ളിൽ ഇന്റർഫേസ് പരിശോധിക്കുക
ഇന്റർഫേസും കഴിവ് സെറ്റും പരിശോധിക്കുക ഹോസ്റ്റിൽ നിന്നല്ല, പ്രവർത്തിക്കുന്ന കണ്ടെയ്നറിനുള്ളിൽ നിന്ന്. താഴെയുള്ള കമാൻഡുകൾ ഡിവൈസ് നോഡ്, കഴിവുകളുടെ പട്ടിക, ഒരു ഇന്റർഫേസ് ഒട്ടും സൃഷ്ടിക്കാനാകുമോ എന്നിവ കാണിക്കുന്നു. ക്ലയന്റ് പ്രവർത്തിക്കുന്ന അതേ കണ്ടെയ്നറിൽ അവ പ്രവർത്തിപ്പിക്കുക, ഇമേജ് ഏറ്റവും ചെറുതാണെങ്കിൽ ടൂളിംഗ് ഇൻസ്റ്റാൾ ചെയ്യുക.
ls -l /dev/net/tun
capsh --print | grep -i net_admin
ip link add dev tun9 type tun && ip link show tun9
bounding set-ൽ ഉള്ളതും effective set-ൽ ഇല്ലാത്തതുമായ കഴിവ് ഒരിക്കലും നൽകാത്ത കഴിവിൽ നിന്ന് വ്യത്യസ്തമായി പ്രവർത്തിക്കുന്നു, capsh രണ്ടും കാണിക്കുന്നു. നോഡ് ഉണ്ടായിരിക്കുകയും കഴിവ് ഉണ്ടായിരിക്കുകയും ചെയ്തിട്ടും സൃഷ്ടിക്കൽ പരാജയപ്പെടുന്നുവെങ്കിൽ, റൺടൈം seccomp പ്രൊഫൈൽ അല്ലെങ്കിൽ AppArmor നയം പോലെ പ്രവർത്തനം പരിമിതപ്പെടുത്തുന്ന മറ്റെന്തെങ്കിലും അടിച്ചേൽപ്പിക്കുന്നു. അത് ആപ്ലിക്കേഷനല്ല, റൺടൈം രേഖപ്പെടുത്തുന്ന മൂന്നാം അതിർത്തിയാണ്.
കണ്ടെയ്നർ ഫ്ലാഗുകൾ, ഇമേജ്, ഓരോ ശ്രമത്തിന്റെയും കൃത്യമായ പിശക് എന്നിവ രേഖപ്പെടുത്തുക. ആ കുറിപ്പ് വായിക്കുന്ന അടുത്ത വ്യക്തിക്ക് മുഴുവൻ അന്വേഷണവും ആവർത്തിക്കാതെ ഏത് വാതിൽ അടച്ചിരുന്നു എന്ന് പറയാനാകും.