Client: advertise LAN subnets via peer AllowedIPs
This commit is contained in:
@@ -158,6 +158,7 @@ tmp="$(mktemp -d)" && curl -fL "https://git.ruslan.xyz/ruslan/Wireguard_server/a
|
|||||||
|
|
||||||
По умолчанию адрес интерфейса клиента пишется как `/24` (например `10.66.66.2/24`).
|
По умолчанию адрес интерфейса клиента пишется как `/24` (например `10.66.66.2/24`).
|
||||||
При необходимости можно изменить маску параметром `--client-address-prefix <1-32>`.
|
При необходимости можно изменить маску параметром `--client-address-prefix <1-32>`.
|
||||||
|
Если за клиентом есть локальная сеть (например `192.168.33.0/24`), передайте `--advertise-subnets 192.168.33.0/24`, чтобы сервер маршрутизировал эту сеть через клиента.
|
||||||
|
|
||||||
### Non-interactive пример (SSH-ключ)
|
### Non-interactive пример (SSH-ключ)
|
||||||
|
|
||||||
@@ -168,6 +169,7 @@ sudo bash client/install_client.sh \
|
|||||||
--server-user root \
|
--server-user root \
|
||||||
--ssh-auth key \
|
--ssh-auth key \
|
||||||
--mode full \
|
--mode full \
|
||||||
|
--advertise-subnets 192.168.33.0/24 \
|
||||||
--client-name laptop-01
|
--client-name laptop-01
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ CLIENT_NAME=""
|
|||||||
CLIENT_DNS=""
|
CLIENT_DNS=""
|
||||||
TUNNEL_MODE=""
|
TUNNEL_MODE=""
|
||||||
SPLIT_ALLOWED_IPS=""
|
SPLIT_ALLOWED_IPS=""
|
||||||
|
ADVERTISE_SUBNETS=""
|
||||||
|
|
||||||
SERVER_HOST=""
|
SERVER_HOST=""
|
||||||
SERVER_USER="root"
|
SERVER_USER="root"
|
||||||
@@ -40,6 +41,7 @@ usage() {
|
|||||||
--allowed-ips <cidr,cidr> Для режима split
|
--allowed-ips <cidr,cidr> Для режима split
|
||||||
--dns <ip> DNS для клиента (если не задан, берется с сервера)
|
--dns <ip> DNS для клиента (если не задан, берется с сервера)
|
||||||
--client-address-prefix <1-32> Префикс маски адреса интерфейса клиента (по умолчанию: 24)
|
--client-address-prefix <1-32> Префикс маски адреса интерфейса клиента (по умолчанию: 24)
|
||||||
|
--advertise-subnets <cidr,...> Сети за клиентом, которые нужно маршрутизировать через него (например 192.168.33.0/24)
|
||||||
|
|
||||||
--server-host <host> IP/домен WireGuard-сервера
|
--server-host <host> IP/домен WireGuard-сервера
|
||||||
--server-user <user> SSH-пользователь (по умолчанию: root)
|
--server-user <user> SSH-пользователь (по умолчанию: root)
|
||||||
@@ -75,6 +77,8 @@ parse_args() {
|
|||||||
CLIENT_DNS="$2"; shift 2 ;;
|
CLIENT_DNS="$2"; shift 2 ;;
|
||||||
--client-address-prefix)
|
--client-address-prefix)
|
||||||
CLIENT_ADDRESS_PREFIX="$2"; shift 2 ;;
|
CLIENT_ADDRESS_PREFIX="$2"; shift 2 ;;
|
||||||
|
--advertise-subnets)
|
||||||
|
ADVERTISE_SUBNETS="$2"; shift 2 ;;
|
||||||
--server-host)
|
--server-host)
|
||||||
SERVER_HOST="$2"; shift 2 ;;
|
SERVER_HOST="$2"; shift 2 ;;
|
||||||
--server-user)
|
--server-user)
|
||||||
@@ -100,6 +104,9 @@ validate_inputs() {
|
|||||||
[[ "$TUNNEL_MODE" == "full" || "$TUNNEL_MODE" == "split" ]] || die "--mode должен быть full или split"
|
[[ "$TUNNEL_MODE" == "full" || "$TUNNEL_MODE" == "split" ]] || die "--mode должен быть full или split"
|
||||||
[[ "$CLIENT_ADDRESS_PREFIX" =~ ^[0-9]+$ ]] || die "--client-address-prefix должен быть числом 1..32"
|
[[ "$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"
|
((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
|
if [[ -z "$SERVER_HOST" ]]; then
|
||||||
die "Не указан --server-host"
|
die "Не указан --server-host"
|
||||||
@@ -230,6 +237,9 @@ register_peer_on_server() {
|
|||||||
psk="$(cat "$CLIENT_PSK_PATH")"
|
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}'"
|
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")"
|
response="$(run_ssh "$remote_cmd")"
|
||||||
|
|
||||||
SERVER_RESPONSE_RAW="$response"
|
SERVER_RESPONSE_RAW="$response"
|
||||||
@@ -346,6 +356,7 @@ Endpoint сервера: ${SERVER_ENDPOINT}
|
|||||||
Режим туннеля: ${TUNNEL_MODE}
|
Режим туннеля: ${TUNNEL_MODE}
|
||||||
SSH сервер: ${SERVER_USER}@${SERVER_HOST}:${SSH_PORT}
|
SSH сервер: ${SERVER_USER}@${SERVER_HOST}:${SSH_PORT}
|
||||||
Статус регистрации: ${SERVER_STATUS}
|
Статус регистрации: ${SERVER_STATUS}
|
||||||
|
Сети за клиентом: ${ADVERTISE_SUBNETS:-не объявлены}
|
||||||
Лог: ${LOG_FILE}
|
Лог: ${LOG_FILE}
|
||||||
=================================================
|
=================================================
|
||||||
EOF_SUMMARY
|
EOF_SUMMARY
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ usage() {
|
|||||||
--client-name <name> \
|
--client-name <name> \
|
||||||
--client-public-key <pubkey> \
|
--client-public-key <pubkey> \
|
||||||
[--client-address <10.66.66.X/32>] \
|
[--client-address <10.66.66.X/32>] \
|
||||||
|
[--client-routes <cidr,cidr>] \
|
||||||
[--client-preshared-key <psk>] \
|
[--client-preshared-key <psk>] \
|
||||||
[--persistent-keepalive 25]
|
[--persistent-keepalive 25]
|
||||||
|
|
||||||
@@ -140,6 +141,7 @@ cmd_add() {
|
|||||||
local client_name=""
|
local client_name=""
|
||||||
local client_pubkey=""
|
local client_pubkey=""
|
||||||
local client_address=""
|
local client_address=""
|
||||||
|
local client_routes=""
|
||||||
local client_psk=""
|
local client_psk=""
|
||||||
local keepalive="25"
|
local keepalive="25"
|
||||||
|
|
||||||
@@ -151,6 +153,8 @@ cmd_add() {
|
|||||||
client_pubkey="$2"; shift 2 ;;
|
client_pubkey="$2"; shift 2 ;;
|
||||||
--client-address)
|
--client-address)
|
||||||
client_address="$2"; shift 2 ;;
|
client_address="$2"; shift 2 ;;
|
||||||
|
--client-routes)
|
||||||
|
client_routes="$2"; shift 2 ;;
|
||||||
--client-preshared-key)
|
--client-preshared-key)
|
||||||
client_psk="$2"; shift 2 ;;
|
client_psk="$2"; shift 2 ;;
|
||||||
--persistent-keepalive)
|
--persistent-keepalive)
|
||||||
@@ -192,6 +196,13 @@ EOF_OUT
|
|||||||
client_address="$(next_client_ip "$WG_NETWORK")" || die "Не удалось выделить IP клиенту в сети $WG_NETWORK"
|
client_address="$(next_client_ip "$WG_NETWORK")" || die "Не удалось выделить IP клиенту в сети $WG_NETWORK"
|
||||||
fi
|
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"
|
backup_file "$WG_CONF"
|
||||||
|
|
||||||
{
|
{
|
||||||
@@ -202,7 +213,7 @@ EOF_OUT
|
|||||||
if [[ -n "$client_psk" ]]; then
|
if [[ -n "$client_psk" ]]; then
|
||||||
echo "PresharedKey = ${client_psk}"
|
echo "PresharedKey = ${client_psk}"
|
||||||
fi
|
fi
|
||||||
echo "AllowedIPs = ${client_address}"
|
echo "AllowedIPs = ${peer_allowed_ips}"
|
||||||
echo "PersistentKeepalive = ${keepalive}"
|
echo "PersistentKeepalive = ${keepalive}"
|
||||||
} >> "$WG_CONF"
|
} >> "$WG_CONF"
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user