റൂട്ടുകൾ എഡിറ്റ് ചെയ്ത് ഒരു പ്രോഗ്രാമിനെ പൂർണ്ണ ടണലുള്ള WireGuard ഹോസ്റ്റിൽ നിന്ന് ഒഴിവാക്കാൻ കഴിയില്ല. റൂട്ടുകൾ ലക്ഷ്യസ്ഥാനം അനുസരിച്ച് പാത തിരഞ്ഞെടുക്കുന്നു, ഒഴിവാക്കാൻ ആഗ്രഹിക്കുന്നത് ഒരു പ്രോസസ് ആണ്, അതിനാൽ കേർണലിന് താരതമ്യപ്പെടുത്താൻ ഒന്നുമില്ല. പ്രായോഗികമായ സമീപനം ആ പ്രോസസിന് സ്വന്തം നെറ്റ്വർക്ക് സന്ദർഭം നൽകുകയാണ്: സ്വന്തം ഇന്റർഫേസ്, വിലാസങ്ങൾ, ഡിഫോൾട്ട് റൂട്ട് എന്നിവയുള്ള ഒരു നെയിംസ്പേസ്, veth ജോഡി വഴി ഹോസ്റ്റുമായി ബന്ധിപ്പിച്ചത്. ഞാൻ ഇത് Ubuntu 24.04-ൽ wireguard-tools 1.0.20210914-നൊപ്പം പ്രവർത്തിപ്പിച്ചു, നെയിംസ്പേസ് ഒരിക്കലും പ്രശ്നമായിരുന്നില്ല — ഹോസ്റ്റിന്റെ ഫോർവേഡിംഗ് നയവും ടണലിന്റെ മാർക്കിംഗ് നിയമങ്ങളുമാണ് പ്രശ്നമായത്.

ആദ്യം നിങ്ങൾക്ക് ആവശ്യമായ സന്ദർഭത്തിന്റെ തരം തിരഞ്ഞെടുക്കുക

പ്രായോഗികമായി രണ്ട് രൂപങ്ങൾ കാണാം. ഹോസ്റ്റ് ഒരു പൂർണ്ണ ടണൽ പ്രവർത്തിപ്പിക്കുകയും ഒരു പ്രോഗ്രാം ISP പാതയിലൂടെ പുറത്തുപോകേണ്ടതുമാണെങ്കിൽ, നിങ്ങൾ രണ്ടാമത്തെ നെയിംസ്പേസ് നിർമ്മിച്ച് അത് ഹോസ്റ്റുമായി ബന്ധിപ്പിച്ച് ഹോസ്റ്റിനെ അതിനുവേണ്ടി ട്രാഫിക് ഫോർവേഡ് ചെയ്യാനും വിവർത്തനം ചെയ്യാനും അനുവദിക്കുന്നു. ഒരു നെയിംസ്പേസിൽ ഇതിനകം VPN ഇന്റർഫേസ് ഉണ്ടെങ്കിൽ, അതിനുള്ളിൽ ആരംഭിക്കുന്ന ഒരു കമാൻഡ് മാത്രം വേണമെങ്കിൽ, അത് സാധാരണ ip netns exec കേസാണ്, റൂട്ടിംഗ് ജോലിയുടെ ഭൂരിഭാഗവും ഇതിനകം കഴിഞ്ഞു.

രണ്ട് രൂപങ്ങളിൽ ഒന്നും ഒരു പ്രോസസ് ഐഡിയിൽ മാത്രം പരിമിതപ്പെട്ട നിയമം നൽകുന്നില്ല. Netfilter വിലാസങ്ങൾ, പോർട്ടുകൾ, മാർക്കുകൾ, ഇന്റർഫേസുകൾ എന്നിവ പൊരുത്തപ്പെടുത്തുന്നു; ഓരോ പ്രോസസിനും റൂട്ടിംഗ് ടേബിൾ ഇല്ല. മാർക്കിംഗിന് ട്രാഫിക് നയിക്കാം, പക്ഷേ നിങ്ങൾ ഇതിനകം തിരിച്ചറിഞ്ഞ പാക്കറ്റുകളിൽ മാർക്ക് ഇടണം, അത് ഒരു പാളി താഴെയുള്ള അതേ പ്രശ്നമാണ്. നെയിംസ്പേസ് ആ പ്രോസസ് ട്രീയുടെ മുഴുവൻ സ്റ്റാക്കും വേർതിരിക്കുന്നു, അതുകൊണ്ടാണ് ഇത് സാധാരണ ഉത്തരമാകുന്നത്.

ആവശ്യകത യഥാർത്ഥത്തിൽ ടണലിൽ നിന്ന് ഒന്നും പുറത്തുപോകരുത് എന്നതാണെങ്കിൽ, പകരം ടണൽ നിർത്തുക. നെയിംസ്പേസ് മിശ്രിത കേസിനുവേണ്ടിയാണ്: ഒരു പ്രോഗ്രാം പുറത്ത്, ബാക്കിയെല്ലാം അകത്ത്, അതേ മെഷീനിൽ, അതേ സമയത്ത്.

രണ്ടാമത്തെ സന്ദർഭം നിർമ്മിച്ച് അത് ഹോസ്റ്റുമായി ബന്ധിപ്പിക്കുക

ഒരു ദൃഷ്ടാന്ത ക്രമീകരണം: ഹോസ്റ്റിൽ ഡിഫോൾട്ട് റൂട്ട് വഹിക്കുന്ന WireGuard ഇന്റർഫേസും,clearnet എന്ന് പേരുള്ള ഒരു നെറ്റ്വർക്ക് നെയിംസ്പേസും ഉണ്ട്, അത് veth ജോഡി വഴി ഹോസ്റ്റുമായി ബന്ധിപ്പിച്ചിരിക്കുന്നു. താഴെയുള്ള വിലാസങ്ങൾ ഉദാഹരണങ്ങളാണ്.

ip netns add clearnet
ip link add veth-clear-out type veth peer name veth-clear-in
ip addr add 192.168.100.1/24 dev veth-clear-out
ip link set veth-clear-out up
ip link set veth-clear-in netns clearnet
ip netns exec clearnet ip addr add 192.168.100.2/24 dev veth-clear-in
ip netns exec clearnet ip link set veth-clear-in up
ip netns exec clearnet ip route add default via 192.168.100.1

ഈ നെയിംസ്പേസിന് ഇപ്പോൾ ഹോസ്റ്റിൽ എത്താൻ കഴിയും, മറ്റെങ്ങും ഇല്ല. ഹോസ്റ്റ് ട്രാഫിക് ഫോർവേഡ് ചെയ്യുകയും ഉറവിട വിലാസം വീണ്ടും എഴുതുകയും വേണം, കാരണം 192.168.100.0/24 സ്വകാര്യമാണ്, മുകളിലെ റൂട്ടറിന് അതിലേക്ക് തിരികെയുള്ള റൂട്ട് ഇല്ല:

sysctl -w net.ipv4.ip_forward=1
iptables -t nat -A POSTROUTING -o <wan-interface> -j MASQUERADE

മുന്നോട്ടുപോകുന്നതിന് മുമ്പ് നെയിംസ്പേസ് വശം സ്ഥിരീകരിക്കുക.ip netns exec clearnet ip route veth റൂട്ടും 192.168.100.1 വഴിയുള്ള ഡിഫോൾട്ട് റൂട്ടും കാണിക്കണം, ആ വിലാസത്തിലേക്കുള്ള ping മറുപടി നൽകണം. ഹോസ്റ്റിന്റെ വിലാസത്തിലേക്കുള്ള ping പരാജയപ്പെട്ടാൽ, വിലാസങ്ങളോ ലിങ്ക് അവസ്ഥയോ തെറ്റാണ്, ഒരു ഫയർവാൾ നിയമവും സഹായിക്കില്ല.

പേരുകൾ പരിഹരിക്കപ്പെടുന്നുവെങ്കിലും ഒന്നും തിരികെ വരുന്നില്ലെങ്കിൽ, FORWARD വായിക്കുക

ക്ലാസിക് പരാജയം ഒരു റൂട്ടിംഗ് ബഗ് പോലെ തോന്നുന്നു: നെയിംസ്പേസ് ഒരു പേര് പരിഹരിക്കുന്നു, പാക്കറ്റ് പുറത്തുപോകുന്നു, മറുപടി ഒരിക്കലും എത്തുന്നില്ല. FORWARD നയം DROP ആയ ഹോസ്റ്റുകളിൽ — നിരവധി വിതരണങ്ങളും മിക്ക കാഠിന്യമുള്ള ഇമേജുകളും അങ്ങനെ ചെയ്യുന്നു — പാക്കറ്റ് വഴിയിൽ ഉപേക്ഷിക്കപ്പെടുന്നു, ആപ്ലിക്കേഷൻ അച്ചടിക്കുന്ന പിശക് ഫിൽട്ടറിംഗിനെക്കുറിച്ച് ഒന്നും പറയുന്നില്ല.

എന്തെങ്കിലും ചേർക്കുന്നതിന് മുമ്പ് ചെയിൻ വായിക്കുക:

iptables -S FORWARD
nft list chain inet filter forward

തുടർന്ന് ട്രാഫിക് രണ്ട് ദിശകളിലും അനുവദിക്കുക, കൗണ്ടറുകളോടെ, നിയമം എപ്പോഴെങ്കിലും പൊരുത്തപ്പെട്ടിട്ടുണ്ടോ എന്ന് അറിയാൻ:

iptables -A FORWARD -i veth-clear-out -o <wan-interface> -j ACCEPT
iptables -A FORWARD -i <wan-interface> -o veth-clear-out -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
watch -n1 'iptables -L FORWARD -v -n'

പൂജ്യം പാക്കറ്റ് കൗണ്ടറുള്ള നിയമം പാതയിലില്ല. ഒന്നുകിൽ ഇന്റർഫേസ് പേരുകൾ നിങ്ങൾ കരുതിയതിൽ നിന്ന് വ്യത്യസ്തമാണ്, അല്ലെങ്കിൽ ചെയിനിലെ മുൻ നിയമം പാക്കറ്റ് ആദ്യം സ്വീകരിച്ചു, ഉപേക്ഷിച്ചു, അല്ലെങ്കിൽ തിരികെ നൽകി. ക്രമം ശരിയാക്കുക, നിയമത്തിന്റെ വാചകമല്ല.

മറുപടി ട്രാഫിക് ആണ് ആളുകൾ മറക്കുന്ന പകുതി. തിരികെയുള്ള നിയമത്തിന് അതേ veth പേരും ഒരു കണക്ഷൻ അവസ്ഥ പൊരുത്തവും വേണം, അല്ലെങ്കിൽ നയം തുറന്നു സൂക്ഷിക്കുന്നെങ്കിൽ ലളിതമായ ഇന്റർഫേസ് സ്വീകരണം. പുറത്തേക്കുള്ള നിയമം മാത്രം ചേർത്താൽ യഥാർത്ഥ ലക്ഷണം തിരിച്ചുവരും, നിങ്ങളുടെ പുതിയ നിയമം അവിടെ ശരിയായി കാണപ്പെടുമ്പോൾ.

ടണലിന്റെ മാർക്കിംഗ് നിയമങ്ങൾ പുതിയ പാതയിൽ നിന്ന് അകറ്റി നിർത്തുക

ഈ ഘട്ടം പ്രവർത്തിക്കുന്ന നെയിംസ്പേസിനെ ചോർന്നൊലിക്കുന്ന ഒന്നാക്കി മാറ്റുന്നു. WireGuard സജ്ജീകരണങ്ങൾ സാധാരണയായി ഒരു ഫയർവാൾ മാർക്ക് നയവും സ്വന്തം റൂട്ടിംഗ് നിയമങ്ങളും സമർപ്പിത ടേബിളും ഇൻസ്റ്റാൾ ചെയ്യുന്നു, അതിനാൽ മാർക്ക് ഇല്ലാത്ത പാക്കറ്റുകൾ പ്രധാന ടേബിളിലേക്ക് തിരികെ വീഴുന്നു, മാർക്ക് ചെയ്തവ ടണൽ ടേബിൾ ഉപയോഗിക്കുന്നു. നെയിംസ്പേസിൽ നിന്ന് ഫോർവേഡ് ചെയ്യുന്ന ട്രാഫിക് പുറത്തുപോകുമ്പോൾ നയ അടിസ്ഥാനമാക്കിയ റൂട്ടിംഗിനെതിരെ വിലയിരുത്തപ്പെടുന്നു, ആ നിയമങ്ങൾ എഴുതിയ രീതിയെ ആശ്രയിച്ച് അത് ടണൽ ടേബിളിൽ വീഴാം.

രണ്ട് കൂട്ടിച്ചേർക്കലുകൾ പാതകളെ വേർതിരിക്കുന്നു. നെയിംസ്പേസ് സബ്നെറ്റിനായി mangle ചെയിനിൽ നേരത്തെ തിരികെ വരിക, ആ സബ്നെറ്റ് പ്രധാന ടേബിളിൽ ഇടുന്ന ഉറവിടാധിഷ്ഠിത നിയമം ചേർക്കുക:

iptables -t mangle -I PREROUTING -s 192.168.100.0/24 -j RETURN
ip rule add from 192.168.100.0/24 lookup main priority 100

എന്റെ ഹോസ്റ്റിൽ മുൻഗണന 100 ടണൽ നിയമങ്ങൾക്ക് മുമ്പ് അണിനിരക്കുന്നു, അതിനാൽ ആ ഉറവിടത്തിന് സാധാരണ ടേബിൾ തീരുമാനിക്കുന്നു. സംഖ്യ അന്ധമായി പകർത്തരുത്:wg-quick ഇൻസ്റ്റാൾ ചെയ്യുന്ന മുൻഗണനകൾ പതിപ്പുകൾക്കിടയിലും IPv4, IPv6 സജ്ജീകരണങ്ങൾക്കിടയിലും വ്യത്യസ്തമാണ്, അതിനാൽ പ്രവർത്തിപ്പിക്കുക ip rule show നിങ്ങളുടെ യന്ത്രത്തിൽ ടണൽ നിയമങ്ങൾക്ക് മുമ്പിൽ വരുന്ന മുൻഗണന തിരഞ്ഞെടുക്കുക.

നിയമ പട്ടികയിൽ ആശ്രയിക്കുന്നതിനുപകരംഉറവിട-നിർദ്ദിഷ്ട തിരയലിലൂടെ പരിശോധിക്കുക:

ip route get 1.1.1.1 from 192.168.100.2
ip netns exec clearnet ip route get 1.1.1.1

ആദ്യ കമാൻഡ് WireGuard ഇന്റർഫേസ് റിപ്പോർട്ട് ചെയ്താൽ, പുതിയ നിയമം ഇപ്പോഴും ടണൽ നയത്തിന് മുന്നിലല്ല. രണ്ടാമത്തേത് ഇപ്പോഴും veth ഡിഫോൾട്ട് കാണിക്കുമ്പോൾ അത് WAN ഇന്റർഫേസ് റിപ്പോർട്ട് ചെയ്താൽ, ഹോസ്റ്റും നെയിംസ്പേസും യോജിക്കുന്നില്ല, നിങ്ങൾ രണ്ട് റൂട്ടിംഗ് ടേബിളുകളും വീണ്ടും വായിക്കണം.

കണക്ഷൻ തുറക്കുന്ന പ്രോസസ് ആരംഭിക്കുക

കമാൻഡ് ആരംഭിക്കുന്നത് ഒരു വരിയാണ്, പക്ഷേ സോക്കറ്റ് യഥാർത്ഥത്തിൽ സൃഷ്ടിക്കുന്ന പ്രോസസ് ആരംഭിക്കുക.ip netns exec clearnet curl -s https://ifconfig.me ഏറ്റവും ചെറിയ സത്യസന്ധമായ പരിശോധനയാണ്: നെയിംസ്പേസ് ലോകത്തിന് അവതരിപ്പിക്കുന്ന വിലാസം കാണിക്കുന്നു, ഹോസ്റ്റ് ഉപയോഗിക്കുന്നതല്ല.

ഒരു സേവനത്തിന്, പ്രോസസ് അതിന്റെ മുഴുവൻ ജീവിതകാലവും അതിനുള്ളിൽ തുടരാൻ നെയിംസ്പേസ് പാത വഴി ഘടിപ്പിക്കുക:

[Service]
NetworkNamespacePath=/run/netns/clearnet

ഗ്രാഫിക്കൽ ആപ്ലിക്കേഷനുകളാണ് ഒരു വരി സമീപനം നിശബ്ദമായി പരാജയപ്പെടുന്ന സ്ഥലം. മെനുവിൽ നിന്ന് ആരംഭിക്കുന്ന ബ്രൗസർ പലപ്പോഴും അഭ്യർത്ഥന നെയിംസ്പേസിന് പുറത്ത് ഇതിനകം പ്രവർത്തിക്കുന്ന ഒരു ഇൻസ്റ്റൻസിന് കൈമാറുന്നു, അതിനാൽ പുതിയ വിൻഡോ കാണാം, ട്രാഫിക് ഇപ്പോഴും ടണലിലൂടെ പുറത്തുപോകുന്നു. യഥാർത്ഥത്തിൽ പുതിയ ഇൻസ്റ്റൻസ് സൃഷ്ടിക്കപ്പെടാൻ അതിന് പ്രത്യേക പ്രൊഫൈൽ നൽകുക, തുടർന്ന് ഊഹിക്കുന്നതിന് പകരം പ്രോസസിന്റെ സന്ദർഭം പരിശോധിക്കുക:

readlink /proc/$(pgrep -f clearnet-profile | head -1)/ns/net
readlink /run/netns/clearnet

രണ്ട് ഔട്ട്പുട്ടുകളും പൊരുത്തപ്പെടണം. അതേ പരിശോധന ഏത് ദീർഘകാല പ്രോഗ്രാമിനും പ്രവർത്തിക്കും, ലോഞ്ചർ നിങ്ങൾ ഉദ്ദേശിച്ചത് ചെയ്തുവെന്ന് കരുതുന്നതിനുപകരം ഓരോ ആപ്ലിക്കേഷനും ഒരിക്കൽ ചെയ്യുന്നത് മൂല്യവത്താണ്.

പേര് പരിഹാരത്തിന് സ്വന്തം തീരുമാനം വേണം. നെയിംസ്പേസ് സൃഷ്ടിക്കുന്നത് അതിന് റിസോൾവർ കോൺഫിഗറേഷൻ നൽകുന്നില്ല; ഓരോ നെയിംസ്പേസിനുമുള്ള ഫയലുകൾ ഇതിലൂടെ പിന്തുണയ്ക്കുന്നു/etc/netns/<name>/resolv.conf, അതില്ലാതെ തെറ്റായി വായിക്കാൻ എളുപ്പമുള്ള സ്വഭാവം നിങ്ങൾ പാരമ്പര്യമായി നേടുന്നു. IPv6-നും അതേ സമീപനം വേണം: നെയിംസ്പേസിന് v6 ഡിഫോൾട്ട് റൂട്ട് ഇല്ലെങ്കിൽ, ആപ്ലിക്കേഷൻ v6-നെ മുൻഗണന നൽകുകയാണെങ്കിൽ, അഭ്യർത്ഥനകൾ പിൻവാങ്ങുന്നതിന് മുമ്പ് തടഞ്ഞുനിൽക്കാം, അത് തകർന്ന ടണലിനെപ്പോലെ തോന്നുന്നു.

ഫ്രെയിം പരിശോധിക്കുക, പുറത്തുകടക്കുന്ന വിലാസം മാത്രമല്ല

പ്രവർത്തിക്കുന്ന ഒരു പൊതു വിലാസം റൂട്ട് തെളിയിക്കുന്നു, മുഴുവൻ ആവശ്യകതയല്ല. ബാക്കിയുള്ളത് ഈ ക്രമത്തിൽ പോകുക:

  • ip netns exec clearnet ip route get 1.1.1.1 veth ഡിഫോൾട്ട് കാണിക്കുന്നു, WireGuard ഇന്റർഫേസല്ല.
  • ഒരു അഭ്യർത്ഥന നടക്കുമ്പോൾ രണ്ട് നിയമങ്ങളുടെയും FORWARD കൗണ്ടറുകൾ വർദ്ധിക്കുന്നു.
  • ആപ്ലിക്കേഷൻ പ്രോസസ് നിങ്ങൾ പ്രതീക്ഷിക്കുന്ന നെയിംസ്പേസ് inode റിപ്പോർട്ട് ചെയ്യുന്നു.
  • റീബൂട്ടിന് ശേഷം സേവനം തുടങ്ങുന്നതിന് മുമ്പ് നെയിംസ്പേസ് നിലവിലുണ്ട്; നേരത്തെ പ്രവർത്തിക്കുന്ന unit പരാജയപ്പെടുന്നു, അല്ലെങ്കിൽ അതിലും മോശം, നെയിംസ്പേസിന് പുറത്ത് പ്രവർത്തിക്കുന്നു.

തുടർന്ന് ടണൽ വീഴുമ്പോൾ എന്ത് സംഭവിക്കണം എന്ന് തീരുമാനിക്കുക. നെയിംസ്പേസ് പ്രവർത്തിക്കുന്നത് തുടരുന്നു, അതാണ് ഈ അഭ്യാസത്തിന്റെ ഉദ്ദേശ്യവും അതേസമയം അപകടസാധ്യതയും: ഒഴിവാക്കിയ പ്രോഗ്രാം ബന്ധിപ്പിച്ചിരിക്കും, ബാക്കിയെല്ലാം നിന്നുപോകും. അത് ഒരു നയ തീരുമാനമായി രേഖപ്പെടുത്തുക, ഒഴിവാക്കൽ എന്ത് ഉൾക്കൊള്ളുന്നില്ല എന്ന് വ്യക്തമാക്കുക — അക്കൗണ്ട് ഐഡന്റിറ്റി, സംരക്ഷിച്ച ബ്രൗസർ അവസ്ഥ, നിങ്ങളുടെ DNS ദാതാവ് എന്നിവയെല്ലാം ഒരു നെറ്റ്വർക്ക് നെയിംസ്പേസിന്റെ പരിധിക്ക് പുറത്താണ്, ഒഴിവാക്കലിനെ അജ്ഞാതത്വമായി കാണുന്നത് കോൺഫിഗറേഷനെക്കാൾ അധികം നിലനിൽക്കുന്ന തെറ്റാണ്.

അനുബന്ധ ലേഖനങ്ങൾ