Обновления в Debian не работают, если включен Xray

Привет, ребят.

Интересную штуку заметил на Debian Trixie. По дефолту репы переключили на работу через (поправьте, если неправильно назвал) распределительный сервер по адресу debian.map.fastlydns.net, который определяет ближайшие сервер по географии и перенаправляет туда. В Debian Bookworm у меня еще работала старая схема, поэтому проблемы до апгрейда не было.

Что происходит сейчас - при выполнении sudo apt update я вижу бесконечно висящее

0% [Connecting to debian.map.fastlydns.net (146.75.2.132)] [Connecting to debian.map.fastlydns.net (146.75.2.132)] Ign:1 http://deb.debian.org/debian trixie InRelease
Ign:2 http://deb.debian.org/debian trixie-updates InReleaseIgn:3 http://deb.debian.org/debian trixie-backports InReleaseIgn:4 http://security.debian.org/debian-security trixie-security InReleaseIgn:3 http://deb.debian.org/debian trixie-backports InReleaseIgn:2 http://deb.debian.org/debian trixie-updates InReleaseIgn:1 http://deb.debian.org/debian trixie InReleaseIgn:4 http://security.debian.org/debian-security trixie-security InReleaseIgn:1 http://deb.debian.org/debian trixie InReleaseIgn:2 http://deb.debian.org/debian trixie-updates InReleaseIgn:3 http://deb.debian.org/debian trixie-backports InReleaseIgn:4 http://security.debian.org/debian-security trixie-security InReleaseErr:3 http://deb.debian.org/debian trixie-backports InReleaseUnable to connect to deb.debian.org:http:Err:2 http://deb.debian.org/debian trixie-updates InReleaseUnable to connect to deb.debian.org:http:Err:1 http://deb.debian.org/debian trixie InReleaseCould not connect to debian.map.fastlydns.net:80 (146.75.2.132), connection timed out Could not connect to deb.debian.org:80 (151.101.194.132), connection timed out Could not connect to deb.debian.org:80 (151.101.2.132), connection timed out Could not connect to deb.debian.org:80 (151.101.66.132), connection timed out Could not connect to deb.debian.org:80 (151.101.130.132), connection timed outUnable to connect to deb.debian.org:http:Err:4 http://security.debian.org/debian-security trixie-security InReleaseCould not connect to debian.map.fastlydns.net:80 (146.75.2.132), connection timed out Could not connect to security.debian.org:80 (151.101.66.132), connection timed out Could not connect to security.debian.org:80 (151.101.130.132), connection timed out Could not connect to security.debian.org:80 (151.101.194.132), connection timed out Could not connect to security.debian.org:80 (151.101.2.132), connection timed outUnable to connect to security.debian.org:http:All packages are up to date.Warning: Failed to fetch http://deb.debian.org/debian/dists/trixie/InRelease  Unable to connect to deb.debian.org:http:Warning: Failed to fetch http://deb.debian.org/debian/dists/trixie-updates/InRelease  Unable to connect to deb.debian.org:http:Warning: Failed to fetch http://security.debian.org/debian-security/dists/trixie-security/InRelease  Unable to connect to security.debian.org:http:Warning: Failed to fetch http://deb.debian.org/debian/dists/trixie-backports/InRelease  Unable to connect to deb.debian.org:http:Warning: Some index files failed to download. They have been ignored, or old ones used instead.

Отключаю xray - все начинает работать. Т. к. я не эксперт, понимания, почему, у меня не хватает. Пытался разобраться в доках xray, чтобы понять, что подкрутить, но не смог. Чувствую, что что-то очевидно, но не найду. Прошу помочь.

Конфиг клиента

{
    "log": {
        "loglevel": "debug"
    },
    "inbounds": [
        {
            "tag": "in-tproxy",
            "listen": "127.0.0.1",
            "port": 61221,
            "protocol": "dokodemo-door",
            "settings": {
                "followRedirect": true,
                "network": "tcp,udp"
            },
            "streamSettings": {
                "sockopt": {
                    "tproxy": "tproxy"
                }
            },
            "sniffing": {
                "enabled": true,
                "destOverride": ["http", "tls", "quic", "fakedns"],
                "routeOnly": true
            }
        }
    ],
    "outbounds": [
        {
            "protocol": "vless",
            "settings": {
                "domainStrategy": "UseIPv4",
                "vnext": [
                    {
                        "address": "IP",
                        "port": 443,
                        "users": [
                            {
                                "id": "ID",
                                "encryption": "none",
                                "flow": "xtls-rprx-vision"
                            }
                        ]
                    }
                ]
            },
            "streamSettings": {
                "network": "tcp",
                "security": "reality",
                "realitySettings": {
                    "fingerprint": "chrome",
                    "serverName": "rutube.ru",
                    "publicKey": "PUBKEY",
                    "spiderX": "",
                    "shortId": "SHORTID"
                }
            },
            "tag": "proxy"
        },
        {
            "protocol": "freedom",
            "settings": {
                "domainStrategy": "UseIPv4"
            },
            "tag": "direct"
        },
        {
            "protocol": "blackhole",
            "tag": "blocked"
        }
    ],
    "routing": {
        "domainStrategy": "IPIfNotMatch",
        "domainMatcher": "hybrid",
        "rules": [
            {
                "domain": [
                    "2ip.ru",
                    "ntc.party",
                    "rutracker.org",
                    "rutor.org"
                ],
                "outboundTag": "proxy"
            },
            {
                "domain": [
                    "ruvds.com"
                ],
                "outboundTag": "direct"
            },
            {
                "domain": ["domain:ru"],
                "outboundTag": "direct"
            },
            {
                "ip": ["::/0"],
                "outboundTag": "blocked"
            },
            {
                "ip": ["geoip:private", "geoip:ru"],
                "outboundTag": "direct"
            },
            {
                "network": "tcp,udp",
                "outboundTag": "proxy"
            }
        ]
    }
}

sources.list стандартный.

Подозреваю, что дело в резолве адреса после перенаправления, который не может дойти до меня.

Пинг до обоих серверов проходит

ping debian.map.fastlydns.net -c 2
PING debian.map.fastlydns.net (146.75.2.132) 56(84) bytes of data.
64 bytes from 146.75.2.132: icmp_seq=1 ttl=60 time=114 ms
64 bytes from 146.75.2.132: icmp_seq=2 ttl=60 time=115 ms

--- debian.map.fastlydns.net ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 113.998/114.341/114.685/0.343 ms

ping -c 2 deb.debian.org
PING debian.map.fastlydns.net (151.101.194.132) 56(84) bytes of data.
64 bytes from 151.101.194.132: icmp_seq=1 ttl=60 time=103 ms
64 bytes from 151.101.194.132: icmp_seq=2 ttl=60 time=209 ms

--- debian.map.fastlydns.net ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 103.115/156.306/209.498/53.191 ms

Без лога xray что-то сказать невозможно. (Чистого и короткого)

Судя по конфигу xray, подразумевается работа в режиме прозрачного прокси.

Скопировал Ваш конфиг клиента, вставил параметры своего VPS, настройки iproute2 и nftables для прозрачного прокси из мануала (китайская версия переводится google translate, в английском и русском вариантах статья почему-то обрезанная. chain output из nftables убрал, с Вашим конфигом он даст петлю для локального трафика. Получился конфиг для роутера). У меня получившиеся настройки на debian trixie и Xray v25.10.15 работают, в частности apt update. Тестировал не на роутере, а из другого network namespace.

Скорее всего, проблема в настройках прозрачного прокси.

Да, если в “sockopt" не используется опция "mark": 2, то nftables с конфигом из мануала никак не сможет отличить трафик Xray, но в этом случае никакие сайты не будут работать.

Альтернативная настройка

Можно отличать трафик Xray не по метке пакетов, а по пользователю, который создал пакет. Если Xray поднимается не под root, а под отдельным пользователем xray, то в цепочке output вместо meta mark 2 return можно использовать meta skuid xray return.

table ip xray {
  chain prerouting {
    ...
    iifname wgserv0 meta l4proto { tcp, udp } th dport { 80, 443 } counter meta mark set 0x00000001 tproxy to 127.0.0.1:61221 accept
    ...

Настройки второго сервера

{
    "log": {
        "loglevel": "info"
    },
    "routing": {
        "rules": [],
        "domainStrategy": "AsIs"
    },
    "inbounds": [
        {
            "port": 443,
            "protocol": "vless",
            "tag": "vless_tls",
            "settings": {
                "clients": [
                    {
                        "id": "ID",
                        "email": "client@localhost",
                        "flow": "xtls-rprx-vision"
                    }
                ],
                "decryption": "none"
            },
            "streamSettings": {
                "network": "tcp",
                "security": "reality",
                "realitySettings": {
                    "show": false,
                    "dest": "rutube.ru:443",
                    "xver": 0,
                    "serverNames": [
                        "rutube.ru"
                    ],
                    "privateKey": "PUBKEY",
                    "minClientVer": "",
                    "maxClientVer": "",
                    "maxTimeDiff": 0,
                    "shortIds": [
                        "SHORTID"
                    ]
                }
            },
            "sniffing": {
                "enabled": true,
                "destOverride": [
                    "http",
                    "tls",
                    "quic"
                ]
            }
        }
    ],
    "outbounds": [
        {
            "protocol": "freedom",
            "tag": "direct"
        },
        {
            "protocol": "blackhole",
            "tag": "block"
        }
    ]
}

Прошу прощения, что в одном посте пишу ответы на разные сообщения. Форум не дает отправить больше одного сообщения в час или два. Ужасно неудобно.

Если это настройка nftables на клиенте, то я не понимаю, какого эффекта ты хотел добиться. Попробуй поменять iifname wgserv0 на iifname lo или убери вообще это условие.

Пакеты, созданные локально, проходят через хук prerouting только после маршрутизации на нужный интерфейс. По шагам это выглядит так.

  1. Хук output, в котором ставится метка пакету по нужным условиям.
  2. Маршрутизация по метке на тот интерфейс, где слушает Xray (в твоём случае это lo).
  3. Хук prerouting, который направляет пакеты с меткой через TPROXY на нужный адрес и порт. Так как хук срабатывает после маршрутизации на lo, условие iifname не срабатывает.

Базово конфиг nftables должен примерно так выглядеть. Если это сработает (все остальные настройки конфига верны и не противоречат друг другу), потом можешь и на интерфейс условие накрутить.

chain prerouting {
    type filter hook prerouting priority mangle; policy ...;
    ...
    meta mark 0x00000001 tproxy ip to 127.0.0.1:61221 accept
    ...
}
chain output {
    type route hook output priority mangle; policy ...;
    ...
    meta l4proto { tcp, udp } th dport { 80, 443 } counter meta mark set 0x00000001 accept
    ...
}

Это конфиг распределительного сервера. Моя схема выглядит так:

Клиенты ---Wireguard--> (1) VPS с WG + Xray dokodemo door ---Xray--> (2) VPS с Xray

В первом посте конфиг клиента это VPS 1. Чуть ниже правила nftables от него же. Далее конфиг от VPS 2.

Теперь понятнее, что происходит. Если ты заворачиваешь в Xray и выходящий трафик с VPS1, то попробуй убрать эти правила. Ещё посмотри вывод curl -ki debian.map.fastlydns.net. У меня и с Xray, и без вылетает 500-я ошибка. Если погуглить, то выяснится, что многие пользователи сталкиваются с этим. Причины я разбирать не стал. Проще сменить зеркало или выбрать нормальный дистрибутив, который таким не страдает.

Заворачиваю только транзитный трафик. Исходящий идет напрямую. Если убрать эти правила, то транзитный работать не будет. Не буду строить из себя эксперта, я им не являюсь, и до конца не понимаю, как правило регулирует перенаправление транзита с интерфейса ВГ на Xray, но доверяю тем, кто это правило описал (нашел здесь на форуме, не помню в каком обсуждении).

У меня эта ошибка только с Xray вылезает. Что касается смены дистрибутива - это странное решение, но для чистоты совести я попробовал лайвы Ubuntu 24.04 и Fedora 43, там такая же проблема, но уже со своими адресами реп.

Речь про этот пост?

Я подобную схему не настраивал, а из твоих сообщений трудно понять, о чём идёт речь, поэтому приходится гадать. Я даже сейчас не совсем понимаю некоторые моменты.

  1. обновление Debian запускается на VPS1?
  2. как выглядят таблицы маршрутизации на машине с проблемой?
  3. проблема наблюдается только с репозиторием или с любым сайтом?
  4. какую ошибку отдаёт curl?
  5. смотрел ли ты tcpdump?
  6. как выглядят логи Xray в момент обновления?
  7. отключение Xray подразумевает отключение wg-сервера в твоих сообщениях?