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