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.9.9 (52a412d)

Примеры ​

Статический проброс порта — принимать на :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" }
      }
    }
  ]
}

Примечания ​

  • 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.
  • followRedirect вместе с sockopt.tproxy поддерживается и в OpenBSD.
  • Когда ни 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.9.9 (52a412d)

Core Tutorial от Argsment