From a35c814baba6a15fcf79b68eed82af9abe99105b Mon Sep 17 00:00:00 2001 From: Ruslan Date: Tue, 14 Apr 2026 10:42:36 +0300 Subject: [PATCH] Client: advertise LAN subnets via peer AllowedIPs --- README.md | 2 ++ client/install_client.sh | 11 +++++++++++ server/wg-peerctl.sh | 13 ++++++++++++- 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 954d3ed..3890745 100644 --- a/README.md +++ b/README.md @@ -158,6 +158,7 @@ tmp="$(mktemp -d)" && curl -fL "https://git.ruslan.xyz/ruslan/Wireguard_server/a По умолчанию адрес интерфейса клиента пишется как `/24` (например `10.66.66.2/24`). При необходимости можно изменить маску параметром `--client-address-prefix <1-32>`. +Если за клиентом есть локальная сеть (например `192.168.33.0/24`), передайте `--advertise-subnets 192.168.33.0/24`, чтобы сервер маршрутизировал эту сеть через клиента. ### Non-interactive пример (SSH-ключ) @@ -168,6 +169,7 @@ sudo bash client/install_client.sh \ --server-user root \ --ssh-auth key \ --mode full \ + --advertise-subnets 192.168.33.0/24 \ --client-name laptop-01 ``` diff --git a/client/install_client.sh b/client/install_client.sh index d9bb874..488d1f1 100755 --- a/client/install_client.sh +++ b/client/install_client.sh @@ -14,6 +14,7 @@ CLIENT_NAME="" CLIENT_DNS="" TUNNEL_MODE="" SPLIT_ALLOWED_IPS="" +ADVERTISE_SUBNETS="" SERVER_HOST="" SERVER_USER="root" @@ -40,6 +41,7 @@ usage() { --allowed-ips Для режима split --dns DNS для клиента (если не задан, берется с сервера) --client-address-prefix <1-32> Префикс маски адреса интерфейса клиента (по умолчанию: 24) + --advertise-subnets Сети за клиентом, которые нужно маршрутизировать через него (например 192.168.33.0/24) --server-host IP/домен WireGuard-сервера --server-user SSH-пользователь (по умолчанию: root) @@ -75,6 +77,8 @@ parse_args() { CLIENT_DNS="$2"; shift 2 ;; --client-address-prefix) CLIENT_ADDRESS_PREFIX="$2"; shift 2 ;; + --advertise-subnets) + ADVERTISE_SUBNETS="$2"; shift 2 ;; --server-host) SERVER_HOST="$2"; shift 2 ;; --server-user) @@ -100,6 +104,9 @@ validate_inputs() { [[ "$TUNNEL_MODE" == "full" || "$TUNNEL_MODE" == "split" ]] || die "--mode должен быть full или split" [[ "$CLIENT_ADDRESS_PREFIX" =~ ^[0-9]+$ ]] || die "--client-address-prefix должен быть числом 1..32" ((CLIENT_ADDRESS_PREFIX >= 1 && CLIENT_ADDRESS_PREFIX <= 32)) || die "--client-address-prefix должен быть в диапазоне 1..32" + if [[ -n "$ADVERTISE_SUBNETS" ]]; then + is_valid_cidr_list "$ADVERTISE_SUBNETS" || die "Некорректный список --advertise-subnets" + fi if [[ -z "$SERVER_HOST" ]]; then die "Не указан --server-host" @@ -230,6 +237,9 @@ register_peer_on_server() { psk="$(cat "$CLIENT_PSK_PATH")" remote_cmd="/usr/local/sbin/wg-peerctl add --client-name '${CLIENT_NAME}' --client-public-key '${pub}' --client-preshared-key '${psk}' --persistent-keepalive '${KEEPALIVE}'" + if [[ -n "$ADVERTISE_SUBNETS" ]]; then + remote_cmd+=" --client-routes '${ADVERTISE_SUBNETS}'" + fi response="$(run_ssh "$remote_cmd")" SERVER_RESPONSE_RAW="$response" @@ -346,6 +356,7 @@ Endpoint сервера: ${SERVER_ENDPOINT} Режим туннеля: ${TUNNEL_MODE} SSH сервер: ${SERVER_USER}@${SERVER_HOST}:${SSH_PORT} Статус регистрации: ${SERVER_STATUS} +Сети за клиентом: ${ADVERTISE_SUBNETS:-не объявлены} Лог: ${LOG_FILE} ================================================= EOF_SUMMARY diff --git a/server/wg-peerctl.sh b/server/wg-peerctl.sh index 30e94f3..10dc88d 100755 --- a/server/wg-peerctl.sh +++ b/server/wg-peerctl.sh @@ -23,6 +23,7 @@ usage() { --client-name \ --client-public-key \ [--client-address <10.66.66.X/32>] \ + [--client-routes ] \ [--client-preshared-key ] \ [--persistent-keepalive 25] @@ -140,6 +141,7 @@ cmd_add() { local client_name="" local client_pubkey="" local client_address="" + local client_routes="" local client_psk="" local keepalive="25" @@ -151,6 +153,8 @@ cmd_add() { client_pubkey="$2"; shift 2 ;; --client-address) client_address="$2"; shift 2 ;; + --client-routes) + client_routes="$2"; shift 2 ;; --client-preshared-key) client_psk="$2"; shift 2 ;; --persistent-keepalive) @@ -192,6 +196,13 @@ EOF_OUT client_address="$(next_client_ip "$WG_NETWORK")" || die "Не удалось выделить IP клиенту в сети $WG_NETWORK" fi + local peer_allowed_ips="$client_address" + if [[ -n "$client_routes" ]]; then + is_valid_cidr_list "$client_routes" || die "Некорректный список --client-routes" + client_routes="$(echo "$client_routes" | tr -d ' ')" + peer_allowed_ips="${peer_allowed_ips},${client_routes}" + fi + backup_file "$WG_CONF" { @@ -202,7 +213,7 @@ EOF_OUT if [[ -n "$client_psk" ]]; then echo "PresharedKey = ${client_psk}" fi - echo "AllowedIPs = ${client_address}" + echo "AllowedIPs = ${peer_allowed_ips}" echo "PersistentKeepalive = ${keepalive}" } >> "$WG_CONF"