Перейти к содержимому

Сетевые оверлеи

Маршрутизация исходящего трафика и привязка слушателей через оверлейные сети (SOCKS5-прокси, Tor, Tailscale mesh, I2P). Выбор оверлея включается по запросу для каждого вызова и наследуется через границы функций, процессов и HTTP.

KindОписание
network.socks5Обобщённый SOCKS5-прокси (также покрывает SOCKS5-слушатель Tor)
network.tailscaleОверлейный узел Tailscale tsnet
network.i2pМост I2P SAM v3
- name: proxy
kind: network.socks5
host: 127.0.0.1
port: 1080
username: "optional"
password: "optional"
isolate_streams: false
ПолеТипОписание
hoststringХост прокси
portintПорт прокси (1-65535)
usernamestringОпциональная SOCKS5-аутентификация
passwordstringОпциональная SOCKS5-аутентификация
isolate_streamsboolСлучайные учётные данные для каждого соединения (изоляция потоков Tor)
- name: tailnet
kind: network.tailscale
hostname: "wippy-node"
auth_key_env: "TS_AUTHKEY"
ephemeral: false
control_url: ""
ПолеТипОписание
hostnamestringИмя узла tsnet (используется в каталоге состояния для каждого узла)
auth_keystringВстроенный ключ аутентификации tailnet
auth_key_envstringИмя переменной окружения с ключом аутентификации (разрешается через env-реестр)
state_dirstringПереопределение каталога состояния tsnet
control_urlstringАльтернативный координационный сервер
ephemeralboolРегистрация как эфемерного узла tailnet

Требуется либо auth_key, либо auth_key_env.

- name: i2p_bridge
kind: network.i2p
host: 127.0.0.1
port: 7656
session_name: "wippy"
ПолеТипОписание
hoststringХост моста SAM v3
portintПорт моста SAM v3
session_namestringОпциональный идентификатор сессии

Привязка слушателя сервера через оверлей (Tailscale, I2P):

- name: gateway
kind: http.service
addr: ":8080"
network: app.net:tailnet

SOCKS5 не поддерживает входящее прослушивание — используйте его только для исходящих соединений.

Маршрутизируйте вызванную функцию или порождённый процесс через оверлей с помощью with_options:

local funcs = require("funcs")
local result, err = funcs.new()
:with_options({ network = "app.net:proxy" })
:call("app.api:fetch_data")
local pid, err = process.with_options({ network = "app.net:tailnet" })
:spawn_monitored("app.workers:probe", "app:processes")

Модуль http_client принимает тот же выбор оверлея в опциях для каждого вызова под ключом overlay_network.

Выбор оверлея передаётся через стек вызовов. Функция, вызванная через funcs.new():with_options({network=...}), видит оверлей в каждом внутреннем соединении, в каждом вложенном funcs.call и в каждом process.spawn, который она выполняет — до тех пор, пока потомок явно не выберет другой оверлей или не очистит его.

Неявное наследование обходит собственные правила запрета network.select потомка. Проверяется только явный выбор на границе Lua.

Драйверы оверлеев читают общеприложенческие настройки из блока network_service: в .wippy.yaml:

network_service:
state_dir: .wippy/net # базовый каталог для состояния драйверов (ключи Tailscale и т.п.)
default_network: app.net:tailnet # оверлей, применяемый, когда вызов не задаёт его
ПолеПо умолчаниюОписание
state_dir.wippy/netКаталог состояния драйверов. Относительные пути разрешаются от каталога загрузочного конфига.
default_networkRegistry ID оверлея, применяемого к любой задаче или процессу, не закрепляющему свою сеть через опции.

Записи оверлеев горячо заменяются при обновлении реестра. Когда конфигурация оверлея меняется, драйвер сначала строит замещающий сервис и подключает его только после успешного создания; если новая конфигурация не удаётся, существующий оверлей продолжает работать. Параллельные вызывающие видят либо старый, либо новый сервис, но никогда — разрыв.

ДействиеРесурсОписание
network.selectRegistry ID сетиЯвный выбор оверлея в funcs.call, process.spawn, http_client
network.bindRegistry ID сетиПривязка слушателя http.service через оверлей (поле network:)

Запретите network.select на области, чтобы код внутри неё не мог явно выбирать оверлей. Унаследованные оверлеи не затрагиваются — они были авторизованы у вызывающего. network.bind проверяется, когда сервер с оверлеем network: запускает свой слушатель.