Как работают IPv4-прокси в сетях с NAT64: технические ограничения и кейсы применения
Содержание
- NAT64 и IPv4-прокси: странная парочка
- Как это выглядит на практике
- Главные грабли
- Реальные кейсы: когда без прокси никак
- Технические ограничения: цифры и факты
- Как выбрать прокси для NAT64-сети
- Когда прокси ломает NAT64
- Решение проблем: конкретные шаги
- Практический пример: поднимаем всё вместе
- Итоги: стоит ли овчинка выделки
NAT64 и IPv4-прокси: странная парочка
NAT64 — технология-переходник. Позволяет IPv6-клиентам стучаться в IPv4-мир. Прокси поверх этого — отдельный цирк с конями.
Механизм простой: DNS64 синтезирует AAAA-записи из A-записей. Клиент шлёт пакет на IPv6-адрес, шлюз NAT64 выкусывает IPv4-адрес из суффикса, делает трансляцию. IPv4-прокси внутри такой сети — дополнительный слой абстракции.
Если ты втыкаешь обычный HTTP/HTTPS-прокси в сеть с NAT64 — работает. Но с сюрпризами. Особенно когда прокси требует прямой IPv4-связности. Или когда приложение не умеет работать с прокси, а только с сокетами.
Как это выглядит на практике
Возьмём типовую схему: провайдер выдал только IPv6. На CPE стоит NAT64-шлюз. Внутри сети — IPv6-клиенты.
Клиент шлёт запрос к `proxy.example.com`. DNS64 возвращает IPv6-адрес. Пакет летит к NAT64-шлюзу. Тот транслирует в IPv4 и шлёт на реальный прокси.
Прокси получает запрос, видит IPv4-адрес NAT64-шлюза. Отвечает обратно. NAT64 транслирует обратно в IPv6.
Всё работает. Пока не упрёшься в ограничения.
Главные грабли
**MTU и фрагментация**. NAT64 режет пакеты. Прокси-трафик часто летает с MSS выше 1280 байт. Если на пути стоит NAT64 без PMTUD — получаешь чёрные дыры.
Проверяется просто:
```bash
ping -M do -s 1472 proxy.example.com
```
Если не отвечает — MTU-проблема.
**TCP keepalive**. NAT64-шлюзы имеют таймауты на трансляцию. Обычно 5-10 минут. Если прокси держит соединение дольше — NAT64 забывает о нём. Пакеты летят вникуда.
Решение — настраивать keepalive на клиенте:
```bash
echo 60 > /proc/sys/net/ipv4/tcp_keepalive_time
```
**UDP-трафик**. DNS через прокси — отдельная боль. NAT64 не дружит с UDP-фрагментацией. Если DNS-ответ больше 1232 байт — всё, труба.
Реальные кейсы: когда без прокси никак
**Кейс: старый софт, который умеет только IPv4**
Бывает legacy-приложение. Писано под IPv4. Требует прямого доступа к IPv4-ресурсам. NAT64 его спасает не всегда — приложение может использовать raw-сокеты или специфичные протоколы.
Тут прокси — палочка-выручалочка. Ставишь HTTP-прокси на NAT64-шлюзе. Приложение шлёт запросы через прокси. Прокси уже сам ходит в IPv4-мир.
```python
import requests
proxies = {
'http': 'http://192.0.2.1:3128',
'https': 'http://192.0.2.1:3128'
}
response = requests.get('http://ipv4.example.com', proxies=proxies)
print(response.text)
```
**Кейс: обход блокировок по протоколу**
Некоторые NAT64-шлюзы режут трафик по портам. Например, блокируют 25-й порт (SMTP). Прокси на другом порту решает проблему.
**Кейс: тестирование IPv6-приложений**
Разработчикам нужно проверить, как их сервис работает через IPv6. Ставят прокси, который форвардит трафик через NAT64. Получают реальную картину с потерями пакетов и задержками.
Технические ограничения: цифры и факты
Параметр | NAT64 без прокси | NAT64 + прокси
---------|------------------|----------------
MTU | 1280 байт (минимальный) | 1500 байт (если прокси не режет)
Задержка | +1-3 мс | +5-15 мс (из-за дополнительной обработки)
Количество одновременных соединений | Ограничено ресурсами шлюза | Ограничено прокси (обычно выше)
Поддержка UDP | Частичная | Полная (если прокси умеет)
Прозрачность для приложений | Высокая | Средняя (нужна настройка прокси)
Задержка на NAT64-шлюзе — это не шутки. Каждый пакет проходит трансляцию. Плюс прокси добавляет свою обработку. Итого на ровном месте теряешь 10-20 мс.
Как выбрать прокси для NAT64-сети
**Требования к прокси-серверу:**
1. Поддержка IPv6 на входящем интерфейсе. Прокси должен принимать соединения по IPv6.
2. Поддержка IPv4 на исходящем интерфейсе. Иначе смысл теряется.
3. Настройка MTU. Прокси должен уметь фрагментировать пакеты для NAT64.
4. Логирование. Без него не отследишь проблемы с трансляцией.
**Настройка Squid для NAT64:**
```bash
http_port 3128
acl localnet src ::1/128
acl localnet src fe80::/10
http_access allow localnet
forwarded_for on
```
**Настройка 3proxy:**
```bash
proxy -p3128 -6 -n -a
```
Флаг `-6` включает IPv6 на входящем интерфейсе. `-n` — не транслировать адреса.
Когда прокси ломает NAT64
Бывают ситуации, когда прокси только мешает.
**Double NAT**. Прокси делает свою трансляцию. NAT64 — свою. Получается двойная трансляция. Пакеты теряются на ровном месте.
**Проблемы с SNI**. HTTPS-прокси может не передавать SNI. NAT64 без SNI не понимает, куда форвардить запрос.
**TCP RST**. Прокси может слать RST при ошибках. NAT64 это не всегда корректно обрабатывает.
Решение проблем: конкретные шаги
**Проблема: пакеты не доходят**
Проверяем MTU:
```bash
ping -M do -s 1452 -c 5 2001:db8::1
```
Если не пингуется — снижаем MTU на интерфейсе:
```bash
ip link set dev eth0 mtu 1280
```
**Проблема: медленные соединения**
Смотрим логи NAT64:
```bash
tcpdump -i nat64_iface -n port 3128
```
Ищем пакеты с флагом `[S.]` без ответа — это потерянные SYN.
**Проблема: DNS не резолвится**
Проверяем, что DNS64 работает:
```bash
dig AAAA proxy.example.com @dns64_server
```
Если ответ пустой — DNS64 не синтезирует записи. Меняем DNS-сервер.
Практический пример: поднимаем всё вместе
Ставим NAT64 на Linux:
```bash
apt install tayga
```
Конфиг `/etc/tayga/tayga.conf`:
```
tun-device nat64
ipv4-addr 192.168.255.1
prefix 64:ff9b::/96
dynamic-pool 192.168.255.0/24
data-dir /var/spool/tayga
```
Поднимаем:
```bash
tayga --mktun
ip link set nat64 up
ip addr add 192.168.255.1/24 dev nat64
ip route add 64:ff9b::/96 dev nat64
```
Ставим 3proxy:
```bash
apt install 3proxy
```
Конфиг `/etc/3proxy/3proxy.cfg`:
```
nscache 65536
nserver 8.8.8.8
nserver 8.8.4.4
config /etc/3proxy/3proxy.cfg
monitor /etc/3proxy/3proxy.cfg
log /var/log/3proxy.log D
logformat "- +_L%L.%d %H:%M:%S %N.%p %E %U %C:%c %R:%r %O %I %h %T"
rotate 30
auth none
allow * * * * 80-88,8080-8088 * * * *
proxy -p3128 -6 -n -a
```
Запускаем:
```bash
systemctl start 3proxy
```
Теперь клиенты с IPv6 могут ходить через прокси на 3128 порту. Прокси сам форвардит запросы в IPv4-мир через NAT64.
Итоги: стоит ли овчинка выделки
NAT64 + IPv4-прокси — рабочая схема. Но не панацея.
Если у тебя чистый IPv6 и нужно достучаться до IPv4-ресурсов — ставь прокси. Если приложение не умеет работать с прокси — используй NAT64 напрямую.
Главное — не забывай про MTU, keepalive и таймауты NAT64. Иначе будешь долго искать, почему соединения рвутся.
На lexic.ml уже 9 лет решают такие задачи. IPv4-прокси в IPv6-сетях — их хлеб. Если не хочешь возиться с настройкой NAT64 — бери готовое решение.
Помни: любая трансляция — компромисс. NAT64 жрёт производительность. Прокси добавляет сложность. Но иногда это единственный способ заставить старый софт работать в новой сети.