అది నిజం, ఈరోజు గుప్తీకరణ దేవుడికి మేము అదే చెబుతాము.
ఇక్కడ మనం ఎన్క్రిప్ట్ చేయని IPv4 సొరంగం గురించి మాట్లాడుతాము, కానీ "వెచ్చని దీపం" గురించి కాదు, కానీ ఆధునిక "LED" గురించి. మరియు ఇక్కడ ముడి సాకెట్లు ఫ్లాషింగ్ కూడా ఉన్నాయి మరియు వినియోగదారు స్థలంలో ప్యాకెట్లతో పని జరుగుతోంది.
ప్రతి రుచి మరియు రంగు కోసం N టన్నెలింగ్ ప్రోటోకాల్లు ఉన్నాయి:
కానీ నేను ప్రోగ్రామర్ని, కాబట్టి నేను N ను ఒక భాగానికి మాత్రమే పెంచుతాను మరియు నిజమైన ప్రోటోకాల్ల అభివృద్ధిని కొమ్మర్సంట్ డెవలపర్లకు వదిలివేస్తాను.
ఒక జన్మలో చిత్తుప్రతినేను ఇప్పుడు చేస్తున్నది బయటి నుండి NAT వెనుక ఉన్న హోస్ట్లను చేరుకోవడం. దీని కోసం అడల్ట్ క్రిప్టోగ్రఫీతో ప్రోటోకాల్లను ఉపయోగించడం, ఇది ఫిరంగి నుండి పిచ్చుకలను కాల్చడం లాంటిదనే భావనను నేను కదిలించలేకపోయాను. ఎందుకంటే సొరంగం చాలా వరకు NAT-eలో రంధ్రాలు వేయడానికి మాత్రమే ఉపయోగించబడుతుంది, అంతర్గత ట్రాఫిక్ కూడా సాధారణంగా గుప్తీకరించబడుతుంది, అయితే అవి ఇప్పటికీ HTTPSలో మునిగిపోతాయి.
వివిధ టన్నెలింగ్ ప్రోటోకాల్లను పరిశోధిస్తున్నప్పుడు, నా అంతర్గత పర్ఫెక్షనిస్ట్ దృష్టిని దాని కనిష్ట ఓవర్హెడ్ కారణంగా పదే పదే IPIP వైపు ఆకర్షించబడింది. కానీ ఇది నా పనులకు ఒకటిన్నర ముఖ్యమైన లోపాలను కలిగి ఉంది:
దీనికి రెండు వైపులా పబ్లిక్ IPలు అవసరం,
మరియు మీ కోసం ప్రమాణీకరణ లేదు.
అందువల్ల, పరిపూర్ణుడు పుర్రె యొక్క చీకటి మూలలోకి లేదా అతను ఎక్కడ కూర్చున్నాడో అక్కడకు తిరిగి నడపబడ్డాడు.
ఆపై ఒక రోజు, కథనాలు చదువుతున్నప్పుడు స్థానికంగా మద్దతు ఇచ్చే సొరంగాలు Linuxలో నేను FOU (Foo-over-UDP)ని చూశాను, అనగా. ఏమైనా, UDPతో చుట్టబడి ఉంటుంది. ఇప్పటివరకు, IPIP మరియు GUE (జనరిక్ UDP ఎన్క్యాప్సులేషన్) మాత్రమే సపోర్ట్ చేయబడుతున్నాయి.
“ఇదిగో వెండి బుల్లెట్! ఒక సాధారణ IPIP నాకు సరిపోతుంది. - నేను అనుకున్నాను.
వాస్తవానికి, బుల్లెట్ పూర్తిగా వెండి కాదని తేలింది. UDPలో ఎన్క్యాప్సులేషన్ మొదటి సమస్యను పరిష్కరిస్తుంది - మీరు ముందుగా ఏర్పాటు చేసిన కనెక్షన్ని ఉపయోగించి బయటి నుండి NAT వెనుక ఉన్న క్లయింట్లకు కనెక్ట్ చేయవచ్చు, కానీ ఇక్కడ IPIP యొక్క తదుపరి లోపంలో సగం కొత్త వెలుగులో వికసిస్తుంది - ప్రైవేట్ నెట్వర్క్లోని ఎవరైనా కనిపించే దాని వెనుక దాచవచ్చు. పబ్లిక్ IP మరియు క్లయింట్ పోర్ట్ (స్వచ్ఛమైన IPIPలో ఈ సమస్య ఉండదు).
ఈ ఒకటిన్నర సమస్యను పరిష్కరించడానికి, యుటిలిటీ పుట్టింది ఇపిపౌ. ఇది కెర్నల్ FOU యొక్క ఆపరేషన్కు అంతరాయం కలగకుండా, రిమోట్ హోస్ట్ను ప్రామాణీకరించడానికి స్వదేశీ-నిర్మిత యంత్రాంగాన్ని అమలు చేస్తుంది, ఇది కెర్నల్ స్థలంలో ప్యాకెట్లను త్వరగా మరియు సమర్ధవంతంగా ప్రాసెస్ చేస్తుంది.
మీ స్క్రిప్ట్ మాకు అవసరం లేదు!
సరే, క్లయింట్ యొక్క పబ్లిక్ పోర్ట్ మరియు IP మీకు తెలిస్తే (ఉదాహరణకు, దాని వెనుక ఉన్న ప్రతి ఒక్కరూ ఎక్కడికీ వెళ్లరు, NAT పోర్ట్లను 1-in-1ని మ్యాప్ చేయడానికి ప్రయత్నిస్తుంది), మీరు దీనితో IPIP-over-FOU టన్నెల్ను సృష్టించవచ్చు కింది ఆదేశాలను, ఎలాంటి స్క్రిప్ట్లు లేకుండా.
సర్వర్లో:
# Подгрузить модуль ядра FOU
modprobe fou
# Создать IPIP туннель с инкапсуляцией в FOU.
# Модуль ipip подгрузится автоматически.
ip link add name ipipou0 type ipip
remote 198.51.100.2 local 203.0.113.1
encap fou encap-sport 10000 encap-dport 20001
mode ipip dev eth0
# Добавить порт на котором будет слушать FOU для этого туннеля
ip fou add port 10000 ipproto 4 local 203.0.113.1 dev eth0
# Назначить IP адрес туннелю
ip address add 172.28.0.0 peer 172.28.0.1 dev ipipou0
# Поднять туннель
ip link set ipipou0 up
క్లయింట్ మీద:
modprobe fou
ip link add name ipipou1 type ipip
remote 203.0.113.1 local 192.168.0.2
encap fou encap-sport 10001 encap-dport 10000 encap-csum
mode ipip dev eth0
# Опции local, peer, peer_port, dev могут не поддерживаться старыми ядрами, можно их опустить.
# peer и peer_port используются для создания соединения сразу при создании FOU-listener-а.
ip fou add port 10001 ipproto 4 local 192.168.0.2 peer 203.0.113.1 peer_port 10000 dev eth0
ip address add 172.28.0.1 peer 172.28.0.0 dev ipipou1
ip link set ipipou1 up
పేరు
ipipou* — స్థానిక టన్నెల్ నెట్వర్క్ ఇంటర్ఫేస్ పేరు
203.0.113.1 - పబ్లిక్ IP సర్వర్
198.51.100.2 - క్లయింట్ యొక్క పబ్లిక్ IP
192.168.0.2 — క్లయింట్ IP ఇంటర్ఫేస్ eth0కి కేటాయించబడింది
10001 - FOU కోసం స్థానిక క్లయింట్ పోర్ట్
20001 - FOU కోసం పబ్లిక్ క్లయింట్ పోర్ట్
10000 - FOU కోసం పబ్లిక్ సర్వర్ పోర్ట్
encap-csum — ఎన్క్యాప్సులేటెడ్ UDP ప్యాకెట్లకు UDP చెక్సమ్ని జోడించే ఎంపిక; ద్వారా భర్తీ చేయవచ్చు noencap-csum, ప్రత్యేకంగా చెప్పనక్కర్లేదు, సమగ్రత ఇప్పటికే బయటి ఎన్క్యాప్సులేషన్ లేయర్ ద్వారా నియంత్రించబడుతుంది (ప్యాకెట్ సొరంగం లోపల ఉన్నప్పుడు)
eth0 — ipip టన్నెల్ కట్టుబడి ఉండే స్థానిక ఇంటర్ఫేస్
172.28.0.1 — క్లయింట్ టన్నెల్ ఇంటర్ఫేస్ యొక్క IP (ప్రైవేట్)
172.28.0.0 — IP టన్నెల్ సర్వర్ ఇంటర్ఫేస్ (ప్రైవేట్)
UDP కనెక్షన్ సజీవంగా ఉన్నంత వరకు, సొరంగం పని క్రమంలో ఉంటుంది, కానీ అది విచ్ఛిన్నమైతే, మీరు అదృష్టవంతులు అవుతారు - క్లయింట్ యొక్క IP: పోర్ట్ అలాగే ఉంటే - అది జీవిస్తుంది, అవి మారితే - అది విరిగిపోతుంది.
కెర్నల్ మాడ్యూల్లను అన్లోడ్ చేయడం ప్రతిదీ వెనక్కి తిప్పడానికి సులభమైన మార్గం: modprobe -r fou ipip
ప్రామాణీకరణ అవసరం లేకపోయినా, క్లయింట్ యొక్క పబ్లిక్ IP మరియు పోర్ట్ ఎల్లప్పుడూ తెలియవు మరియు తరచుగా ఊహించలేనివి లేదా వేరియబుల్ (NAT రకాన్ని బట్టి) ఉంటాయి. మీరు తప్పిస్తే encap-dport సర్వర్ వైపు, సొరంగం పనిచేయదు, రిమోట్ కనెక్షన్ పోర్ట్ను తీసుకునేంత స్మార్ట్ కాదు. ఈ సందర్భంలో, ipipou కూడా సహాయం చేయగలదు లేదా WireGuard మరియు ఇతరులు మీకు సహాయం చేయగలరు.
అది ఎలా పనిచేస్తుంది?
క్లయింట్ (ఇది సాధారణంగా NAT వెనుక ఉంటుంది) ఒక టన్నెల్ను తెరుస్తుంది (పై ఉదాహరణలో వలె), మరియు ఒక ప్రమాణీకరణ ప్యాకెట్ను సర్వర్కు పంపుతుంది, తద్వారా అది దాని వైపు సొరంగంను కాన్ఫిగర్ చేస్తుంది. సెట్టింగ్లపై ఆధారపడి, ఇది ఖాళీ ప్యాకెట్ కావచ్చు (సర్వర్ పబ్లిక్ IP: కనెక్షన్ పోర్ట్ని చూడగలిగేలా), లేదా సర్వర్ క్లయింట్ను గుర్తించగల డేటాతో ఉంటుంది. డేటా స్పష్టమైన టెక్స్ట్లో సాధారణ పాస్ఫ్రేజ్ కావచ్చు (HTTP ప్రాథమిక ప్రమాణీకరణతో సారూప్యత గుర్తుకు వస్తుంది) లేదా ప్రత్యేకంగా రూపొందించిన డేటా ప్రైవేట్ కీతో సంతకం చేయబడింది (HTTP డైజెస్ట్ ఆథ్ మాత్రమే బలంగా ఉంటుంది, ఫంక్షన్ చూడండి. client_auth కోడ్లో).
సర్వర్లో (పబ్లిక్ IP ఉన్న వైపు), ipipou ప్రారంభించినప్పుడు, అది ఒక nfqueue క్యూ హ్యాండ్లర్ను సృష్టిస్తుంది మరియు netfilterని కాన్ఫిగర్ చేస్తుంది, తద్వారా అవసరమైన ప్యాకెట్లు ఎక్కడ ఉండాలో పంపబడతాయి: nfqueue క్యూకి కనెక్షన్ని ప్రారంభించే ప్యాకెట్లు మరియు [దాదాపు] మిగిలినవన్నీ నేరుగా వినేవారు FOUకి వెళ్తాయి.
తెలియని వారికి, nfqueue (లేదా NetfilterQueue) అనేది కెర్నల్ మాడ్యూల్లను ఎలా అభివృద్ధి చేయాలో తెలియని ఔత్సాహికులకు ఒక ప్రత్యేక విషయం, ఇది నెట్ఫిల్టర్ (nftables/iptables)ని ఉపయోగించి నెట్వర్క్ ప్యాకెట్లను యూజర్ స్పేస్కి మళ్లించడానికి మరియు వాటిని ఉపయోగించి వాటిని ప్రాసెస్ చేయడానికి మిమ్మల్ని అనుమతిస్తుంది. ఆదిమ అంటే చేతిలో ఉంది: సవరించండి (ఐచ్ఛికం ) మరియు దానిని కెర్నల్కు తిరిగి ఇవ్వండి లేదా విస్మరించండి.
కొన్ని ప్రోగ్రామింగ్ భాషల కోసం nfqueueతో పనిచేయడానికి బైండింగ్లు ఉన్నాయి, బాష్ కోసం ఏదీ లేదు (హే, ఆశ్చర్యం లేదు), నేను పైథాన్ని ఉపయోగించాల్సి వచ్చింది: ipipou ఉపయోగాలు నెట్ఫిల్టర్ క్యూ.
పనితీరు కీలకం కానట్లయితే, ఈ విషయాన్ని ఉపయోగించి మీరు చాలా తక్కువ స్థాయిలో ప్యాకెట్లతో పని చేయడానికి మీ స్వంత లాజిక్ను సాపేక్షంగా త్వరగా మరియు సులభంగా రూపొందించవచ్చు, ఉదాహరణకు, ప్రయోగాత్మక డేటా బదిలీ ప్రోటోకాల్లను సృష్టించండి లేదా ప్రామాణికం కాని ప్రవర్తనతో స్థానిక మరియు రిమోట్ సేవలను ట్రోల్ చేయండి.
ముడి సాకెట్లు nfqueueతో చేతులు కలిపి పని చేస్తాయి, ఉదాహరణకు, సొరంగం ఇప్పటికే కాన్ఫిగర్ చేయబడి మరియు FOU కావలసిన పోర్ట్లో వింటున్నప్పుడు, మీరు అదే పోర్ట్ నుండి సాధారణ మార్గంలో ప్యాకెట్ను పంపలేరు - ఇది బిజీగా ఉంది, కానీ మీరు రా సాకెట్ని ఉపయోగించి యాదృచ్ఛికంగా రూపొందించబడిన ప్యాకెట్ను నేరుగా నెట్వర్క్ ఇంటర్ఫేస్కు తీసుకొని పంపవచ్చు, అయితే అటువంటి ప్యాకెట్ను రూపొందించడానికి కొంచెం ఎక్కువ టింకరింగ్ అవసరం. ఐపిపౌలో ప్రామాణీకరణతో ప్యాకెట్లు ఈ విధంగా సృష్టించబడతాయి.
ipipou కనెక్షన్ నుండి మొదటి ప్యాకెట్లను మాత్రమే ప్రాసెస్ చేస్తుంది (మరియు కనెక్షన్ స్థాపించబడటానికి ముందు క్యూలో లీక్ చేయగలిగినవి), పనితీరు దాదాపుగా బాధపడదు.
ipipou సర్వర్ ప్రామాణీకరించబడిన ప్యాకెట్ను స్వీకరించిన వెంటనే, ఒక సొరంగం సృష్టించబడుతుంది మరియు కనెక్షన్లోని అన్ని తదుపరి ప్యాకెట్లు ఇప్పటికే nfqueueని దాటవేసే కెర్నల్ ద్వారా ప్రాసెస్ చేయబడతాయి. కనెక్షన్ విఫలమైతే, అది ప్రామాణీకరణతో కూడిన ప్యాకెట్ కాకపోతే, చివరిగా గుర్తుంచుకోబడిన IP మరియు క్లయింట్ పోర్ట్ నుండి, సెట్టింగ్లను బట్టి తదుపరి దాని మొదటి ప్యాకెట్ nfqueue క్యూకి పంపబడుతుంది. ఆన్ లేదా విస్మరించబడింది. ప్రమాణీకరించబడిన ప్యాకెట్ కొత్త IP మరియు పోర్ట్ నుండి వచ్చినట్లయితే, వాటిని ఉపయోగించడానికి సొరంగం మళ్లీ కాన్ఫిగర్ చేయబడుతుంది.
NATతో పనిచేసేటప్పుడు సాధారణ IPIP-over-FOUకి మరో సమస్య ఉంది - UDPలో ఒకే IPతో కప్పబడిన రెండు IPIP సొరంగాలను సృష్టించడం అసాధ్యం, ఎందుకంటే FOU మరియు IPIP మాడ్యూల్లు ఒకదానికొకటి చాలా వేరుగా ఉంటాయి. ఆ. ఒకే పబ్లిక్ IP వెనుక ఉన్న ఒక జత క్లయింట్లు ఈ విధంగా ఒకే సర్వర్కి ఏకకాలంలో కనెక్ట్ చేయలేరు. భవిష్యత్తులో, బహుశా, ఇది కెర్నల్ స్థాయిలో పరిష్కరించబడుతుంది, కానీ ఇది ఖచ్చితంగా కాదు. ఈలోగా, NAT సమస్యలను NAT ద్వారా పరిష్కరించవచ్చు - ఒక జత IP చిరునామాలు ఇప్పటికే మరొక సొరంగం ద్వారా ఆక్రమించబడి ఉంటే, ipipou పబ్లిక్ నుండి ప్రత్యామ్నాయ ప్రైవేట్ IPకి NAT చేస్తుంది, voila! - పోర్ట్లు అయిపోయే వరకు మీరు సొరంగాలను సృష్టించవచ్చు.
ఎందుకంటే కనెక్షన్లోని అన్ని ప్యాకెట్లు సంతకం చేయబడవు, అప్పుడు ఈ సాధారణ రక్షణ MITMకు హాని కలిగిస్తుంది, కాబట్టి క్లయింట్ మరియు సర్వర్ల మధ్య దారిలో దాగి ఉన్న విలన్ ట్రాఫిక్ను విని దానిని మార్చగలడు, అతను దీని ద్వారా ప్రామాణీకరించబడిన ప్యాకెట్లను దారి మళ్లించవచ్చు. మరొక చిరునామా మరియు అవిశ్వసనీయ హోస్ట్ నుండి సొరంగం సృష్టించండి.
కోర్లో ఎక్కువ ట్రాఫిక్ను వదిలివేసేటప్పుడు దీన్ని ఎలా పరిష్కరించాలనే దానిపై ఎవరికైనా ఆలోచనలు ఉంటే, మాట్లాడటానికి వెనుకాడరు.
మార్గం ద్వారా, UDPలో ఎన్క్యాప్సులేషన్ చాలా బాగా నిరూపించబడింది. IP ద్వారా ఎన్క్యాప్సులేషన్తో పోలిస్తే, UDP హెడర్ యొక్క అదనపు ఓవర్హెడ్ ఉన్నప్పటికీ ఇది చాలా స్థిరంగా మరియు తరచుగా వేగంగా ఉంటుంది. TCP, UDP, ICMP అనే మూడు అత్యంత ప్రజాదరణ పొందిన ప్రోటోకాల్లతో మాత్రమే ఇంటర్నెట్లోని చాలా హోస్ట్లు బాగా పని చేయడం దీనికి కారణం. ఈ మూడింటికి మాత్రమే ఆప్టిమైజ్ చేయబడినందున ప్రత్యక్షమైన భాగం మిగతావన్నీ పూర్తిగా విస్మరించవచ్చు లేదా మరింత నెమ్మదిగా ప్రాసెస్ చేయవచ్చు.
ఉదాహరణకు, అందుకే HTTP/3 ఆధారంగా రూపొందించబడిన QUICK, UDP పైన సృష్టించబడింది మరియు IP పైన కాదు.
బాగా, తగినంత పదాలు, ఇది "వాస్తవ ప్రపంచంలో" ఎలా పని చేస్తుందో చూడడానికి సమయం ఆసన్నమైంది.
యుద్ధం
వాస్తవ ప్రపంచాన్ని అనుకరించడానికి ఉపయోగిస్తారు iperf3. వాస్తవికతకు దగ్గరగా ఉండే స్థాయి పరంగా, ఇది Minecraft లో వాస్తవ ప్రపంచాన్ని అనుకరించడం వలె ఉంటుంది, కానీ ప్రస్తుతానికి ఇది చేస్తుంది.
పోటీలో పాల్గొనేవారు:
సూచన ప్రధాన ఛానెల్
ఈ వ్యాసం యొక్క హీరో ipipou
ప్రామాణీకరణతో OpenVPN కానీ గుప్తీకరణ లేదు
అన్నీ కలిపిన మోడ్లో OpenVPN
PresharedKey లేకుండా WireGuard, MTU=1440తో (IPv4-మాత్రమే)
గీక్స్ కోసం సాంకేతిక డేటా కింది ఆదేశాలతో కొలమానాలు తీసుకోబడతాయి:
క్లయింట్ మీద:
UDP
CPULOG=NAME.udp.cpu.log; sar 10 6 >"$CPULOG" & iperf3 -c SERVER_IP -4 -t 60 -f m -i 10 -B LOCAL_IP -P 2 -u -b 12M; tail -1 "$CPULOG"
# Где "-b 12M" это пропускная способность основного канала, делённая на число потоков "-P", чтобы лишние пакеты не плодить и не портить производительность.