Client: advertise LAN subnets via peer AllowedIPs

This commit is contained in:
Ruslan
2026-04-14 10:42:36 +03:00
parent f9969b668a
commit a35c814bab
3 changed files with 25 additions and 1 deletions

View File

@@ -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
```

View File

@@ -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 <cidr,cidr> Для режима split
--dns <ip> DNS для клиента (если не задан, берется с сервера)
--client-address-prefix <1-32> Префикс маски адреса интерфейса клиента (по умолчанию: 24)
--advertise-subnets <cidr,...> Сети за клиентом, которые нужно маршрутизировать через него (например 192.168.33.0/24)
--server-host <host> IP/домен WireGuard-сервера
--server-user <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

View File

@@ -23,6 +23,7 @@ usage() {
--client-name <name> \
--client-public-key <pubkey> \
[--client-address <10.66.66.X/32>] \
[--client-routes <cidr,cidr>] \
[--client-preshared-key <psk>] \
[--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"