VPN നെയിംസ്പേസിനുള്ളിലെ ആപ്പ് LAN-ൽ നിന്ന് എത്തിച്ചേരാനാവില്ല
ഒരു നെറ്റ്വർക്ക് നെയിംസ്പേസ് ഒരു പ്രോഗ്രാമിന് സ്വന്തം ടണലും സ്വന്തം ലൂപ്പ്ബാക്കും നൽകുന്നു. ഹോസ്റ്റിനെയല്ല, അതിന്റെ പോർട്ട് മാത്രം socat ഹോപ്പ് അല്ലെങ്കിൽ veth ജോടി ഉപയോഗിച്ച് പ്രസിദ്ധീകരിക്കുക.
നിങ്ങളുടെ സേവനം യന്ത്രത്തിൽ പ്രവർത്തിക്കുന്നു, ടണൽ ഉയർന്നിരിക്കുന്നു, എന്നിട്ടും നിങ്ങളുടെ മേശയിലെ ബ്രൗസർ ഇപ്പോഴും ഉത്തരത്തിനായി കാത്തിരിക്കുന്നു. സാധാരണ അർത്ഥത്തിൽ ഒന്നും തകർന്നിട്ടില്ല: ആപ്ലിക്കേഷൻ ഒരു നെറ്റ്വർക്ക് നെയിംസ്പേസിനുള്ളിൽ ശ്രവിക്കുന്നു, ആ സ്റ്റാക്ക് LAN-ന് അദൃശ്യമാണ്. അതിന്റെ ലൂപ്പ്ബാക്ക് നെയിംസ്പേസിന്റേതാണ്, അതിനാൽ മറ്റൊരു യന്ത്രത്തിലെ ക്ലയന്റിന് പോർട്ട് എത്തുന്ന ഒരു വിലാസവുമില്ല. ഒരു ബോധപൂർവമായ ഹോപ്പോ ഒരു veth ജോടിയോ ഹോസ്റ്റിന്റെ ബാക്കി ഭാഗം നീക്കാതെ ഇത് ശരിയാക്കുന്നു.
LAN വിലാസത്തിൽ ഒന്നും ഉത്തരം നൽകാത്തത് എന്തുകൊണ്ട്
നെയിംസ്പേസ് ഒരു പൂർണ്ണ നെറ്റ്വർക്ക് സ്റ്റാക്ക് ആണ്: ഇന്റർഫേസുകൾ, റൂട്ടുകൾ, ഫയർവാൾ നിയമങ്ങൾ, ഒരു സ്വകാര്യ ലൂപ്പ്ബാക്ക്. ip netns exec വഴി ആരംഭിച്ച പ്രോസസ് ആ സ്റ്റാക്ക് മാത്രം കാണുന്നു, അതിനാൽ അത് ബന്ധിക്കുന്ന വിലാസം നെയിംസ്പേസിനുള്ളിൽ മാത്രം പരിഹരിക്കപ്പെടുന്നു. ഹോസ്റ്റിന്റെ സ്വന്തം 127.0.0.1 തികച്ചും വേറെ ഒരു ലൂപ്പ്ബാക്ക് ആണ്.
അതുകൊണ്ടാണ് ഹോസ്റ്റിൽ curl പരാജയപ്പെടുകയും നെയിംസ്പേസിനുള്ളിൽ അതേ കമാൻഡ് വിജയിക്കുകയും ചെയ്യുന്നത്. ആപ്ലിക്കേഷൻ ആരോഗ്യമുള്ളതാണ്; വിലാസം ഹോസ്റ്റിന്റെ സ്റ്റാക്കിൽ ഇല്ല, അത്രമാത്രം.
socat ഹോപ്പ് ഉപയോഗിച്ച് ഒരു പോർട്ട് പ്രസിദ്ധീകരിക്കുക
socat രണ്ട് സ്റ്റാക്കുകളെ ഉപയോക്തൃ സ്ഥലത്ത് ബന്ധിപ്പിക്കുന്നു, ഒരു TCP പോർട്ട് കടക്കേണ്ടിവരുമ്പോൾ ഇത് മതി. ഹോസ്റ്റ് ഭാഗം LAN-ൽ ശ്രവിക്കുന്നു, സ്വീകരിച്ച ഓരോ കണക്ഷനും നെയിംസ്പേസിനുള്ളിൽ രണ്ടാമതൊരു socat ആരംഭിക്കുന്നു, അത് ആപ്പിന്റെ ലൂപ്പ്ബാക്കിലേക്ക് ബന്ധിപ്പിക്കുന്നു. ഉള്ളിലെ പ്രോസസ് പ്രാദേശിക ക്ലയന്റ് ചെയ്യുന്നതുപോലെ കൃത്യമായി ആപ്ലിക്കേഷനിൽ എത്തുന്നു. നെയിംസ്പേസിന്റെ റൂട്ടിംഗിൽ ഒന്നും മാറുന്നില്ല, അതിനാൽ ആപ്പ് ടണലിനെ അതിന്റെ ഏക പുറത്തുകടക്കൽ വഴിയായി തുടരുന്നു.
socat TCP-LISTEN:9100,reuseaddr,fork EXEC:'ip netns exec vpn socat STDIO tcp-connect:127.0.0.1:9100',nofork
പുറത്തുള്ള പ്രോസസിന് root അല്ലെങ്കിൽ നെയിംസ്പേസിൽ പ്രവേശിക്കാനുള്ള കഴിവ് വേണം. VPN വീണാൽ ആപ്പിന് അതിന്റെ വഴി നഷ്ടമാകുന്നു, പ്രസിദ്ധീകരിച്ച പോർട്ട് അടഞ്ഞ് പരാജയപ്പെടുന്നു, ഒരു ജയിലിൽ നിന്ന് നിങ്ങൾ ആഗ്രഹിക്കുന്ന പെരുമാറ്റം അതാണ്.
ഒന്നിൽ കൂടുതൽ പോർട്ട് കടക്കുമ്പോൾ veth ജോടി ഉപയോഗിക്കുക
നിരവധി പോർട്ടുകളോ പ്രോട്ടോക്കോളുകളോ കടക്കേണ്ടിവരുമ്പോൾ, അല്ലെങ്കിൽ മറ്റ് ഹോസ്റ്റുകൾ കണക്ഷനുകൾ ആരംഭിക്കേണ്ടിവരുമ്പോൾ veth ജോടിയാണ് ശരിയായ ഉത്തരം. ഒരു അറ്റം ഹോസ്റ്റിൽ തുടരുന്നു, മറ്റേത് നെയിംസ്പേസിലേക്ക് നീങ്ങുന്നു, ഒരു ചെറിയ /30 രണ്ട് വശത്തിനും സ്ഥിരമായ വിലാസം നൽകുന്നു. തുടർന്ന് ഒരു ഹോസ്റ്റ് റൂട്ട് നെയിംസ്പേസിന്റെ വിലാസം ജോടിയിലൂടെ അയയ്ക്കുന്നു.
ip link add veth0 type veth peer name veth1
ip link set veth1 netns vpn
ip addr add 10.77.0.1/30 dev veth0
ip link set veth0 up
ip netns exec vpn ip addr add 10.77.0.2/30 dev veth1
ip netns exec vpn ip link set veth1 up
ജയിൽ തകർക്കാൻ ഉദ്ദേശമില്ലെങ്കിൽ ഹോസ്റ്റിലൂടെ ഒരു സ്ഥിര റൂട്ട് ചേർക്കരുത്. ടണൽ പുറത്തുകടക്കൽ വഴിയായി തുടരണം, അതിനാൽ ജോടിയിലൂടെ പ്രസിദ്ധീകരിച്ച സേവന വിലാസം മാത്രം എത്താനാകും. നെയിംസ്പേസിന് അതിന്റേതായ റിസോൾവർ ഫയലും നൽകുക, കാരണം ip netns exec /etc/netns/vpn/resolv.conf വായിക്കുന്നു, അതില്ലാതെ ജയിലിനുള്ളിൽ പേര് പരിഹരിക്കൽ ശൂന്യമാണ്.
ഹോസ്റ്റിൽ നിന്നല്ല, മറ്റൊരു യന്ത്രത്തിൽ നിന്ന് പരിശോധിക്കുക
രണ്ടാമത്തെ യന്ത്രത്തിൽ നിന്ന് പരിശോധന നടത്തുക, കാരണം ഹോസ്റ്റിന് LAN-നെക്കുറിച്ച് ഒന്നും പറയാത്ത വഴികളിലൂടെ പ്രാദേശിക ശ്രോതാവിലേക്ക് എത്താനാകും. ആദ്യം ആപ്പ് നെയിംസ്പേസിനുള്ളിൽ യഥാർത്ഥത്തിൽ എന്തിലേക്ക് ബന്ധിച്ചു എന്ന് പരിശോധിക്കുക, പിന്നീട് പുറത്തുനിന്ന് പ്രസിദ്ധീകരിച്ച വിലാസത്തിലേക്ക് കണക്റ്റ് ചെയ്യുക. അവിടെ എല്ലാ വിലാസത്തിലും ബന്ധിപ്പിക്കുന്നത് ജയിൽ വിശാലമാക്കുന്നില്ല, കാരണം വൈൽഡ്കാർഡ് ഇപ്പോഴും നെയിംസ്പേസിനുള്ളതാണ്, LAN അത് കാണാൻ കഴിയില്ല.
ip netns exec vpn ss -lntp
ഹോസ്റ്റിൽ നിന്നുള്ള കണക്ഷൻ പ്രവർത്തിക്കുകയും LAN-ൽ നിന്നുള്ളത് പരാജയപ്പെടുകയും ചെയ്താൽ, കാണാത്ത ഭാഗം ഹോപ്പോ റൂട്ടോ ആണ്, ബന്ധിപ്പിക്കുന്ന വിലാസമല്ല. സജീവമായ tun ഉപകരണം അകത്തേക്ക് നീക്കുന്നതിനുപകരം നെയിംസ്പേസിനുള്ളിൽ OpenVPN ആരംഭിക്കുക, കാരണം ഇന്റർഫേസ് നീക്കുന്നത് അത് ഓഫാക്കുന്നു, പിന്നീട് പുറത്തുനിന്ന് നന്നാക്കാനാകാത്ത റൂട്ടുകൾ മായ്ക്കാനും ഇടയാകും. വീണ്ടെടുക്കൽ കമാൻഡുകൾ ജയിലിനുള്ളിൽ അല്ല, കൺസോളിൽ സൂക്ഷിക്കുക.