anticensority / discussions

Обсуждение проектов «Антицензорити» и «Антизапрет»
The Unlicense
7 stars 0 forks source link

Создание правила Anticensority для sing-box #2

Open savely-krasovsky opened 1 year ago

savely-krasovsky commented 1 year ago

Расширение очень крутое и поэтому мне хотелось бы концепцию на system-wide уровень. Особенно это актуально для Android. Да, там можно настроить в системе PAC-файл, но в небраузерных приложениях это работать не будет.

Китайцы придумали мощную коробку под названием sing-box, она интегрирована в кучу приложений включая Nekoray, NekoBox, SagerNet и другие.

Там есть удобная фича с правилами маршрутизации, в частности правила geosite и geoip. Компилируют готовую базу они тут: https://github.com/SagerNet/sing-geosite

Вкладывают при этом вручную подобные списки, которые делает коммьюнити: https://github.com/v2fly/domain-list-community

Собственно идея простая:

  1. Можно компилировать базу в похожем формате.
  2. Далее форкнуть sing-box и сделать отдельное правило, например antizapret, при его добавлении в конфигурацию подгружать БД запрещенных доменов и IP.
  3. В конфигурации sing-box сделать два правила: по умолчанию обход, а antizapret пускать через прокси.

На мой взгляд изменения подготовить достаточно легко:

  1. Генератор PAC-файлов у нас уже есть. Адаптировать под генерацию db-файлов и можно также заливать в GitHub-релизы новые версии.
  2. Форкнуть и добавить для sing-box новое правило по аналогии с geosite: https://github.com/SagerNet/sing-box/blob/dev-next/route/router_geo_resources.go (загрузка актуальной БД), https://github.com/SagerNet/sing-box/blob/dev-next/route/rule_item_geosite.go (сам матчер)
  3. Форкнуть Nekobox и использовать нашу версию sing-box (других изменений делать там не придется).

В теории можно будет даже попробовать это замержить, если поговорить с оригинальными авторами, но тут уже не знаю насколько они открыты к подобному.

savely-krasovsky commented 1 year ago

@ilyaigpetrov хотелось бы послушать ваши мысли)

ilyaigpetrov commented 1 year ago

Чем такое решение лучше VPN АнтиЗапрета, который рекоменуется ставить на Android и iOS?

savely-krasovsky commented 1 year ago
  1. Антизапрет на мой личный взгляд достаточно нестабилен. DNS-кэширование там достаточно странное и часто сбоит. В итоге у меня стабильно перестает работать полностью или частично в локальной сети ресурсы Apple (iTunes, iCloud, AppStore) и например некорректно загружается контент в TikTok.
  2. Решение с sing-box позволяет использовать любые прокси, включая V2Ray, NaiveProxy, XRay и обыкновенные SOCKS5/HTTPS proxy. Часто их можно развернуть одним кликом или купить за копейки готовые. Антизапрет же привязан бетонно к OpenVPN.
savely-krasovsky commented 1 year ago

@ilyaigpetrov я в итоге своими силами сделал такое: https://github.com/L11R/antizapret-sing-box-geo

Работает отлично с в паре с sing-box и любым прокси (или даже WireGuard). На своём личном телефоне у меня получился примерно такой конфиг:

{
  "log": {
    "level": "warn"
  },
  "dns": {
    "servers": [
      {
        "tag": "adguard-home-dns",
        "address": "https://REDACTED/dns-query/singbox",
        "address_resolver": "yandex-dns",
        "detour": "direct-out"
      },
      {
        "tag": "yandex-dns",
        "address": "77.88.8.8",
        "detour": "direct-out"
      }
    ]
  },
  "inbounds": [
    {
      "type": "tun",
      "inet4_address": "172.16.0.1/30",
      "inet6_address": "fd00::1/126",
      "auto_route": true,
      "sniff": true
    }
  ],
  "outbounds": [
    {
      "type": "direct",
      "tag": "direct-out"
    },
    {
      "type": "wireguard",
      "tag": "wireguard-out",
      "server": "REDACTED",
      "server_port": 51820,
      "system_interface": true,
      "local_address": [
        "10.252.0.1/32",
        "2600:xxxx:xxxx:cafe::1/128"
      ],
      "private_key": "REDACTED",
      "peer_public_key": "REDACTED",
      "pre_shared_key": "REDACTED"
    },
    {
      "type": "dns",
      "tag": "dns-out"
    }
  ],
  "route": {
    "rules": [
      {
        "ip_version": 6,
        "outbound": "wireguard-out"
      },
      {
        "geoip": "antizapret",
        "geosite": "antizapret",
        "outbound": "wireguard-out"
      },
      {
        "protocol": "dns",
        "outbound": "dns-out"
      }
    ],
    "geoip": {
      "download_url": "https://github.com/L11R/antizapret-sing-geosite/releases/latest/download/geoip.db"
    },
    "geosite": {
      "download_url": "https://github.com/L11R/antizapret-sing-geosite/releases/latest/download/geosite.db"
    },
    "auto_detect_interface": true
  }
}

Итог: заблокированные и IPv6 сайты работают через WireGuard, незаблокированные -- напрямую.

С IPv6 это лично моя хотелка, можно легко убрать это правило и будет классический Антизапрет. Наверно позже напишу блогпост или пост на форум (ntc.party).