feat: RFC1918 (*.loc) напрямую + динамический пример IP в выводе

- ru-bypass.sh: маршруты для 10/8, 172.16/12, 192.168/16 через локальный роутер
- ru-bypass.sh: UFW правила для тех же диапазонов (однократно, before.rules)
- ru-bypass.sh: пример IP в конце теперь резолвится из ya.ru динамически
- README.md: описание RFC1918 bypass в разделах про UFW и про шаги скрипта

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-06-07 09:03:59 +03:00
parent 9669f5ff15
commit 66a040cc03
2 changed files with 30 additions and 7 deletions

View File

@@ -38,6 +38,8 @@ Amnezia поднимает интерфейс `amn0` и захватывает
default deny outgoing — запрещено всё по умолчанию
allow out on amn0 — через Amnezia можно всё
before.rules: ipset ru-direct — для .ru IP разрешён прямой выход на wlp1s0
before.rules: 10/8, 172.16/12,
192.168/16 — RFC1918 (*.loc) разрешён прямой выход на wlp1s0
```
Если Amnezia падает: `amn0` исчезает, не-.ru трафик блокируется UFW. Маршруты .ru
@@ -49,7 +51,8 @@ before.rules: ipset ru-direct — для .ru IP разрешён прямой
2. Создаёт/обновляет ipset `ru-direct` (~11000 записей)
3. Сохраняет ipset в `/etc/ipset.conf`
4. Добавляет маршруты через локальный роутер для всех .ru блоков
5. При первом запуске: добавляет правило в `/etc/ufw/before.rules` и устанавливает systemd сервисы
5. Добавляет маршруты для RFC1918 диапазонов (`10/8`, `172.16/12`, `192.168/16`) - нужно для `*.loc`
6. При первом запуске: добавляет правила в `/etc/ufw/before.rules` и устанавливает systemd сервисы
### Сервисы (устанавливаются однократно)

View File

@@ -165,19 +165,39 @@ with open('$CACHE') as f, open('/tmp/ru-routes.batch', 'w') as out:
"
ip -force -batch /tmp/ru-routes.batch 2>/dev/null
# --- Маршруты для локальных сетей (*.loc, RFC1918) ---
LOCAL_NETS="10.0.0.0/8 172.16.0.0/12 192.168.0.0/16"
echo "Добавляем маршруты для локальных сетей (*.loc / RFC1918)..."
for net in $LOCAL_NETS; do
ip route replace "$net" via "$GATEWAY" dev "$DEV" 2>/dev/null
done
# --- Правило в UFW before.rules (однократно, после создания ipset) ---
UFW_MARKER="match-set $SETNAME"
if ! grep -q "$UFW_MARKER" "$UFW_BEFORE" 2>/dev/null; then
echo "Добавляем правило в UFW before.rules..."
sed -i "0,/^COMMIT/{s/^COMMIT/# .ru bypass (ipset $SETNAME)\n-A ufw-before-output -m set --match-set $SETNAME dst -o $DEV -j ACCEPT\nCOMMIT/}" "$UFW_BEFORE"
echo "UFW обновлён (.ru ipset)."
fi
UFW_LOCAL_MARKER="local-nets-bypass"
if ! grep -q "$UFW_LOCAL_MARKER" "$UFW_BEFORE" 2>/dev/null; then
echo "Добавляем правила UFW для локальных сетей..."
sed -i "0,/^COMMIT/{s/^COMMIT/# local nets bypass ($UFW_LOCAL_MARKER)\n-A ufw-before-output -d 10.0.0.0\/8 -o $DEV -j ACCEPT\n-A ufw-before-output -d 172.16.0.0\/12 -o $DEV -j ACCEPT\n-A ufw-before-output -d 192.168.0.0\/16 -o $DEV -j ACCEPT\nCOMMIT/}" "$UFW_BEFORE"
echo "UFW обновлён (локальные сети)."
fi
if grep -qE "$UFW_MARKER|$UFW_LOCAL_MARKER" "$UFW_BEFORE" 2>/dev/null; then
if ufw status | grep -qE "активен|active"; then
ufw reload
fi
echo "UFW обновлён."
fi
echo ""
echo "Готово."
RU_EXAMPLE=$(dig +short ya.ru A 2>/dev/null | head -1)
echo " ip route get 8.8.8.8 -> dev amn0 (через VPN)"
echo " ip route get 95.173.136.1 -> dev $DEV (напрямую)"
echo " ip route get ${RU_EXAMPLE:-<ya.ru ip>} -> dev $DEV (напрямую .ru)"
echo " ip route get 10.10.0.1 -> dev $DEV (напрямую *.loc / RFC1918)"