Хало All. Навеяно собственными потребностями, но я думаю для сообщества эта тема тоже насущна. Честно говоря, вопрос объёмный, и хотелось пощупать наиболее востребованные сценарии, но не нашёл где запилить голосовалку. Да и думаю одинаково будет нужно и под win и на линь.
Преамбула (для случайно забредших, постоянным участникам можно не читать)
Есть три возможных сценария, какой человек щас это всё читает:
- сетевик или девопс с опытом, который все эти ваши уровни OSI помнит наизусть
- обычный человек, всмысле это нормальный пользователь ПК которого не напрягает вбить пару команд в консоли и подкрутить в реестре, но он может чего-то не знать
- вообще деревянный новичок который следит за курсором мышки взглядом и в голове прокручивает последовательность dragndrop (подвести курсор, нажать кнопку мышки, перетащить вот в этот угол, отжать кнопку) чуть ли вслух не проговаривая.
Я очень всерьёз рассчитываю на второго читателя, то есть если вы впервые слышите что прервать bat-файл это кнопка ctrl+c, то позязя, почитайте базу хотя-бы для вида. У вас также не должна вызывать шок мысль что можно под одно использовать linux а под другое windows, всмысле уверенно неуверенно вы должны знать обе системы. Обрадую тем что мир linux чужд мне и я уже лет 20 плотненько в windows, так что может мой охват аудитории будет больше. А может и меньше, тренды они такие.
Если вы абсолютный новичок, то читать это
Сетевая модель OSI — Википедия
NAT — Википедия
VPN — Википедия
Оверлейная сеть — Википедия
Есть на хабре человек, которого зовут pureacetone. У него в профиле написано “энтузиаст децентрализованных сетей”. Я лично себя энтузиастом сетей не считаю, но у Ацетона много полезных статей, собсно основную часть знаний по рассматриваемой дальше теме я узнал от него. В конце поста приведу список чтива.
FYI: мне влом сейчас копаться в API тележки, так что писать queryback-протокол для газового котла у бабушки, с симкой Телематика от МТС (100 руб, 500 Мбайт/месяц, 32-1024 кбит/с) я не буду. Может быть потом.
Вкратце основные мысли такого протокола:
- совершать запрос должно ведомое устройство, а не ведущее.
- не существует возможности дать команду ведомому. вместо этого ведомое должно проверять, действует ли какая-либо команда, сейчас.
- можно изменять интервал запросов, например предусмотреть команду “уменьшить/увеличить интервал опроса”.
Я рассмотрю случаи, в большинстве которых удалённым участником сети является компьютер.
Случай 1: у вас дома сервер, в кармане телефон. Передача с телефона на компьютер.
Случай 2: у вас дома сервер, вы бухаете у друга пиво, у друга есть компьютер. Передача компьютер-компьютер.
Случай 3: у вашей бабушки на даче телефон, у вас в кармане телефон. Где-то, в наблюдаемой Вселенной, с посрать каким географическим расположением, существует компьютер с высоким аптаймом. Передача телефон-компьютер-телефон.
Во всех случаях, все телефоны, все компьютеры, находятся по недостижимую сторону NAT.
Готовые mesh VPN которые можно использовать:
- tailscale. Есть для Windows, Linux, Andoid.
- zerotier. Windows, Linux, Andoid, FreeBSD.
- radminvpn. Только Windows. По слухам, Android-работы ведутся.
С ipv6-адресацией:
- yggdrasil. Есть на все системы.
При наличии проходного компьютера с достижимым адресом: (выходит за рамки темы, мы условились ни покупать дедик, ни платить за белый IP)
Универсальная:
- i2p. Есть на все системы, начиная с Windows XP. Проще в настройке нежели ygg, и имеет более низкие системные требования; но медленная.
Проприетарные сети можно держать в уголке памяти, но хрен знает что там создателям взбредёт. Полагаясь на эти решения, вы полагаетесь на единую точку отказа. Поэтому дальнейшие схемы я буду рассматривать для ygg и i2p. Это первое.
Второе. Здесь и далее я буду рассматривать установку на Windows, отличия от линь-систем в основном касаются механизмов запуска (systemd вместо WSM и т п), в конф файлах пишется всё то же самое. Максимум переводы строк в файлах могут быть CR вместо CR LF, вот и всё отличие. Ну не сложилось у меня с линухом, сорян. Есличо, всё легко нагугливается.
Реализация случая 1.
- ставим на телефон i2pd
(либо F-droid и оттуда ставим Yggdrasil) - ставим такой же демон сети на комп
- поднимаем вебприложение, winsock-приложение и т п, в общем обеспечиваем функции (включалку чайника, web relay shield и т п)
- стыкуем
Реализация случая 2.
- всё то же самое, но из цепочки исключается возня с apk файлами
Реализация случая 3.
- ставим
- поднимаем на компе queryback-приложение и придумываем способ снять его показания с телефона в пассивном режиме. например, веб-страница, которая имеет кнопки на которые можно нажимать со стороны телефона-клиента, и звуки которые она может проиграть, на стороне телефона-сервера. звуки слушаем через DTMF или FFT. либо мигаем экраном и смотрим фотодиодом, короче стыкуем телефон с дуиной.
- телефон-сервер делает постоянные регулярные запросы к приложению (на компьютер)
- телефон-клиент делает редкие нерегулярные запросы.
Понадобится для дальнейших операций. Файл %path%\sudo.bat:
@powershell -Command "Start-Process cmd -Verb RunAs -ArgumentList '/c cd /d %cd% && %*'"
Хотите почитать вывод - поменять /c на /k, либо первая команда sudo cmd
Как установить ygg на Windows 7:
- проверяем чтобы стояли KB2921916, KB3063858 и KB4474419-v3
- проверяем, не протухли ли корневые сертификаты. по необходимости применяем колдунство с rootsupd. взять тексты новых актуальных сертификатов можно с любой системы win10.
- если всё равно не ставится, катаем кумулятивное обновление докучи, этого добра полно в торренте, ссылку не скажу. если очень надо и вы не умеете искать, скажу BTIH но я его не помню и надо найти.
sudo msiexec /i ygg-version.msi /quiet /norestart
-
ncpa.cpl
и проверить что есть wireguard-адаптер с именем yggdrasil. имя можно менять в %programdata%\yggdrasil\yggdrasil.conf - там же, в Peers[] вписываем адреса публичных узлов, которые можно взять здесь. география узлов влияет на пинг.
- либо то же самое можно вписать в InterfacePeers если надо чтобы сеть цеплялась через нужный NIC. актуально, в условиях пользования радмином и прочим протоном. если по какому-то недоразумению у вас русская Windows и вы не хотите возиться UTF кодировкой, выясняя нужен/не нужен файлу BOM и не ошиблись ли вы в кавычках - переименовать NIC в Windows можно из под адм. powershell командами:
Get-NetAdapter
Rename-NetAdapter -InterfaceIndex 22 -NewName 'Ethernet'
где 22 - номер NIC, выясненный первой командой. - Windows 7 и 8, короче Windows меньше 10 - установщик пишет кривые переводы строк (склеиваются), и только блокнот 10 винды понимает его нормально. Починить файл - команда
type yggdrasil.conf | find "" /v > ygg_fixed.conf
dir ygg_fixed.conf
Файл заменить.
del yggdrasil.conf
ren ygg_fixed.conf yggdrasil.conf
- после редактирования yggdrasil.conf перезапустить:
sudo net stop yggdrasil
sudo net start yggdrasil
На Windows 8-11:
- особого колдунства не требуется. тут всё написано.
Как установить i2pd:
- есть инсталлер. он автоматически впишет исключение в Windows Firewall.
- если установка делается из zip архива, то исключение надо добавить. окно Windows Firewall покажется только если запустить i2pd с обычными привилегиями, поэтому не надо сразу пытаться запустить из под системы (можно, если знаете что делаете).
- по умолчанию находится в кооперативном режиме с сильным лимитом трафика. его можно понизить, находится в i2pd.conf, называется bandwidth=
- лог можно отключить, называется loglevel=
- по умолчанию слушает 127.0.0.1, если используете машину как прокси и будете обращаться снаружи, надо поменять на 0.0.0.0 чтобы IP этой машины был доступен.
называется address= в [httpproxy] - привязать к нужному NIC можно в ifname=
есть ifname4 и ifname6
На Windows XP:
- должен стоять MSVCR 2015.
Установив (распаковав) делаем это:
- дважды проверить, не блочит ли его firewall (это типовой вопрос, почему не работает). на странице 127.0.0.1:7070 есть отчёт о состояни сети, там:
→ количество роутеров должно быть больше 0
→ количество клиентских туннелей должно быть 2 или больше
→ успешности создания туннелей должна быть лучше 0%
→ счётчики трафика должны что-то мотать - сделав выводы о том что сеть вроде как пашет, можно выгрузить процесс i2pd.exe и переместить к нему содержимое каталога %userprofile%\appdata\roaming\i2pd к файлу i2pd.exe (чтобы i2pd.conf оказался рядом с ним). это переводит i2pd в портативный режим - он понадобится, при регистрации службы.
Как зарегистрировать i2pd в качестве службы:
- понадобится NSSM.
для старых версий Windows (XP, Vista, 7, 8, 8.1) - nssm 2.24 (2014-08-31)
для новых версий (10, 11) - nssm 2.24-101-g897c7ad (2017-04-26) - далее из под админа делаем это:
nssm install i2pd "c:\program files\i2pd\i2pd.exe"
nssm set i2pd appnoconsole 1
sc failure i2pd reset= 40 actions= restart/15000/restart/15000/restart/15000
Стыковка с приложением. Как пользоваться.
Внутри yggdrasil вы получаете белый ipv6-адрес из диапазона 200::/7, поэтому если у вас запущен какой-то сервер, будьте няшей, пощёлкайте настройки в WF или какой у вас фаерволл. И внимательно с SMB и RDP. Помните, NAT вас больше не защищает. Пионэры бывают и в Яге. Не скажу насчёт ipv6 у Ethernet shield, если умеет - збс. Если нет, используйте прокси. Для обслуживания веб-приложений подходят любые веб-серверы, по-моему даже denwer (но это неточно). Короче, всё так же как в домашней сети, но с учётом специфики ipv6.
Внутри i2p интереснее, можно использовать клиентские туннели, а они имеют такой же адрес как у машины, на которой крутится i2p/i2pd, и отличаются только портом. Логичный максимум - не более 65535 туннелей, не включая то что система требует под себя.
Как это сделать. Допустим надо пощёлкать чайниками с web relay.
На сервере делаем это:
- топаем в каталог i2pd, открываем tunnels.conf
- пишем:
[MYSERVER]
type = http
host = 127.0.0.1
port = 80
inport = 80
keys = key_in.dat
gzip = false
- перезапускаем i2pd. в новых версиях есть команда Reload tunnels
- открываем http://127.0.0.1:7070/?page=i2p_tunnels и смотрим Server tunnels. там будет написан длинный адрес в доменной зоне b32.i2p и номер порта. этот порт - inport, он относится к этому b32 адресу, то есть он внутрисетевой. port - номер порта по которому host ожидает соединение. туда можно вписать адрес/порт web relay или что там надо.
На клиенте делаем это (тоже с файлом tunnels.conf):
- пишем
[MYCLIENT]
type = client
address = 127.0.0.1
port = 90
destination = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.b32.i2p
destinationport = 80
keys = key_out.dat
- destination - тот адрес, который узнали на странице с туннелями.
- port - номер порта, на котором @ 127.0.0.1 будет висеть интерфейс удалённого ресурса. выглядеть это будет как прокси, которая даёт вам вместо домена адрес 127.0.0.1:некий_порт. В этом примере - 90.
- для работы по b32-доменам - указываем HTTP-прокси 127.0.0.1:4444
→ на windows:control inetcpl.cpl
, вкладка Connections, кнопка LAN settings
→ на android: как правило находится в свойствах WiFi-подключения. существуют расширения для обозревателя.
для обращений по 127.0.0.1:client_port работать через прокси необязательно.
Самое приятное - прокси пролазит сквозь любую сеть, можете хоть из самолёта зайти, у них там вроде есть доступ к инету по специальному кабелю. И оно понимает любые ipv4-проги, даже древний софт написанный в 90х. Но повторяю, сеть медленная и лучше всего она подходит только для текста.
Файлы *.dat - файл ключа. Ценность серверного файла - адрес. Нет файла - нет адреса, если потеряется, то адрес будет другой. Ценность клинтского файла - тоже адрес, в i2p есть понятие зашифрованного лизсета (списка аренды), это даёт возможность лазить на определённый ресурс только определённым клиентам. По сути - белый список, защищающий от постороннего доступа на уровне протокола. Потеряете файл ключа на клиенте, когда у сервера был включен фильтр - придётся снаряжать тойоту и ехать по степи к серверу, чтобы переконфигурировать его под новый ключ. Неудобняк.
Мнение бабушек: “вот эти ваши вот VPNы, Tor/I2P, то сё моё, даркнет. теребонькаете небось? веществами торгуете”.
Ничё подобного. Сквозь ваши машины невозможно пропихнуть свою прокси и взломать пентагон. Вы не являетесь для посторонних ни входной, ни выходной точкой, сеть изолирована. Интернет это интернет, i2p это i2p. Вы ничего не нарушаете. То же самое про yggdrasil. Но в отношении последней надо быть аккуратнее, следите за безопасностью. Любые ваши серверы запущенные без фаерволла, будут видны на всю сеть.
Сборки для android
Yggdrasil | F-Droid - Free and Open Source Android App Repository
i2pd | F-Droid - Free and Open Source Android App Repository
Литература
Туннели I2P: Чесночное шифрование и однонаправленная передача информации / Хабр
Транзитный трафик I2P: дыхание сети и важное требование анонимности / Хабр
Кому нужны скрытые сети? Заметка без романтических небылиц о даркнете / Хабр
Мультихоуминг в I2P — защита от тайминг-атаки и дополнительная гарантия аптайма / Хабр
Администратор узла сети I2P. Полный курс / Хабр
Как I2P-роутер работает без выделенного IP-адреса. Магия прямого подключения двух абонентов за NAT-ом / Хабр
i2pd-tools: дополнительные утилиты I2P / Хабр
Как НЕ СТОИТ использовать I2P и TOR / Хабр
I2P over Yggdrasil: анонимность в меш-сетях / Хабр
Yggdrasil Network: Заря бытовых меш-сетей, или Интернет будущего / Хабр
Новый виток развития Yggdrasil / Хабр
Yggdrasil Network 0.4 — Скачок в развитии защищенной самоорганизующейся сети / Хабр
Установка Yggdrasil Network на Windows / Хабр
Wireguard VPN, Yggdrasil, ALFIS DNS и AdGuard / Хабр
Межсетевой прокси: Доступ в Интернет, Tor, I2P и другие сети через Yggdrasil / Хабр
<нытьё>добавить несуществующие теги невозможно, вы бы сделали редактор какой, а</нытьё>