diff --git a/README.md b/README.md index f74cde8..954d3ed 100644 --- a/README.md +++ b/README.md @@ -156,6 +156,9 @@ tmp="$(mktemp -d)" && curl -fL "https://git.ruslan.xyz/ruslan/Wireguard_server/a - режим маршрутизации (full/split) - список сетей (если `split`) +По умолчанию адрес интерфейса клиента пишется как `/24` (например `10.66.66.2/24`). +При необходимости можно изменить маску параметром `--client-address-prefix <1-32>`. + ### Non-interactive пример (SSH-ключ) ```bash diff --git a/client/install_client.sh b/client/install_client.sh index 52b9a15..d9bb874 100755 --- a/client/install_client.sh +++ b/client/install_client.sh @@ -22,6 +22,7 @@ SSH_AUTH_METHOD="key" SSH_PASSWORD="" KEEPALIVE="25" +CLIENT_ADDRESS_PREFIX="24" usage() { cat <<'USAGE' @@ -38,6 +39,7 @@ usage() { --mode full: весь трафик, split: только выбранные сети --allowed-ips Для режима split --dns DNS для клиента (если не задан, берется с сервера) + --client-address-prefix <1-32> Префикс маски адреса интерфейса клиента (по умолчанию: 24) --server-host IP/домен WireGuard-сервера --server-user SSH-пользователь (по умолчанию: root) @@ -71,6 +73,8 @@ parse_args() { SPLIT_ALLOWED_IPS="$2"; shift 2 ;; --dns) CLIENT_DNS="$2"; shift 2 ;; + --client-address-prefix) + CLIENT_ADDRESS_PREFIX="$2"; shift 2 ;; --server-host) SERVER_HOST="$2"; shift 2 ;; --server-user) @@ -94,6 +98,8 @@ validate_inputs() { is_valid_port "$SSH_PORT" || die "Некорректный SSH-порт: $SSH_PORT" [[ "$SSH_AUTH_METHOD" == "key" || "$SSH_AUTH_METHOD" == "password" ]] || die "--ssh-auth должен быть key или password" [[ "$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 [[ -z "$SERVER_HOST" ]]; then die "Не указан --server-host" @@ -268,6 +274,12 @@ build_route_hooks_if_needed() { fi } +build_client_interface_address() { + local ip_only + ip_only="${CLIENT_ADDRESS%%/*}" + CLIENT_INTERFACE_ADDRESS="${ip_only}/${CLIENT_ADDRESS_PREFIX}" +} + write_client_config() { local conf="/etc/wireguard/${WG_INTERFACE}.conf" local dns @@ -284,7 +296,7 @@ write_client_config() { { echo "[Interface]" echo "PrivateKey = $(cat "$CLIENT_PRIV_KEY_PATH")" - echo "Address = ${CLIENT_ADDRESS}" + echo "Address = ${CLIENT_INTERFACE_ADDRESS}" echo "DNS = ${dns}" if [[ -n "$PRE_UP" ]]; then echo "$PRE_UP" @@ -330,6 +342,7 @@ print_summary() { Конфиг клиента: /etc/wireguard/${WG_INTERFACE}.conf Endpoint сервера: ${SERVER_ENDPOINT} Маршруты (AllowedIPs):${ALLOWED_IPS} +Адрес интерфейса: ${CLIENT_INTERFACE_ADDRESS} Режим туннеля: ${TUNNEL_MODE} SSH сервер: ${SERVER_USER}@${SERVER_HOST}:${SSH_PORT} Статус регистрации: ${SERVER_STATUS} @@ -356,6 +369,7 @@ main() { generate_keys register_peer_on_server build_allowed_ips + build_client_interface_address build_route_hooks_if_needed write_client_config apply_client_config