netns: nsenter в topology.sh, netns_common и документации (#56)
- topology.sh: ns_exec для всех ip -n <ns> и ip netns exec, коды 0/1/3/4. - netns_common.py: ns_exec_mode()/ns_exec_direct(), addrs/links/link_is_up через ns_sh. - docker-compose.test.yml: проброс AWG_NS_EXEC_MODE в netns-сервис. - tests/netns/README.md: режимы входа в netns, коды возврата, новый pitfall. Refs #21, Refs #15, Refs #56
This commit is contained in:
+16
-2
@@ -35,6 +35,7 @@ make test-netns # поднять стенд, прогнать т
|
||||
make test-netns-keep # оставить топологию и логи для отладки
|
||||
make test-netns NETNS_ARGS="--no-tests" # только поднять стенд
|
||||
make test-netns-ci # то же в привилегированном контейнере (путь для CI)
|
||||
# в контейнере вход в netns идёт через nsenter (issue #56)
|
||||
|
||||
bash tests/netns/topology.sh status # состояние топологии
|
||||
bash tests/netns/topology.sh down # снести топологию вручную
|
||||
@@ -43,8 +44,14 @@ bash tests/netns/topology.sh killswitch on # включить fail-closed пр
|
||||
|
||||
Требования: Linux, **root** (или CAP_NET_ADMIN + CAP_SYS_ADMIN), `ip`, `python3`;
|
||||
backend netfilter — `nft` или `iptables` (в alpine-образе приложения есть только
|
||||
`iptables`, на Debian/Ubuntu — оба). Код возврата `3` означает «заблокировано
|
||||
окружением»: нет прав на создание netns.
|
||||
`iptables`, на Debian/Ubuntu — оба).
|
||||
|
||||
Коды возврата: `0` — тесты прошли, `1` — тесты упали, `3` — «заблокировано окружением»
|
||||
(нет прав на создание netns), `4` — ошибка самого стенда (сюда же нормализуются
|
||||
неожиданные коды утилит, например `255` от `ip netns exec` в контейнере).
|
||||
Вход в namespace выполняется через `ns_exec()`: `ip netns exec` в контейнере падает
|
||||
(`mount of /sys failed`, issue #56), поэтому харнесс сам переключается на
|
||||
`nsenter --net=/var/run/netns/<ns>`; режим форсируется `AWG_NS_EXEC_MODE`.
|
||||
|
||||
## Состав
|
||||
|
||||
@@ -85,11 +92,18 @@ backend netfilter — `nft` или `iptables` (в alpine-образе прило
|
||||
| `AWG_FWMARK` / `AWG_ROUTE_TABLE` | `51820` / `51820` | метка и таблица policy routing |
|
||||
| `AWG_FW_BACKEND` | `auto` | `nft`, `iptables` или автоопределение |
|
||||
| `AWG_NETNS_WORKDIR` | `mktemp -d` | каталог логов и отчёта стенда |
|
||||
| `AWG_NS_EXEC_MODE` | `auto` | вход в netns: `ip`, `nsenter` или `auto` (проба) — issue #56 |
|
||||
|
||||
## Pitfalls
|
||||
|
||||
* **`ip netns add` в контейнере** требует `--privileged` (CAP_SYS_ADMIN) — иначе
|
||||
`run.sh` завершится кодом 3 с сообщением «заблокировано окружением».
|
||||
* **`ip netns exec` и `ip -n <ns>` в контейнере не работают** (iproute2 6.x
|
||||
перемонтирует `/sys`: `mount of /sys failed: Operation not permitted`, rc=255),
|
||||
хотя `ip netns add` и `nsenter --net=...` работают. Поэтому в скриптах только
|
||||
`ns_exec`/`ns_prefix` (`lib.sh`) и `ns_exec_mode()` (`netns_common.py`), а все
|
||||
`ip -n <ns>` заменены на `ns_exec <ns> ip ...` (issue #56). Форсировать режим:
|
||||
`AWG_NS_EXEC_MODE=nsenter|ip`.
|
||||
* **rp_filter** в шлюзе выставлен в `2` (loose): маркированная политика даёт
|
||||
асимметрию reverse-пути, strict-режим молча дропает ответы.
|
||||
* **Мок не умеет криптографию**: он повторяет раскладку сообщений WireGuard
|
||||
|
||||
Reference in New Issue
Block a user