Double NAT traversal для домохозяек бесплатно

Хало 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. можно изменять интервал запросов, например предусмотреть команду “уменьшить/увеличить интервал опроса”.

Я рассмотрю случаи, в большинстве которых удалённым участником сети является компьютер.

Случай 1: у вас дома сервер, в кармане телефон. Передача с телефона на компьютер.
Случай 2: у вас дома сервер, вы бухаете у друга пиво, у друга есть компьютер. Передача компьютер-компьютер.
Случай 3: у вашей бабушки на даче телефон, у вас в кармане телефон. Где-то, в наблюдаемой Вселенной, с посрать каким географическим расположением, существует компьютер с высоким аптаймом. Передача телефон-компьютер-телефон.
Во всех случаях, все телефоны, все компьютеры, находятся по недостижимую сторону NAT.

Готовые mesh VPN которые можно использовать:

  • tailscale. Есть для Windows, Linux, Andoid.
  • zerotier. Windows, Linux, Andoid, FreeBSD.
  • radminvpn. Только Windows. По слухам, Android-работы ведутся.

С ipv6-адресацией:

  • yggdrasil. Есть на все системы.

При наличии проходного компьютера с достижимым адресом: (выходит за рамки темы, мы условились ни покупать дедик, ни платить за белый IP)

  • для устаревших систем (Windows 95, 98): tinc
  • для систем без установки сторонних клиентов: SoftEther

Универсальная:

  • 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:

Установив (распаковав) делаем это:

  • дважды проверить, не блочит ли его 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 / Хабр

<нытьё>добавить несуществующие теги невозможно, вы бы сделали редактор какой, а</нытьё>

100-150 рублей в месяц за один выделенный IP адрес думаю не такой большой урон для того чтобы организовать свою домашнюю сеть, где ИНЕТ будет как транспорт

Уже более 5 лет как по этому принципу работает у меня управление всеми воротами, калитками, шлагбаумами и прочими механизмами в нескольких жилых комплексах. Таким образом не имею статического адреса ни на одном объекте и ни каких пробросов портов для преодоления NAT. Так что всё это старо как мир.

2 лайка

upd: 7001cd5c2188d2fb5fcc6d9536e5768fea4d93ad торрент кумулятивного обновления, админы поправьте пост если не лень позязя.