Firefox 149 поставляется с бесплатным VPN

Чисто техническая обнова. Без нового функционала, потребление ОЗУ упало примерно в 3 раза, убрал пул сессий(-sessions) и заменил на perStreamSession за счет чего соединение стало очень стабильным
firefox-proxy.zip (2,9 МБ)

Подскажите, а у многих работает Мозиловский впн просто кликнув на кнопку на панели вверху?

Можно предположить что у многих судя по низкой активности в треде.

Летом подключался напрямую, потом только с обходом блокировки для vpn.mozilla.org, попробовал сейчас и оказалось что работает напрямую.

Возможно зависит от наличия блокировки хостинга Fastly https://cheburcheck.ru/check?target=vpn.mozilla.org https://hyperion-cs.github.io/dpi-checkers/ru/tcp-16-20/.

У меня иногда подключается, но периодически отваливается. В момент отвала не пингуется vpn.mozilla.org

Ладно наши, думал, что они будут ограничивать

До этого без впна (варпа) вообще не подключалось, щас вроде заработало

Через прокси от tendy с фрагментированием ClientHello

Офф внутри браузера

Недавно в sing-box 1.15 alpha добавили поддержку masque, поэтому можно сделать вот такую интересную штуку.

Я уже проверил и это реально все работает и даже прям нормально.

FirefoxVPN реализован по стандарту RFC masque connect-tcp/udp поэтому его проще и удобно использовать.

Что нужно сделать в ffproxy чтобы использовать прокси ff через sing-box и подобные клиенты.

  1. В ffproxy добавить http сервер с эндпоинтами, которые отдают конфиги с свежим токеном авторизации. Нужно возвращать json конфиг для sing-box с outbounds
  2. Добавить в сингбокс этот адрес как подписку и сделать автообновление каждые 5мин(токен живет 10мин)

Можно добавить использование шаблона конфига sing-box, чтобы сервер брал шаблон и заполнял только outbounds, конкретно добавлял бы все точки прокси как outbound и заполнил бы selector для выбора прокси.

Так же отмечу что реализация sing-box позволяет проксировать udp трафик а так же умеет в http1.1/h2/h3 (quic).

От клиента ffproxy останется только ходить за списком доступных нод, рефрешить токен и отдавать список конфигов для sing-box, а в будущем и под clash/xray(happ).

Пример конфига:

{
  "$schema": "https://raw.githubusercontent.com/SagerNet/sing-box/refs/heads/testing/docs/schema.json",
  "log": {
    "level": "trace",
    "timestamp": true
  },
  "certificate": {
    "store": "mozilla"
  },
  "dns": {
    "servers": [
      {
        "type": "local",
        "tag": "local-dns"
      },
      {
        "type": "https",
        "tag": "bootstrap-dns",
        "server": "77.88.8.8"
      },
      {
        "type": "https",
        "tag": "direct-cloudflare-dns",
        "domain_resolver": "bootstrap-dns",
        "server": "one.one.one.one"
      },
      {
        "type": "https",
        "tag": "direct-quad9-dns",
        "domain_resolver": "bootstrap-dns",
        "server": "dns.quad9.net"
      },
      {
        "type": "https",
        "tag": "remote-cloudflare-dns",
        "domain_resolver": "bootstrap-dns",
        "server": "one.one.one.one",
        "detour": "proxy-out"
      },
    ],
    "rules": [
      {
        "preferred_by": "local-dns",
        "server": "local-dns"
      },
      {
        "action": "evaluate",
        "server": "remote-cloudflare-dns",
        "tag": "remote-cloudflare-dns",
        "timeout": "1s"
      },
      {
        "action": "evaluate",
        "server": "direct-cloudflare-dns",
        "tag": "direct-cloudflare-dns"
      },
      {
        "action": "evaluate",
        "server": "direct-quad9-dns",
        "tag": "direct-quad9-dns"
      },
      {
        "match_response": "remote-cloudflare-dns",
        "response_rcode": "NOERROR",
        "action": "respond"
      },
      {
        "match_response": "direct-cloudflare-dns",
        "response_rcode": "NOERROR",
        "action": "respond"
      },
      {
        "match_response": "direct-quad9-dns",
        "response_rcode": "NOERROR",
        "action": "respond"
      }
        
    ],
    "final": "bootstrap-dns",
    "strategy": "ipv4_only",
    "disable_cache": true
  },
  "http_clients": [
    {
      "tag": "default-http-client",
      "engine": "go",
      "version": 2,
      "tls": {
        "utls": {
          "enabled": true,
          "fingerprint": "firefox"
        }
      },
      "detour": "direct-out"
    }
  ],
  "inbounds": [
    {
      "type": "tun",
      "tag": "tun-in",
      "address": "172.19.0.1/30",
      "auto_route": true,
      "strict_route": true
    },
    {
      "type": "mixed",
      "tag": "mixed-in",
      "listen": "::",
      "listen_port": 10808
    }
  ],
  "outbounds": [
    {
      "type": "direct",
      "tag": "direct-out"
    },
    {
      "type": "selector",
      "tag": "proxy-out",
      "outbounds": [
        "Recomended Location",
        "Germany",
        "United States"
      ]
    },
    {
      "type": "http",
      "tag": "Recomended Location",
      "server": "p.m1.fastly-masque.net",
      "server_port": 2499,
      "headers": {
        "Proxy-Authorization": "Bearer ${token}"
      },
      "version": 1, // HTTP Version 1/2/3
      "disable_version_fallback": true, // enable version fallback

      "tls": {
        "enabled": true,
        "engine": "go",
        "utls": {
          "enabled": true,
          "fingerprint": "firefox"
        },
        "fragment": true,
        "fragment_fallback_delay": "300ms",
        
      }
    },
    {
      "type": "http",
      "tag": "Germany",
      "server": "muc139.m1.fastly-masque.net",
      "server_port": 2499,
      "headers": {
        "Proxy-Authorization": "Bearer ${token}"
      },
      "version": 2, // HTTP Version 1/2/3
      "max_concurrent_streams": 5,
      "disable_version_fallback": false, // enable version fallback
      
      "tls": {
        "enabled": true,
        "engine": "go",
        "utls": {
          "enabled": true,
          "fingerprint": "firefox"
        },
        "fragment": true,
        "fragment_fallback_delay": "300ms"
      }
    },
      {
      "type": "http",
      "tag": "United States",
      "server": "us.m1.fastly-masque.net",
      "server_port": 2499,
      "headers": {
        "Proxy-Authorization": "Bearer ${token}"
      },
      "version": 3, // HTTP Version 1/2/3
      "max_concurrent_streams": 5,
      "disable_version_fallback": false, // enable version fallback
      
      "tls": {
        "enabled": true,
        "engine": "go",
        "utls": {
          "enabled": true,
          "fingerprint": "firefox"
        },
        "fragment": true,
        "fragment_fallback_delay": "300ms"
      }
    }
  ],
  "route": {
    "rules": [
      {
        "inbound": "tun-in",
        "action": "sniff"
      },
      {
        "type": "logical",
        "mode": "or",
        "rules": [
          {
            "port": 53
          },
          {
            "protocol": "dns"
          }
        ],
        "action": "hijack-dns"
      },
      {
        "ip_is_private": true,
        "action": "bypass"
      },
      {
        "outbound": "proxy-out"
      }
    ],
    "final": "direct-out",
    "find_process": true,
    "auto_detect_interface": true,
    "default_domain_resolver": "direct-cloudflare-dns",
    "default_http_client": "default-http-client"
  },
  "experimental": {
    "clash_api": {
      "external_controller": "127.0.0.1:9090",
      "external_ui": "/ui",
      "external_ui_download_url": "https://github.com/Zephyruso/zashboard/releases/latest/download/dist.zip",
      "default_mode": "Rule"
    }
  }
}