You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

203 lines
7.2 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 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"]
}
]
}
```