# FakeDNS FakeDNS подменяет DNS-записи, чтобы получить целевое доменное имя, что позволяет сократить время DNS-запросов и получить целевое доменное имя при использовании прозрачного проксирования. ::: warning FakeDNS может загрязнить локальный DNS-кэш, что может привести к "недоступности сети" после отключения Xray. ::: ## FakeDNSObject `FakeDNSObject` соответствует полю `fakedns` в конфигурационном файле. ```json { "ipPool": "198.18.0.0/16", "poolSize": 65535 } ``` `FakeDnsObject` также может быть настроен как массив, содержащий несколько пулов FakeIP. При получении DNS-запроса FakeDNS вернет набор FakeIP, полученных из нескольких пулов FakeIP. ```json [ { "ipPool": "198.18.0.0/15", "poolSize": 65535 }, { "ipPool": "fc00::/18", "poolSize": 65535 } ] ``` > `ipPool`: CIDR FakeDNS будет использовать этот блок IP-адресов для выделения адресов. > `poolSize`: int Максимальное количество сопоставлений "домен - IP", которые FakeDNS может хранить в памяти. Когда количество сопоставлений превышает это значение, старые сопоставления удаляются по алгоритму LRU. Значение по умолчанию - 65535. ::: warning `poolSize` должен быть меньше или равен общему количеству адресов в `ipPool`. ::: ::: tip Если в поле `dns` конфигурационного файла указано `fakedns`, но `FakeDnsObject` не настроен, Xray инициализирует `FakeDnsObject` в соответствии с параметром `queryStrategy` компонента DNS. Если `queryStrategy` равен `UseIP`, инициализированный пул FakeIP будет эквивалентен: ```json [ { "ipPool": "198.18.0.0/15", "poolSize": 32768 }, { "ipPool": "fc00::/18", "poolSize": 32768 } ] ``` Если `queryStrategy` равен `UseIPv4`, инициализированный пул FakeIP будет эквивалентен: ```json { "ipPool": "198.18.0.0/15", "poolSize": 65535 } ``` Если `queryStrategy` равен `UseIPv6`, инициализированный пул FakeIP будет эквивалентен: ```json { "ipPool": "fc00::/18", "poolSize": 65535 } ``` ::: ### Как использовать FakeDNS? По сути, FakeDNS - это [DNS-сервер](./dns.md#serverobject), который можно использовать с любыми правилами DNS. Чтобы FakeDNS работал, необходимо направить DNS-запросы на него. ```json { "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` для замены целевого адреса **на стороне клиента**. ```json "sniffing": { "enabled": true, "destOverride": ["fakedns"], // Используйте "fakedns" или в сочетании с другими снифферами, или используйте "fakedns+others". "metadataOnly": false // Если этот параметр равен true, то в destOverride можно использовать только fakedns. }, ``` ::: warning Если FakeIP не будет правильно заменен на доменное имя, подключение к серверу не будет установлено. ::: ### Использование FakeDNS с другими типами DNS #### Совместное использование с разделением DNS При использовании разделения DNS, чтобы `fakedns` имел высокий приоритет, нужно добавить для него тот же параметр `domains`, что и для других типов DNS. ```json { "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. ```json { "servers": [ "fakedns", { "address": "1.2.3.4", "domains": ["domain:do-not-use-fakedns.com"] } ] } ``` #### Белый список FakeDNS Если вы хотите, чтобы FakeDNS использовался только для определенных доменов, вы можете добавить параметр `domains` к `fakedns`, чтобы указать, что эти домены должны иметь более высокий приоритет при сопоставлении с `fakedns`, чем с другими DNS-серверами, тем самым реализовав механизм белого списка FakeDNS. ```json { "servers": [ "1.2.3.4", { "address": "fakedns", "domains": ["domain:only-this-use-fakedns.com"] } ] } ```