Raspberry Pi + xray между роутером и телевизором

Спасибо, что собрали все в одном месте!

У самого успешно работает схема с маршрутизацией нужных подсетей на виртуалку с sing-box (маршрутизирует сам Keenetic).
Но с доавблением новых сервисов схема становится все более громоздкой. Сначала мучался с поиском и добавлением подсетей youtube, потом discord…

Возможно, проще сделать так же как у вас и пустить весь трафик на sing-box с правилами на основе доменных имен.

Тоже переживаю по поводу надежности и отказоутойчивости схемы, поэтому отлично, что вы сделали у себя watchdog.

Скажите, если делаю малину (или в моем случае виртуалку) шлюзом по-умолчанию, через нее же пойдет весь LAN-трафик тоже? опасаюсь просто, чтобы не стало узким местом всей домашей сети

LAN траффик идет как правило не доходя до маршрутизатора вообще. В одной локальной сети устройства работают напрямую, а это значит используют arp таблицу свитча/роутера, так что нет. на производительность локальной сети схема не повлияет. Если конечно вы не юзаете VLANы. Тогда это уже другой разговор. Там учувствует маршрутизация и там могут быть затыки, но это будет не большое снижение скорости траффика, при условии, что sing-box настроен верно.

Спасибо, все сделал, как у вас. Отлично работает!

Есть теперь только сложность с использованием VLESS-клиента на ПК.
Сейчас шлюзом по умолчанию стоит 192.168.1.65 - это виртуалка с поднятым sing-box, держит туннель VLESS (3X-UI) до VPS в Европе.

Когда на ПК запускаю клиент Foxray и соединяюсь с тем же VPS, трафик перестает ходить.
Если указываю на ПК (192.168.1.165) обычный шлюз - 192.168.1.1 (домашний роутер), все работает.

Насколько понимаю, проблема в том, что VLESS-трафик от клиента на ПК заворачивается повторно в тот же VLESS-туннель между шлюзом и VPS.

Видимо, нужно какое-то правило в конфиге sing-box, чтобы и входящий, и исходящий трафик в сторону
89.40.xx.xx шел напрямую.

+0300 2024-11-15 12:47:06 INFO [1162613644 0ms] inbound/tun[0]: inbound connection from 192.168.1.165:49977
+0300 2024-11-15 12:47:06 INFO [1162613644 0ms] inbound/tun[0]: inbound connection to 89.40.xx.xx:443
+0300 2024-11-15 12:47:06 DEBUG [1162613644 1ms] router: sniffed protocol: tls, domain: microsoft.com
+0300 2024-11-15 12:47:06 DEBUG [1162613644 2ms] dns: resolved [20.76.201.171 20.112.250.133 20.70.246.20 20.236.44.162 20.231.239.246]
+0300 2024-11-15 12:47:06 INFO [1162613644 2ms] outbound/direct[direct]: outbound connection to microsoft.com:443
+0300 2024-11-15 12:47:06 INFO [2452199677 0ms] inbound/tun[0]: inbound connection from 192.168.1.165:49978
+0300 2024-11-15 12:47:06 INFO [2452199677 0ms] inbound/tun[0]: inbound connection to 89.40.xx.xx:443
+0300 2024-11-15 12:47:06 DEBUG [2452199677 2ms] router: sniffed protocol: tls, domain: microsoft.com

Добавил в конфиг такое, но, похоже, это только для исходящего трафика. А VPN-сервер присылает и в обратную сторону.

         {
        "ip_cidr": "89.40.xx.xx",
        "outbound": "direct"
        },

Не подскажете, что можно сделать?

Честно говоря, у меня с этим тоже затык был. Решил просто добавлением маршрута в винде “route add…” указал в качестве шлюза ip маршрутизатора и все.

Сам задал вопрос, сам отвечу)

Нужно на машине, где sing-box добавить статический маршрут, чтобы она запросы в адрес европейского VPS перекидывала на шлюз роутера:

ip route add 89.40.xx.xx via 192.168.1.1

Мой актуальный конфиг для версии 1.11.4.

{
  "log": {
    "disabled": false,
    "level": "debug",
    "output": "/tmp/sing-box.log",
    "timestamp": true
  },
  "dns": {
    "strategy": "ipv4_only",
    "servers": [
      {
        "tag": "google",
        "address": "https://8.8.8.8/dns-query",
        "detour": "direct"
      },
      {
        "tag": "cloudflare",
        "address": "https://1.1.1.1/dns-query",
        "detour": "direct"
      }
    ]
  },
  "inbounds": [
    {
      "type": "tun",
      "interface_name": "tun0",
      "domain_strategy": "ipv4_only",
      "address": "172.16.250.1/30",
      "auto_route": true,
      "sniff": true,
      "strict_route": false,
      "sniff_override_destination": true
    }
  ],
  "outbounds": [
    {
      "domain_strategy": "prefer_ipv4",
      "flow": "xtls-rprx-vision",
      "packet_encoding": "xudp",
      "server": "XXXXXXXXXXXXX",
      "server_port": 443,
      "tag": "vless-out",
      "tls": {
        "enabled": true,
        "reality": {
          "enabled": true,
          "public_key": "XXXXXXXXXXXXXX",
          "short_id": "XXXXXXXXX"
        },
        "server_name": "google.com",
        "utls": {
          "enabled": true,
          "fingerprint": "random"
        }
      },
      "type": "vless",
      "uuid": "XXXXXXXXXXXX"
    },
    {
      "type": "direct",
      "tag": "direct"
    }
  ],
  "route": {
    "rules": [
      {
        "protocol": "dns",
        "action": "hijack-dns"
      },
      {
        "ip_is_private": true,
        "outbound": "direct"
      },
    {
        "rule_set": [
          "antizapret",
	  "discord"
        ],
        "outbound": "vless-out"
      }
    ],
    "rule_set": [
      {
    "tag": "antizapret",
    "type": "remote",
    "format": "binary",
    "url": "https://cdn.jsdelivr.net/gh/runetfreedom/russia-v2ray-rules-dat@release/sing-box/rule-set-geosite/geosite-ru-blocked.srs",
    "download_detour": "vless-out",
    "update_interval": "1d"
  },
      {
         "tag": "discord",
         "type": "local",
         "format": "source",
         "path": "/etc/sing-box/rule-set/discord.json"
      }
    ],
    "final": "direct",
    "auto_detect_interface": true
  }
}