Skip to content

Dokodemo-door — Xray-core

Dokodemo (по-японски «дверь куда угодно») — входящее подключение Xray для прозрачного проксирования. Оно слушает один или несколько портов и пересылает каждое принятое соединение на фиксированный адрес назначения — или, в Linux, на исходный адрес соединения до NAT через SO_ORIGINAL_DST / IP_TRANSPARENT.

Входящий

settings для входящего подключения с "protocol": "dokodemo-door":

ПолеТипПо умолчаниюДопустимые значенияОписание
allowedNetwork*NetworkList(any)tcp | udp | tcp,udpТранспортные протоколы, которые принимает входящее подключение. Каноническое имя для устаревшего поля `network`.
rewriteAddress*Address(unset)<host>Адрес назначения, на который переписывается пересылаемый трафик. Используется, когда `portMap` не совпал, а `followRedirect` равен false. Каноническое имя для устаревшего поля `address`.
rewritePortuint160<port>Порт назначения для пересылаемого трафика. Каноническое имя для устаревшего поля `port`.
network*NetworkList(alias)(alias of allowedNetwork)Устаревший псевдоним для `allowedNetwork`; если задан, при сборке перекрывает его.
address*Address(alias)(alias of rewriteAddress)Устаревший псевдоним для `rewriteAddress`; по-прежнему принимается и копируется в новое поле при сборке.
portuint16(alias)(alias of rewritePort)Устаревший псевдоним для `rewritePort`.
portMapmap[string]string{}{<src-port>: <host:port>}Переопределения назначения для отдельных портов. Ключи — прослушиваемые порты (в виде строк); значения — литералы `host:port`. Каждое значение проверяется при сборке конфигурации.
followRedirectboolfalsetrue | falseСчитывать исходный адрес назначения из ОС (Linux iptables SO_ORIGINAL_DST / tproxy). При true `address`/`port` становятся запасной целью на случай, если восстановить адрес не удалось.
userLeveluint320<uint32>Уровень политики по умолчанию для пересылаемых соединений.

Исходный код: infra/conf/dokodemo.go:10-20 · зафиксировано на v26.7.28 (5ca6f4b)

Примеры

Статический проброс порта — принимать на :5353 и пересылать на 1.1.1.1:53:

json
{
  "inbounds": [
    {
      "tag": "dns-forward",
      "listen": "0.0.0.0",
      "port": 5353,
      "protocol": "dokodemo-door",
      "settings": {
        "address": "1.1.1.1",
        "port": 53,
        "network": "tcp,udp"
      }
    }
  ]
}

Отображение по портам — принимать на нескольких портах и пересылать каждый на свой адрес назначения:

json
{
  "inbounds": [
    {
      "tag": "multi-forward",
      "listen": "0.0.0.0",
      "port": "80,443,5353",
      "protocol": "dokodemo-door",
      "settings": {
        "network": "tcp,udp",
        "portMap": {
          "80":   "10.0.0.10:80",
          "443":  "10.0.0.10:443",
          "5353": "1.1.1.1:53"
        }
      }
    }
  ]
}

Приёмник прозрачного прокси в Linux:

json
{
  "inbounds": [
    {
      "tag": "tproxy",
      "listen": "0.0.0.0",
      "port": 12345,
      "protocol": "dokodemo-door",
      "settings": {
        "network": "tcp,udp",
        "followRedirect": true
      },
      "streamSettings": {
        "sockopt": { "tproxy": "tproxy" }
      }
    }
  ]
}

Примечания

  • Недавние версии Xray переименовали поля: allowedNetwork / rewriteAddress / rewritePort — канонические имена, а старые network / address / port принимаются как псевдонимы (копируются в новые поля при сборке). Примеры на этой странице используют устаревшие имена — они по-прежнему работают; в новых конфигурациях можно использовать любой из вариантов.
  • Значения portMap, не являющиеся корректными литералами host:port, приводят к ошибке при запуске (infra/conf/dokodemo.go:39-43).
  • Чтобы followRedirect: true мог восстановить исходный адрес назначения, прослушивающему сокету нужен IP_TRANSPARENT (TPROXY), либо входящее подключение должно быть целью iptables REDIRECT. Это настраивается через streamSettings.sockopt.tproxy.
  • Когда ни address/port, ни portMap не совпали, а followRedirect не смог восстановить адрес назначения, соединение закрывается.
  • Поле port прослушивания на родительском объекте входящего подключения принимает как одиночный порт, так и список через запятую ("80,443") или диапазон ("5000-5010") — стандартный синтаксис списка портов для входящих подключений.

Сравнение с другими ядрами

  • У sing-box нет отдельной структуры dokodemo. Используйте входящее подключение Direct — его поля override_address / override_port покрывают случай статической цели, а режим TPROXY включается через tcp_fast_open / параметры сниффинга на уровне входящего подключения.
  • mihomo предлагает два варианта: запись в listeners: с type: tunnel или блок верхнего уровня tunnels: с компактной строковой формой через запятую. См. Tunnel — mihomo.

Исходный код: infra/conf/dokodemo.go:10-20 · v26.7.28 (5ca6f4b)

Core Tutorial от Argsment