diff --git a/USER_MANUAL.md b/USER_MANUAL.md index 968571ed..802ee37d 100644 --- a/USER_MANUAL.md +++ b/USER_MANUAL.md @@ -153,10 +153,14 @@ general=info # общая информация ```ini [firewall] allow=all # разрешить всё (bypass) -allow=192.168.1.0/24 # разрешить подсеть +allow=192.168.1.10 # разрешить весь IP allow=10.0.0.1:80 # разрешить конкретный IP:порт ``` +Фильтр основного TUN проверяет IP и TCP/UDP-порт назначения одинаково в обоих направлениях. +Без разрешений весь трафик этого интерфейса запрещён; ответы требуют отдельных разрешений. +CIDR-подсети не поддерживаются. Ошибочное правило отменяет загрузку нового конфига. + ### 3.7. `[nat]` — EIM NAT ```ini @@ -553,11 +557,13 @@ dump=trace ```ini [firewall] allow=all # всё разрешено -allow=10.0.0.0/8 # разрешить подсеть +allow=10.0.0.5 # разрешить весь IP allow=192.168.1.5:22 # разрешить IP:порт ``` -По умолчанию без секции `[firewall]` — фильтрация выключена. +Без секции `[firewall]` весь входящий и исходящий трафик основного TUN запрещён. +`allow=IP` и `allow=IP:0` разрешают все протоколы IP; `allow=IP:port` — TCP/UDP указанного порта. +Для фрагментов IPv4 нужен весь IP либо `allow=all`. NAT и прокси используют отдельные TUN интерфейсы. ### 7.3. Проброс портов diff --git a/src/config_parser_doc.md b/src/config_parser_doc.md index 544104c6..17e4102d 100644 --- a/src/config_parser_doc.md +++ b/src/config_parser_doc.md @@ -68,7 +68,7 @@ free_config(cfg); | `[client:name]` | `parse_client()` | `link` (формат: `server_name:ip:port`), `peer_public_key`, `keepalive` | | `[network:name]` | `parse_network()` | `id` (hex), `pubkey`, `signing_key` | | `[routing]` | inline | `route_subnet`, `my_subnet` | -| `[firewall]` | `parse_firewall_rule()` | `allow` (IP:port или `all` для bypass) | +| `[firewall]` | `parse_firewall_rule()` | `allow=IPv4[:port]` или `allow=all`; порт 0–65535, 0 разрешает весь IP; CIDR запрещён | | `[control]` | `parse_control()` | `ip`, `port`, `allow` (подсеть) | | `[allowed_keys]` | inline | `allow_all`, `key` (64 hex) | | `[nat]` | `parse_nat()` | `tun_ifname`, `tun_ip`, `nat_via`, `port_start`, `port_end`, `forward` (proto:ip:in_port:ext_port) | @@ -98,6 +98,6 @@ free_config(cfg); | `parse_sockaddr(addr, port, sockaddr)` | Преобразует адрес+порт в `sockaddr_storage` через `getaddrinfo` | | `parse_address_and_port(str, sockaddr)` | Разбирает строку `ip:port` → вызов `parse_sockaddr` | | `get_netif_index(ifname)` | Получает индекс сетевого интерфейса через `if_nametoindex` | -| `parse_firewall_rule(rule_str, global)` | Парсит `allow=IP[:port]` или `all` | +| `parse_firewall_rule(rule_str, global)` | Строго разбирает `allow=IPv4[:port]` или `all`; ошибка/неизвестная опция firewall отменяет весь новый конфиг | | `parse_control_allow(rule_str, global)` | Парсит `allow=IP[/CIDR]` | | `config_ini_hex(hex_str, binary, len)` | Общий INI-код: проверяет весь HEX до декодирования | diff --git a/utun.md b/utun.md index c71ab9cd..216ec435 100644 --- a/utun.md +++ b/utun.md @@ -154,13 +154,17 @@ my_subnet=10.23.1.0/24 |---|---| | `allow` | `all` — разрешить всё. Или `IP` / `IP:port` (можно несколько) | -По умолчанию: deny all (если нет allow=all). +Основной TUN проверяется в обе стороны одинаково по IPv4 и TCP/UDP-порту назначения. +По умолчанию всё запрещено, включая отсутствие секции. Ответные пакеты требуют своих разрешений. +`allow=IP` или `allow=IP:0` разрешает весь IP, включая ICMP и фрагменты IPv4; правило порта фрагменты не разрешает. +CIDR-подсети не поддерживаются. Ошибочная опция или правило отменяет загрузку нового конфига. +Отдельные TUN интерфейсы NAT и прокси под эти правила не попадают. Пример: ```ini [firewall] allow=192.168.1.100 -allow=10.0.0.0/8:443 +allow=10.0.0.50:443 ``` #### `[control]` — сервер мониторинга