Commit bd96de95 authored by Vitaly Lipatov's avatar Vitaly Lipatov

route-update.sh: add dgw (direct gateway) support with "default" keyword

Support "default" keyword in gateway file to use the machine's default route. Add dgw route group (table 2, pref 20) to override ogw/egw for addresses that should go directly without tunnels. Co-Authored-By: 's avatarClaude Opus 4.6 <noreply@anthropic.com>
parent e603a488
...@@ -10,6 +10,11 @@ ...@@ -10,6 +10,11 @@
``` ```
routes.d/ routes.d/
├── dgw/ # группа "dgw" (direct, через дефолтный шлюз)
│ ├── gateway # default
│ ├── table # 2
│ └── dgw.list -> /root/egw-route/dgw.list
├── egw/ # группа "egw" ├── egw/ # группа "egw"
│ ├── gateway # 91.232.225.112 │ ├── gateway # 91.232.225.112
│ ├── table # 112 │ ├── table # 112
...@@ -47,6 +52,12 @@ IP-адрес шлюза, одна строка — обычный маршру ...@@ -47,6 +52,12 @@ IP-адрес шлюза, одна строка — обычный маршру
91.232.225.12 91.232.225.12
``` ```
Ключевое слово `default` — использовать текущий дефолтный шлюз машины
(определяется из `ip route show default`):
```
default
```
Несколько строк — multipath (per-flow балансировка между gateway): Несколько строк — multipath (per-flow балансировка между gateway):
``` ```
91.232.225.12 91.232.225.12
...@@ -132,15 +143,34 @@ route replace 1.2.3.4 table 100 nexthop via 91.232.225.12 weight 1 nexthop via 9 ...@@ -132,15 +143,34 @@ route replace 1.2.3.4 table 100 nexthop via 91.232.225.12 weight 1 nexthop via 9
Все пакеты одного соединения идут через один gateway. Все пакеты одного соединения идут через один gateway.
Разные соединения балансируются по весам. Разные соединения балансируются по весам.
## Direct gateway (dgw)
Некоторые адреса из antifilter-списков (ogw) или egw-списков доступны напрямую
и не должны маршрутизироваться через туннели. Группа dgw использует ключевое слово
`default` в файле gateway и таблицу с маленьким номером (table 2 → pref 20),
чтобы перехватить эти адреса **раньше** ogw (pref 120) и egw (pref 1120):
```
routes.d/dgw/
├── gateway # default
├── table # 2
└── dgw.list -> /root/egw-route/dgw.list
```
Если IP из dgw.list совпадает с IP из ogw/egw списков — трафик пойдёт
напрямую через дефолтный шлюз, т.к. таблица 2 проверяется первой.
## Архитектура маршрутизации ## Архитектура маршрутизации
``` ```
ip rule show: ip rule show:
20: from all lookup 2 ← [dgw] (direct, через дефолтный шлюз)
120: from all lookup 12 ← [ogw] 120: from all lookup 12 ← [ogw]
1120: from all lookup 112 ← [egw] 1120: from all lookup 112 ← [egw]
32766: from all lookup main ← default route 32766: from all lookup main ← default route
Пакет к dst 1.2.3.4: Пакет к dst 1.2.3.4:
→ lookup table 2: есть маршрут? → via default gw (прямой доступ)
→ lookup table 12: есть маршрут? → via 91.232.225.12 → lookup table 12: есть маршрут? → via 91.232.225.12
→ lookup table 112: есть маршрут? → via 91.232.225.112 → lookup table 112: есть маршрут? → via 91.232.225.112
→ lookup main: default route → lookup main: default route
......
...@@ -71,6 +71,9 @@ read_group_config() ...@@ -71,6 +71,9 @@ read_group_config()
if [ -f "$dir/gateway" ] ; then if [ -f "$dir/gateway" ] ; then
gw=$(grep -v '^#' "$dir/gateway" | grep -m1 .) gw=$(grep -v '^#' "$dir/gateway" | grep -m1 .)
if [ "$gw" = "default" ] ; then
gw=$(ip route show default | awk '/default/ {print $3; exit}')
fi
else else
echo "[$(basename "$dir")] No gateway file, skipping" >&2 echo "[$(basename "$dir")] No gateway file, skipping" >&2
return 1 return 1
...@@ -91,6 +94,9 @@ read_group_config() ...@@ -91,6 +94,9 @@ read_group_config()
route_via="table $table" route_via="table $table"
local g local g
for g in $(grep -v '^#' "$dir/gateway" | grep .) ; do for g in $(grep -v '^#' "$dir/gateway" | grep .) ; do
if [ "$g" = "default" ] ; then
g=$(ip route show default | awk '/default/ {print $3; exit}')
fi
route_via="$route_via nexthop via $g weight 1" route_via="$route_via nexthop via $g weight 1"
done done
fi fi
......
/root/egw-route/dgw.list
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment