В последнее время все чаще встречаются жалобы на сбои в работе некоторых приложений при использовании VPN или прокси. Например, могут не приходить сообщения в WhatsApp или не загружаться сторис в Instagram. Эти проблемы иногда исчезают сами собой через 10-15 минут после подключения, но снова возникают при повторном подключении или открытии приложения. Также часто отмечается, что некоторые заблокированные сервисы и сайты остаются недоступными даже через VPN или прокси.
Современный интернет функционирует на основе протокола связи под названием Internet Protocol (IP). Существуют две его версии: IPv4, разработанная в 70-х годах, и более современная IPv6. Главное различие между ними — длина адреса и максимальное количество возможных IP-адресов. IPv6 был создан в ответ на растущее количество подключенных к интернету устройств, так как адресов IPv4 стало не хватать.
Когда VPN-клиент или прокси-клиент в режиме TUN активирует свой виртуальный интерфейс, он добавляет маршруты через него с более высоким приоритетом, чтобы весь трафик шел через VPN или прокси. Важная деталь заключается в том, что маршруты для IPv4 и IPv6 настраиваются отдельно. Это приводит к множеству возможных комбинаций при использовании VPN или прокси. На клиентском устройстве может быть или не быть IPv6 от оператора связи. На VPN- или прокси-сервере может быть или не быть IPv6. Включение или отключение IPv6 может зависеть от настроек прокси/VPN-клиента. Например, устройство может получить IPv6-адрес от роутера, но реальная IPv6-связь с интернетом может отсутствовать.
Для решения проблемы рекомендуем три варианта:
1. Выключить в VPN-клиенте или прокси-клиенте IPv6:
Пример: Настройки -> Туннель -> IP Settings -> IPv4
Также необходимо выключить IPv6 и на вашем сервере:
net.ipv6.conf.all.disable_ipv6=1
net.ipv6.conf.default.disable_ipv6=1
net.ipv6.conf.lo.disable_ipv6=1
2. Прописать на вашем сервере IPv6.
3. Снижение приоритета для IPv6 при разрешении адресов DNS в Linux.
Необходимо отредактировать файл /etc/gai.conf. По-умолчанию там уже есть следующая закомментированная секция:
# label <mask> <value>
# Add another rule to the RFC 3484 label table. See section 2.1 in
# RFC 3484. The default is:
#
#label ::1/128 0
#label ::/0 1
#label 2002::/16 2
#label ::/96 3
#label ::ffff:0:0/96 4
#label fec0::/10 5
#label fc00::/7 6
#label 2001:0::/32 7
Раскомментируйте её, и добавьте в список (к примеру со значением «2», т.е. равным со 6to4-адресами приоритетом) ту IPv6-сеть вашего туннельного брокера, адрес из которой выдан вам и сконфигурирован у вас на туннельном интерфейсе. В случае с Hurricane Electric это 2001:470::/32. В результате секция будет выглядеть следующим образом:
label ::1/128 0
label ::/0 1
label 2002::/16 2
label 2001:470::/32 2
label ::/96 3
label ::ffff:0:0/96 4
label fec0::/10 5
label fc00::/7 6
label 2001:0::/32 7
Этого должно быть достаточно, чтобы IPv6 использовался только при подключении к IPv6-only сервисам, либо при явном указании требования использовать IPv6 в соответствующей программе («ssh -6», «curl -6» и т.д). В остальных случаях автоматически будет предпочитаться IPv4.
Если же вы хотите «прицельно» снизить предпочитаемость только IPv6-адресов определённых сайтов и сервисов, это можно сделать абсолютно идентичным способом, просто вместо префикса используемого вами туннеля необходимо прописать префикс используемый серверами, к которым вы подключаетесь (но не хотите более подключаться по v6). К примеру европейским Google используется префикс 2a00:1450::/32, а «глобальным» – 2001:4860::/32. В таблицу можно добавить оба, с одинаковым значением «2».
label ::1/128 0
label ::/0 1
label 2002::/16 2
label 2a00:1450::/32 2
label 2001:4860::/32 2
label ::/96 3
label ::ffff:0:0/96 4
label fec0::/10 5
label fc00::/7 6
label 2001:0::/32 7
/etc/gai.conf определяет поведение системных функций получения IP-адресов по DNS-имени (getaddrinfo из GNU libc), соответственно изменение в этом файле повлияет на поведение подавляющего большинства программ. Однако для вступления его в силу, все эти программы необходимо будет перезапустить.