LINUX.ORG.RU

Сообщения z0mb1e_kgd

 

Как испортить скорость и качество трафика?

Форум — Admin

Есть проблема - дети забили на учёбу, всё свободное время уделяется онлайн-дрочильням, соцсетям, видео и прочим тиктокам, оценки в школе пробили дно. Мне нужно сознательно снизить скорость, поднять пинг и джиттер. В шейпинге трафика разбираюсь плохо.

Есть роутер на OpenWrt 23+, устройства получают постоянные аренды адреса по маку.

Закинул запрос в нейронку, после нескольких часов боданий она выдала это:

#!/bin/sh

[ ! -f /etc/bw_spoiler.enabled.yes ] && exit 0

# Hotplug скрипт для ограничения трафика и порчи пинга/джиттера по MAC/IP

IFACE=${DEVICE}
IF_UP=${ACTION}

# Конфигурация: список MAC/IP и параметры
CONFIG_FILE="/etc/bw_spoiler.conf"
MAC_LIST=""                    # Пустой по умолчанию
IP_LIST=""                     # Ваш IP
DOWNLOAD_RATE="512kbit"        # Лимит download (to client)
UPLOAD_RATE="512kbit"          # Лимит upload (from client)
PING_DELAY="100ms"             # Задержка
JITTER="80ms"                  # Джиттер
LOSS="10%"                     # Потери пакетов

# Логирование
logger -t bw_spoiler "Starting script for $IFACE $IF_UP"

# Чтение конфигурации из файла, если он есть
[ -f "$CONFIG_FILE" ] && . "$CONFIG_FILE"

# Проверка: запуск только для br-lan при поднятии
if [ "$IFACE" = "br-lan" ] && [ "$IF_UP" = "ifup" ]; then
    # Загрузка модулей
    modprobe ifb && logger -t bw_spoiler "Loaded ifb module" || logger -t bw_spoiler "Failed to load ifb module"
    modprobe sch_netem && logger -t bw_spoiler "Loaded sch_netem module" || logger -t bw_spoiler "Failed to load sch_netem module"

    # Очистка старых правил
    tc qdisc del dev br-lan root 2>/dev/null
    tc qdisc del dev br-lan ingress 2>/dev/null
    tc qdisc del dev ifb-spoiler root 2>/dev/null
    ip link del ifb-spoiler 2>/dev/null

    # Создание ifb-spoiler
    ip link add ifb-spoiler type ifb && logger -t bw_spoiler "Created ifb-spoiler" || logger -t bw_spoiler "Failed to create ifb-spoiler"
    ip link set ifb-spoiler up && logger -t bw_spoiler "Activated ifb-spoiler" || logger -t bw_spoiler "Failed to activate ifb-spoiler"

    # Download to client (egress на br-lan): HTB для лимита + netem для задержек
    tc qdisc add dev br-lan root handle 1: htb default 1 && logger -t bw_spoiler "Added qdisc to br-lan"
    tc class add dev br-lan parent 1: classid 1:1 htb rate 10gbit burst 0b cburst 0b
    tc class add dev br-lan parent 1:1 classid 1:20 htb rate $DOWNLOAD_RATE ceil $DOWNLOAD_RATE burst 1600b cburst 1600b
    tc qdisc add dev br-lan parent 1:20 handle 20: netem delay $PING_DELAY $JITTER loss $LOSS && logger -t bw_spoiler "Added netem to br-lan"

    # Upload from client (ingress через ifb-spoiler)
    tc qdisc add dev br-lan ingress && logger -t bw_spoiler "Added ingress qdisc to br-lan"
    tc filter add dev br-lan parent ffff: protocol all u32 match u32 0 0 action mirred egress redirect dev ifb-spoiler && logger -t bw_spoiler "Added ingress filter"
    tc qdisc add dev ifb-spoiler root handle 1: htb default 1
    tc class add dev ifb-spoiler parent 1: classid 1:1 htb rate 10gbit burst 0b cburst 0b
    tc class add dev ifb-spoiler parent 1:1 classid 1:20 htb rate $UPLOAD_RATE ceil $UPLOAD_RATE burst 1600b cburst 1600b
    tc qdisc add dev ifb-spoiler parent 1:20 handle 20: netem delay $PING_DELAY $JITTER loss $LOSS && logger -t bw_spoiler "Added netem to ifb-spoiler"

    # tc filters для классификации по IP (download: dst IP, upload: src IP)
    for ip in $IP_LIST; do
        tc filter add dev br-lan parent 1: protocol ip prio 1 u32 match ip dst $ip flowid 1:20 && logger -t bw_spoiler "Added IP filter for br-lan dst $ip"
        tc filter add dev ifb-spoiler parent 1: protocol ip prio 1 u32 match ip src $ip flowid 1:20 && logger -t bw_spoiler "Added IP filter for ifb-spoiler src $ip"
    done

    # tc filters для классификации по MAC (если список не пустой; download: ether daddr, upload: ether saddr)
    for mac in $MAC_LIST; do
        # Преобразование MAC в hex для u32 (offset -14 для ether src, -8 для daddr; negative offsets from nexthdr)
        mac_hex=$(echo $mac | sed 's/://g' | tr 'a-f' 'A-F')
        mac1=$(echo 0x${mac_hex:0:8})
        mac2=$(echo 0x${mac_hex:8:4}0000)
        tc filter add dev br-lan parent 1: protocol all prio 2 u32 match u32 $mac1 0xffffffff at -8 match u16 $mac2 0xffff0000 at -4 flowid 1:20 && logger -t bw_spoiler "Added MAC filter for br-lan daddr $mac"
        tc filter add dev ifb-spoiler parent 1: protocol all prio 2 u32 match u32 $mac1 0xffffffff at -14 match u16 $mac2 0xffff0000 at -10 flowid 1:20 && logger -t bw_spoiler "Added MAC filter for ifb-spoiler saddr $mac"
    done
fi

# Cleanup при отключении интерфейса
if [ "$IFACE" = "br-lan" ] && [ "$IF_UP" = "ifdown" ]; then
    tc qdisc del dev br-lan root 2>/dev/null
    tc qdisc del dev br-lan ingress 2>/dev/null
    tc qdisc del dev ifb-spoiler root 2>/dev/null
    ip link del ifb-spoiler 2>/dev/null
    logger -t bw_spoiler "Cleaned up for $IFACE"
fi

Скрипт помещается в hotplug для br-lan. Файлы настройки с переопределениями переменных и списков IP и MAC, флагового файла для переключения активности - в /etc. Вроде должно работать:

root@Xi4A:~# tc -s class show dev br-lan
class htb 1:1 root rate 10Gbit ceil 10Gbit burst 0b cburst 0b
 Sent 54508411 bytes 45848 pkt (dropped 0, overlimits 37205 requeues 0)
 backlog 0b 0p requeues 0
 lended: 0 borrowed: 0 giants: 0
 tokens: 13 ctokens: 13

class htb 1:20 parent 1:1 leaf 0: prio 0 rate 1Mbit ceil 1Mbit burst 1600b cburst 1600b
 Sent 54508411 bytes 45848 pkt (dropped 5157, overlimits 26037 requeues 0)
 backlog 0b 0p requeues 0
 lended: 45848 borrowed: 0 giants: 0
 tokens: 188000 ctokens: 188000

root@Xi4A:~# tc -s class show dev ifb-spoiler
class htb 1:1 root rate 10Gbit ceil 10Gbit burst 0b cburst 0b
 Sent 6392299 bytes 42984 pkt (dropped 0, overlimits 1153 requeues 0)
 backlog 0b 0p requeues 0
 lended: 1 borrowed: 0 giants: 0
 tokens: 14 ctokens: 14

class htb 1:20 parent 1:1 leaf 0: prio 0 rate 1Mbit ceil 1Mbit burst 1600b cburst 1600b
 Sent 6392239 bytes 42983 pkt (dropped 4670, overlimits 492 requeues 0)
 backlog 0b 0p requeues 0
 lended: 42590 borrowed: 0 giants: 0
 tokens: 192500 ctokens: 192500

root@Xi4A:~# tc qdisc show dev br-lan
qdisc htb 1: root refcnt 2 r2q 10 default 0x1 direct_packets_stat 87499 direct_qlen 1000
qdisc netem 20: parent 1:20 limit 1000 delay 400ms  100ms loss 10%
qdisc ingress ffff: parent ffff:fff1 ----------------
root@Xi4A:~# tc qdisc show dev ifb-spoiler
qdisc htb 1: root refcnt 2 r2q 10 default 0x1 direct_packets_stat 106879 direct_qlen 32
qdisc netem 20: parent 1:20 limit 1000 delay 400ms  100ms loss 10%

Но, во-первых, скорость по спидтестам ограничивается согласно настройкам только для входящего трафика, а для исходящего трепыхается на уровне 0,5 Мб/с независимо от настроек, а во-вторых, такое ощущение, что это не работает вне скачивания файлов и синтетических спидтестов - жалоб нет (обычно при проблемах с интернетами они сразу бегут жаловаться), подсматриваю по vnc - смотрят ютуб без проблем, а скорость vnc-трафика между моим и их устройствами достигает 0,5 Гб/с (судя по графикам в диспетчере задач винды), хотя если ради теста я вношу в список адрес своего компа - у меня люто лагает даже консольный ssh до роутера. Стек ipv6 не поддерживается провайдером и отключен на роутере на системном уровне. Logread показывает построчное внесение адресов в список, для которых должно применяться ограничение, и эти адреса правильные.

Что-то в скрипте не так? Или, может быть, есть более правильный и надежный способ, чтобы решить эту проблему? Прошу помочь.

 , ,

z0mb1e_kgd
()

Wireguard - установка метрики для маршрута

Форум — Admin

Есть, условно, несколько сетей 192.168.[0..5].0/24. Каждая такая сеть коннектится к удаленному серверу Wireguard через определенный шлюз в своей сети, который маскарадит пакеты чужих локалок через себя. Всё работает ок, только проблема в том, что я прописываю AllowedIPs= всех локалок в конфиге, т.к. часто физически перемещаюсь от одной локалки к другой, а Wireguard при поднятии своего интерфейса и прописывании маршрута не указывает его метрику, из-за чего пакеты в своей текущей на момент времени локалке тоже идут через него, и ожидаемо тыкаются в !H.

Вопрос: есть ли возможность штатно изменить настройки поднятия маршрута в Wireguard? Или придется прописывать в конфиге Table=off и делать всё вручную через PostUp= и PreDown= (если так, то как сделать это правильно?)?

[Interface]
Address = 10.0.0.10/24
PrivateKey = ...

[Peer]
PublicKey = ...
AllowedIPs = 10.0.0.0/24
AllowedIPs = 192.168.0.0/24
AllowedIPs = 192.168.2.0/24
AllowedIPs = 192.168.3.0/24
Endpoint = ...

UPD: Вроде бы решил проблему, установив прогу ifmetric от Лёни свят-свят Поттеринга и прописав в конфиге Wireguard’а PostUp=ifmetric %i 1024, но вдруг есть более элегантное решение?

 , ,

z0mb1e_kgd
()

WSL2: как включить systemd и nftables?

Форум — Admin

Собственно, сабж.

На виндовой машине активирован WSL2, установлен Oracle Linux из Microsoft Store. Хочу, во-первых, запускать WSL при старте основной системы, с ssh-доступом. Во-вторых, хочу nat’ить транзитные пакеты из Wireguard-интерфейса с помощью nftables (причем интерфейса виндового, хотя с большим удовольствием переделал бы Wireguard на внутренний WSL-сервис).

Пытаюсь запустить соответствующие systemd-сервисы - выдает

System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down

Насколько я понимаю, все дистрибутивы WSL тупо грузят майкрософтовское ядро WSL в своем окружении. wsl --update я уже делал, ожидаемо ничего не поменялось. Кто решал подобные вопросы? Есть ли возможность включить systemd без переконпеляния ядра (хост-машина совсем дохлая, обычный офисный бюджетник)? Запускать Docker-образ не хочется, к контейнеру в контейнере (we need to go deeper) есть предубеждение.

 , , ,

z0mb1e_kgd
()

Как удалить региональные шрифты?

Форум — Admin

Как грамотно удалить (или хотя бы скрыть) всякие арабские, девангари, урду и прочие региональные шрифты в Arch Linux (XFCE)? Выбор шрифта из списка в Libreoffice превращается в пытку.

 , ,

z0mb1e_kgd
()

Настроить трафик между несколькими LAN, объединенными в VPN

Форум — Admin

Есть три территориально разобщенных LAN 192.168.0.0/24, 192.168.2.0/24 и 192.168.10.0/24. Нужно сделать так, чтобы члены всех этих локалок были доступны друг другу. Так как выход в интернет во всех этих локалках NAT’ится провайдерами, был выделен VPS-хост на линуксе с белым IP, который выступает в качестве сервера VPN (Wireguard).

Все локалки выходят в инет через обычные SoHo-роутеры, поэтому в для коннекта к VPN в каждой локалке выделяется одна машина с локальным адресом 192.168..10/32 и включенным IP-Forwarding (далее - VPN-шлюз), которая коннектится к VPN-серверу и получает VPN-адрес из пула 10.11.12.2-4/32, у сервера VPN-адрес - 10.11.12.1/32. У каждого VPN-шлюза в локалках прописано роутить трафик VPN и локальный трафик из чужих LAN через VPN (путем указания AllowedIPs в конфигах Wireguard), в роутерах каждой локалки прописаны static routes трафика VPN (10.11.12.0/24) и чужих локалок на VPN-шлюз по локальному адресу (..10/32). На VPN-сервере прописано iptables -A FORWARD -i wg -j ACCEPT; iptables -A FORWARD -o wg -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE.

Когда я, находясь, например, в локалке 192.168.0.0/24, хочу достучаться до машины в локалке 192.168.2.0/24, я просто набираю этот LAN-адрес (например, 192.168.2.30), и коннект идет. Проблема в том, что в src address этих пакетов прописан адрес VPN, такой трафик воспринимается как нелокальный, и если на целевой машине нет public-сервиса (такого, как веб-морда у принтера или неогороженный сервис на 80-ом порту), то трафик дропается целевым хостом.

Вопрос: как сделать так, чтобы трафик между локалками был нативным и не резался целевыми хостами?

P.S. Не плюйтесь за некомпетентность, я не админ, а обычный хомячок.

 , , ,

z0mb1e_kgd
()

Загрузка Linux с SD-карты

Форум — Linux-install

Дратути,

установил Arch Linux на SD-карту (заморачиваться не стал, использовал alma) для работы на ноуте Acer Aspire R15, однако ни в UEFI, ни в Legacy-режиме ноут не выдает SD-карту как вариант загрузки системы. Родной SSD трогать не вариант (ни заменить, ни записать бутлоадер типа GRUB).

Как правильно организовать загрузку с SD через UEFI-запись? На EFI разделе место есть.

 , , ,

z0mb1e_kgd
()

Черный фон у значка megasync в системном трее

Форум — Desktop

Всем здрасьте!

Система: Arch Linux (uname -srom: Linux 4.1.2-2-ARCH i686 GNU/Linux), DE/WM: Openbox 3.6.1-1, DM: SLiM 1.3.6-5. Комп собран из пыльного железа из закромов, посему видеокарта GeForce 2 MX/MX 400 с проприетарными дровами nvidia-96xx-dkms 96.43.23-4 из AUR.

В системном трее xfce4-panel значок megasync (клиент облачного сервиса mega.co.nz) отображается на черном фоне:

http://i.imgur.com/o1BuOXC.png

Остальные значки с прозрачностью отображаются нормально.

Перерыл все варианты, до которых смог додуматься: обновил кэш значков у всех тем, скопировал значки megasync всех размеров из темы Hicolor в другие темы, попробовал разные панели (xfce4-panel, lxpanel), переустановил пакеты, просмотрел выводы lsof и strace - бесполезно.

Помогите, пжлст, а то мой внутренний перфекционист противно хнычет и топчет ножками.

 , , ,

z0mb1e_kgd
()

RSS подписка на новые темы