FakeDNS

FakeDNS подменяет DNS-записи, чтобы получить целевое доменное имя, что позволяет сократить время DNS-запросов и получить целевое доменное имя при использовании прозрачного проксирования.

Внимание

FakeDNS может загрязнить локальный DNS-кэш, что может привести к "недоступности сети" после отключения Xray.

FakeDNSObject

FakeDNSObject соответствует полю fakedns в конфигурационном файле.

{
  "ipPool": "198.18.0.0/16",
  "poolSize": 65535
}

FakeDnsObject также может быть настроен как массив, содержащий несколько пулов FakeIP.
При получении DNS-запроса FakeDNS вернет набор FakeIP, полученных из нескольких пулов FakeIP.

[
  {
    "ipPool": "198.18.0.0/15",
    "poolSize": 65535
  },
  {
    "ipPool": "fc00::/18",
    "poolSize": 65535
  }
]

ipPool: CIDR

FakeDNS будет использовать этот блок IP-адресов для выделения адресов.

poolSize: int

Максимальное количество сопоставлений "домен - IP", которые FakeDNS может хранить в памяти.
Когда количество сопоставлений превышает это значение, старые сопоставления удаляются по алгоритму LRU.
Значение по умолчанию - 65535.

Внимание

poolSize должен быть меньше или равен общему количеству адресов в ipPool.

Подсказка

Если в поле dns конфигурационного файла указано fakedns, но FakeDnsObject не настроен, Xray инициализирует FakeDnsObject в соответствии с параметром queryStrategy компонента DNS.

Если queryStrategy равен UseIP, инициализированный пул FakeIP будет эквивалентен:

[
  {
    "ipPool": "198.18.0.0/15",
    "poolSize": 32768
  },
  {
    "ipPool": "fc00::/18",
    "poolSize": 32768
  }
]

Если queryStrategy равен UseIPv4, инициализированный пул FakeIP будет эквивалентен:

{
  "ipPool": "198.18.0.0/15",
  "poolSize": 65535
}

Если queryStrategy равен UseIPv6, инициализированный пул FakeIP будет эквивалентен:

{
  "ipPool": "fc00::/18",
  "poolSize": 65535
}

Как использовать FakeDNS?

По сути, FakeDNS - это DNS-сервер, который можно использовать с любыми правилами DNS.

Чтобы FakeDNS работал, необходимо направить DNS-запросы на него.

{
  "dns": {
    "servers": [
      "fakedns", // fakedns на первом месте
      "8.8.8.8"
    ]
  },
  "outbounds": [
    {
      "protocol": "dns",
      "tag": "dns-out"
    }
  ],
  "routing": {
    "rules": [
      {
        "type": "field",
        "inboundTag": ["dns-in"], // Перехват DNS-трафика, поступающего от DNS-входа или от входящего подключения прозрачного прокси.
        "port": 53,
        "outboundTag": "dns-out"
      }
    ]
  }
}

Когда внешний DNS-запрос поступает в компонент FakeDNS, он возвращает IP-адрес из своего пула ipPool в качестве фиктивного результата разрешения доменного имени и сохраняет сопоставление между доменным именем и фиктивным IP-адресом.

Кроме того, вам нужно включить Sniffing во входящем подключении, которое принимает трафик, который нужно проксировать, и использовать fakedns для замены целевого адреса на стороне клиента.

"sniffing": {
  "enabled": true,
  "destOverride": ["fakedns"], // Используйте "fakedns" или в сочетании с другими снифферами, или используйте "fakedns+others".
  "metadataOnly": false        // Если этот параметр равен true, то в destOverride можно использовать только fakedns.
},

Внимание

Если FakeIP не будет правильно заменен на доменное имя, подключение к серверу не будет установлено.

Использование FakeDNS с другими типами DNS

Совместное использование с разделением DNS

При использовании разделения DNS, чтобы fakedns имел высокий приоритет, нужно добавить для него тот же параметр domains, что и для других типов DNS.

{
  "servers": [
    {
      "address": "fakedns",
      "domains": [
        // То же самое, что и в разделе разделения DNS ниже.
        "geosite:cn",
        "domain:example.com"
      ]
    },
    {
      "address": "1.2.3.4",
      "domains": ["geosite:cn"],
      "expectIPs": ["geoip:cn"]
    },
    {
      "address": "1.1.1.1",
      "domains": ["domain:example.com"]
    },
    "8.8.8.8"
  ]
}

Черный список FakeDNS

Если вы не хотите, чтобы FakeDNS использовался для определенных доменов, вы можете добавить параметр domains к другим типам конфигурации DNS, чтобы указать, что эти домены должны иметь более высокий приоритет при сопоставлении с другими DNS-серверами, чем с FakeDNS, тем самым реализовав механизм черного списка FakeDNS.

{
  "servers": [
    "fakedns",
    {
      "address": "1.2.3.4",
      "domains": ["domain:do-not-use-fakedns.com"]
    }
  ]
}

Белый список FakeDNS

Если вы хотите, чтобы FakeDNS использовался только для определенных доменов, вы можете добавить параметр domains к fakedns, чтобы указать, что эти домены должны иметь более высокий приоритет при сопоставлении с fakedns, чем с другими DNS-серверами, тем самым реализовав механизм белого списка FakeDNS.

{
  "servers": [
    "1.2.3.4",
    {
      "address": "fakedns",
      "domains": ["domain:only-this-use-fakedns.com"]
    }
  ]
}