Туура, биз бүгүн шифрлөө кудайына ушундай деп айтабыз.
Бул жерде биз шифрленбеген IPv4 туннели жөнүндө сүйлөшөбүз, бирок "жылы лампа" жөнүндө эмес, заманбап "LED" жөнүндө. Ошондой эле бул жерде чийки розеткалар жанып турат жана колдонуучу мейкиндигинде пакеттер менен иш жүрүп жатат.
Ар бир даамы жана түсү үчүн N туннелдик протоколдор бар:
Бирок мен программистмин, ошондуктан Nды бир аз гана көбөйтөм жана чыныгы протоколдорду иштеп чыгууну Коммерсанттын иштеп чыгуучуларына тапшырам.
Биринде али төрөлө элек долбоорМен азыр NAT артындагы хостторго сырттан жетүү. Бул үчүн чоңдордун криптографиясы менен протоколдорду колдонуп, мен бул замбиректен таранчыларды аткандай сезимди калтыра алган жокмун. Анткени туннель көбүнчө NAT-e тешиктерин ачуу үчүн гана колдонулат, ички трафик адатта шифрленген, бирок алар дагы эле HTTPSге чөгүп кетишет.
Ар кандай туннелдик протоколдорду изилдеп жатып, менин ички перфекционисттин көңүлү IPIPге анын минималдуу чыгымынан улам кайра-кайра бурулду. Бирок менин милдеттерим үчүн анын бир жарым олуттуу кемчиликтери бар:
ал эки тарапта коомдук IP талап кылат,
жана сиз үчүн аутентификация жок.
Ошондуктан, перфекционист кайра баш сөөктүн караңгы бурчуна же ал жерде отурган жерине айдалды.
Анан бир күнү макалаларды окуп жатып жергиликтүү колдоого алынган туннелдер Linuxта мен FOU (Foo-over-UDP) менен тааныштым, б.а. кандай болсо да, UDP менен оролгон. Азырынча IPIP жана GUE (Generic UDP Encapsulation) гана колдоого алынат.
«Мына күмүш ок! Мен үчүн жөнөкөй IPIP жетиштүү». - Мен ойлогом.
Чынында, ок толугу менен күмүш эмес болуп чыкты. UDPдеги инкапсуляция биринчи көйгөйдү чечет - сиз NAT артындагы кардарларга алдын ала түзүлгөн байланыш аркылуу туташа аласыз, бирок бул жерде IPIPтин кийинки кемчилигинин жарымы жаңы жарыкта гүлдөйт - жеке тармактын ар бир адамы көрүнгөндүн артына жашына алат. коомдук IP жана кардар порту (таза IPIPде бул көйгөй жок).
Бул бир жарым маселени чечүү үчүн, коммуналдык төрөлгөн ipipou. Ал 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 — кардардын коомдук ИМ
192.168.0.2 — eth0 интерфейсине ыйгарылган кардар IP
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 Basic Auth менен окшоштук эске түшөт) же купуя ачкыч менен кол коюлган атайын иштелип чыккан маалыматтар (HTTP Digest Auth сыяктуу күчтүүрөөк гана, функцияны караңыз) client_auth коддо).
Серверде (жалпыга ачык IP бар тарапта) ipipou иштей баштаганда, ал nfqueue кезегин иштеткичти түзөт жана нетфильтрди конфигурациялайт, ошентип керектүү пакеттер болушу керек болгон жерге жөнөтүлөт: пакеттер nfqueue кезегине туташууну инициализациялайт жана [дээрлик] калгандарынын бардыгы түз угуучуга FOU барат.
Билбегендер үчүн nfqueue (же NetfilterQueue) өзөк модулдарын кантип иштеп чыгууну билбеген ышкыбоздор үчүн өзгөчө нерсе, ал netfilter (nftables/iptables) аркылуу тармак пакеттерин колдонуучу мейкиндигине багыттоого жана аларды ошол жерде иштетүүгө мүмкүндүк берет. примитивдүү каражаттар: өзгөртүү (милдеттүү эмес) жана аны өзөккө кайтарып бериңиз, же жок кылыңыз.
Кээ бир программалоо тилдери үчүн nfqueue менен иштөө үчүн байланыштар бар, bash үчүн эч нерсе жок (хе, таң калыштуу эмес), мен python колдонууга туура келди: ipipou колдонот NetfilterQueue.
Эгерде аткаруу маанилүү болбосо, анда бул нерсени колдонуу менен сиз салыштырмалуу төмөн деңгээлдеги пакеттер менен иштөө үчүн өз логикаңызды тез жана оңой түзө аласыз, мисалы, эксперименталдык маалыматтарды өткөрүп берүү протоколдорун түзө аласыз же стандарттуу эмес жүрүм-турум менен жергиликтүү жана алыскы кызматтарды троллей аласыз.
Чийки розеткалар nfqueue менен кол кармашып иштешет, мисалы, туннель конфигурацияланганда жана FOU каалаган портту угуп жатканда, сиз бир эле порттон пакетти кадимки жол менен жөнөтө албайсыз - ал бош эмес, бирок чийки розетка аркылуу кокусунан түзүлгөн пакетти алып, түз тармак интерфейсине жөнөтө аласыз, бирок мындай пакетти түзүү бир аз көбүрөөк аракетти талап кылат. Ипипуда аутентификациясы бар пакеттер ушундайча түзүлөт.
Ipipou туташуунун биринчи пакеттерин (жана туташуу орнотулганга чейин кезекке агып кеткен пакеттерди) иштеткендиктен, өндүрүмдүүлүк дээрлик жабыр тартпайт.
ipipou сервери аутентификацияланган пакетти алаары менен туннель түзүлөт жана туташуудагы бардык кийинки пакеттер nfqueueди айланып өтүп, ядро тарабынан иштетилет. Эгер туташуу үзгүлтүккө учураса, кийинкисинин биринчи пакети орнотууларга жараша nfqueue кезегине жөнөтүлөт, эгерде ал аутентификациясы бар пакет эмес, бирок акыркы эсинде калган IP жана кардар портунан болсо, аны же өткөрүп берүүгө болот. же жок кылынган. Эгер аутентификацияланган пакет жаңы IP жана порттон келсе, туннель аларды колдонуу үчүн кайра конфигурацияланат.
Кадимки IPIP-over-FOUдо NAT менен иштөөдө дагы бир көйгөй бар - бир эле IP менен UDPде капсулаланган эки IPIP туннелин түзүү мүмкүн эмес, анткени FOU жана IPIP модулдары бири-биринен кыйла обочолонгон. Ошол. бир эле коомдук IP артында бир жуп кардарлар бир эле серверге ушундай жол менен туташа албайт. Келечекте, мүмкүн, ал ядро деңгээлинде чечилет, бирок бул так эмес. Ошол эле учурда, NAT көйгөйлөрүн NAT чечсе болот - эгер бир жуп IP даректери башка туннельде ээлеп калса, ipipou NATти жалпысынан альтернативалуу жеке IPге өткөрөт, voila! - порттор түгөнгүчө туннелдерди түзө аласыз.
Анткени Туташуудагы бардык пакеттерге кол коюлган эмес, анда бул жөнөкөй коргоо MITM үчүн аялуу, андыктан, кардар менен сервердин ортосунда трафикти угуп, аны башкара алган кара ниет адам жашынып калса, анда ал аутентификацияланган пакеттерди кайра багыттай алат. башка дарек жана ишенимсиз хосттон туннель түзүңүз.
Эгер кимдир бирөө трафиктин негизги бөлүгүн өзөктө калтырып, муну кантип оңдоо боюнча идеялары бар болсо, айтуудан тартынбаңыз.
Айтмакчы, UDPде инкапсуляция өзүн абдан жакшы далилдеди. IP аркылуу инкапсуляцияга салыштырмалуу, UDP башынын кошумча чыгымына карабастан, ал кыйла туруктуу жана тезирээк. Бул Интернеттеги көпчүлүк хосттор үч эң популярдуу протоколдор менен гана жакшы иштеши менен шартталган: TCP, UDP, ICMP. Материалдык бөлүгү башкалардын баарын толугу менен таштай алат же жайыраак иштете алат, анткени ал ушул үчөө үчүн гана оптималдаштырылган.
Мисалы, ушул себептен HTTP/3 негизделген QUICK IP үстүнө эмес, UDP үстүнө түзүлгөн.
Ооба, жетиштүү сөздөр, ал "чыныгы дүйнөдө" кантип иштээрин көрүүгө убакыт келди.
Согуш
Чыныгы дүйнөнү туураш үчүн колдонулат iperf3. Чындыкка жакындык даражасы боюнча, бул болжол менен Minecraftдагы чыныгы дүйнөнү туураганга окшош, бирок азыр ал жасайт.
Сынактын катышуучулары:
шилтеме негизги канал
Бул макаланын каарманы - ipipou
Аутентификациясы бар OpenVPN, бирок шифрлөө жок
OpenVPN бардыгын камтыган режимде
PresharedKey жок WireGuard, MTU=1440 менен (IPv4 үчүн гана)
Geeks үчүн техникалык маалыматтар Метрикалар төмөнкү буйруктар менен кабыл алынат:
кардар боюнча:
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", чтобы лишние пакеты не плодить и не портить производительность.