Коротко: на Asus-роутерах правило TTL «не срабатывает», потому что трафик уходит в аппаратное ускорение (CTF/FA) и обходит таблицу mangle. Нужно (1) отключить ускорение NAT/включить режим, который его гасит, (2) повесить постоянное правило TTL на WAN-интерфейс, (3) проверить счётчики.
Вот рабочая схема.
1) Отключаем ускорение, чтобы mangle начал работать
- В веб-интерфейсе: WAN → Интернет-соединение → NAT Acceleration (Аппаратное ускорение) → Disable (или включите Traditional QoS / Bandwidth Limiter — они автоматически отключают CTF/FA).
- Перезапустите роутер или сетевой сервис.
2) Ставим правило TTL на выход в WAN
Идея: провайдер ждёт TTL=64. Когда пакеты идут через роутер, TTL уменьшается на 1 (становится 63) и вас «палят». Значит, на выходе в WAN надо
добавить +1 (или жёстко проставить 64).
Подключитесь по SSH и выполните разово, чтобы проверить «на лету»:
# убедиться, что есть цель TTL (модуль xt_HL)
lsmod | grep xt_HL || modprobe xt_HL 2>/dev/null
# узнаём имя WAN-интерфейса
WAN_IF=$(nvram get wan0_ifname); [ -z "$WAN_IF" ] && WAN_IF=$(ip route | awk '/default/ {print $5; exit}')
# чистим возможные старые правила
iptables -t mangle -D POSTROUTING -o "$WAN_IF" -j TTL --ttl-inc 1 2>/dev/null
# добавляем нужное правило (вариант 1 — инкремент на 1)
iptables -t mangle -I POSTROUTING -o "$WAN_IF" -j TTL --ttl-inc 1
# (альтернатива — жёстко ставить 64)
# iptables -t mangle -I POSTROUTING -o "$WAN_IF" -j TTL --ttl-set 64
# для IPv6 (если нужен интернет по v6)
ip6tables -t mangle -D POSTROUTING -o "$WAN_IF" -j HL --hl-inc 1 2>/dev/null
ip6tables -t mangle -I POSTROUTING -o "$WAN_IF" -j HL --hl-inc 1
Если у вас PPPoE/модем как WAN, интерфейс может быть ppp0/wwan0 — скрипт выше подхватит его автоматически, но при желании подставьте вручную.
3) Делаем правило постоянным (Merlin/stock AsusWRT)
Включите
JFFS и создайте скрипт автозапуска фаервола:
mkdir -p /jffs/scripts
cat >/jffs/scripts/firewall-start <<'EOF'
#!/bin/sh
modprobe xt_HL 2>/dev/null
WAN_IF="$(nvram get wan0_ifname)"; [ -z "$WAN_IF" ] && WAN_IF="$(ip route | awk '/default/ {print $5; exit}')"
# Чистим и ставим правило для IPv4
iptables -t mangle -D POSTROUTING -o "$WAN_IF" -j TTL --ttl-inc 1 2>/dev/null
iptables -t mangle -I POSTROUTING -o "$WAN_IF" -j TTL --ttl-inc 1
# Для IPv6 (если нужен)
ip6tables -t mangle -D POSTROUTING -o "$WAN_IF" -j HL --hl-inc 1 2>/dev/null
ip6tables -t mangle -I POSTROUTING -o "$WAN_IF" -j HL --hl-inc 1
EOF
chmod +x /jffs/scripts/firewall-start
Перезагрузите роутер.
4) Проверяем, что реально работает
После трафика от клиентов:
iptables -t mangle -v -L POSTROUTING
У вашего правила должны расти счётчики
pkts/bytes. Если нули — значит трафик его обходит (чаще всего не отключили CTF/FA или не тот интерфейс).
Частые причины, почему «не работает»
- Включено аппаратное ускорение NAT (CTF/FA) → mangle не видит трафик.
- Правило повешено не на выход в WAN (-o $WAN_IF), а «в никуда».
- В прошивке нет модуля xt_HL (цель TTL) → загрузите модуль (modprobe xt_HL), на стоке обычно есть.
- На новых сборках iptables может быть с backend nf_tables; если есть iptables-legacy, используйте его для стабильной работы целей TTL.
После этих шагов провайдер будет видеть TTL=64, и блокировка раздачи/«умные» устройства перестанут страдать.