Skip to content

Commit 5606b85

Browse files
committed
feat: add AmneziaWG 2.0 support with S3/S4 offsets and H1-H4 ranged headers
- Add S3 and S4 junked offset parameters with validation (S3 + 56 ≠ S4) - Implement H1-H4 ranged headers with non-overlapping range validation - Add helper functions for range parsing, validation, and overlap detection - Update server and client configs to include new AWG 2.0 parameters - Store new parameters in params file for persistence
1 parent ac96603 commit 5606b85

1 file changed

Lines changed: 184 additions & 27 deletions

File tree

amneziawg-install.sh

Lines changed: 184 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -125,30 +125,175 @@ function readS1AndS2() {
125125
done
126126
}
127127

128-
function generateH1AndH2AndH3AndH4() {
129-
RANDOM_AWG_H1=$(shuf -i5-2147483647 -n1)
130-
RANDOM_AWG_H2=$(shuf -i5-2147483647 -n1)
131-
RANDOM_AWG_H3=$(shuf -i5-2147483647 -n1)
132-
RANDOM_AWG_H4=$(shuf -i5-2147483647 -n1)
128+
function generateS3AndS4() {
129+
RANDOM_AWG_S3=$(shuf -i15-150 -n1)
130+
RANDOM_AWG_S4=$(shuf -i15-150 -n1)
133131
}
134132

135-
function readH1AndH2AndH3AndH4() {
136-
SERVER_AWG_H1=0
137-
SERVER_AWG_H2=0
138-
SERVER_AWG_H3=0
139-
SERVER_AWG_H4=0
140-
until [[ ${SERVER_AWG_H1} =~ ^[0-9]+$ ]] && (( ${SERVER_AWG_H1} >= 5 )) && (( ${SERVER_AWG_H1} <= 2147483647 )); do
141-
read -rp "Server AmneziaWG H1 [5-2147483647]: " -e -i ${RANDOM_AWG_H1} SERVER_AWG_H1
133+
function readS3AndS4() {
134+
SERVER_AWG_S3=0
135+
SERVER_AWG_S4=0
136+
until [[ ${SERVER_AWG_S3} =~ ^[0-9]+$ ]] && (( ${SERVER_AWG_S3} >= 15 )) && (( ${SERVER_AWG_S3} <= 150 )); do
137+
read -rp "Server AmneziaWG S3 [15-150]: " -e -i ${RANDOM_AWG_S3} SERVER_AWG_S3
142138
done
143-
until [[ ${SERVER_AWG_H2} =~ ^[0-9]+$ ]] && (( ${SERVER_AWG_H2} >= 5 )) && (( ${SERVER_AWG_H2} <= 2147483647 )); do
144-
read -rp "Server AmneziaWG H2 [5-2147483647]: " -e -i ${RANDOM_AWG_H2} SERVER_AWG_H2
139+
until [[ ${SERVER_AWG_S4} =~ ^[0-9]+$ ]] && (( ${SERVER_AWG_S4} >= 15 )) && (( ${SERVER_AWG_S4} <= 150 )); do
140+
read -rp "Server AmneziaWG S4 [15-150]: " -e -i ${RANDOM_AWG_S4} SERVER_AWG_S4
145141
done
146-
until [[ ${SERVER_AWG_H3} =~ ^[0-9]+$ ]] && (( ${SERVER_AWG_H3} >= 5 )) && (( ${SERVER_AWG_H3} <= 2147483647 )); do
147-
read -rp "Server AmneziaWG H3 [5-2147483647]: " -e -i ${RANDOM_AWG_H3} SERVER_AWG_H3
142+
}
143+
144+
# Parse a range string "min-max" or single value into MIN and MAX variables
145+
function parseRange() {
146+
local INPUT=$1
147+
local VAR_PREFIX=$2
148+
149+
if [[ ${INPUT} =~ ^([0-9]+)-([0-9]+)$ ]]; then
150+
eval "${VAR_PREFIX}_MIN=${BASH_REMATCH[1]}"
151+
eval "${VAR_PREFIX}_MAX=${BASH_REMATCH[2]}"
152+
elif [[ ${INPUT} =~ ^[0-9]+$ ]]; then
153+
eval "${VAR_PREFIX}_MIN=${INPUT}"
154+
eval "${VAR_PREFIX}_MAX=${INPUT}"
155+
else
156+
return 1
157+
fi
158+
return 0
159+
}
160+
161+
# Check if two ranges overlap
162+
function rangesOverlap() {
163+
local MIN1=$1
164+
local MAX1=$2
165+
local MIN2=$3
166+
local MAX2=$4
167+
168+
# Ranges overlap if NOT (max1 < min2 OR max2 < min1)
169+
if (( MAX1 < MIN2 )) || (( MAX2 < MIN1 )); then
170+
return 1 # No overlap
171+
fi
172+
return 0 # Overlap exists
173+
}
174+
175+
# Validate that a range is valid (min <= max) and within bounds
176+
function validateRange() {
177+
local MIN=$1
178+
local MAX=$2
179+
local LOWER_BOUND=$3
180+
local UPPER_BOUND=$4
181+
182+
if (( MIN > MAX )); then
183+
return 1
184+
fi
185+
if (( MIN < LOWER_BOUND )) || (( MAX > UPPER_BOUND )); then
186+
return 1
187+
fi
188+
return 0
189+
}
190+
191+
# Generate non-overlapping random ranges for H1-H4
192+
function generateH1AndH2AndH3AndH4Ranges() {
193+
local RANGE_SIZE=100000000 # Size of each range
194+
local MIN_VAL=5
195+
local MAX_VAL=2147483647
196+
local AVAILABLE_RANGE=$((MAX_VAL - MIN_VAL))
197+
198+
# Generate 4 non-overlapping ranges by dividing the available space
199+
local SEGMENT_SIZE=$((AVAILABLE_RANGE / 5))
200+
201+
# H1 range
202+
local H1_START=$((MIN_VAL + SEGMENT_SIZE * 0 + $(shuf -i0-$((SEGMENT_SIZE - RANGE_SIZE)) -n1)))
203+
RANDOM_AWG_H1_MIN=${H1_START}
204+
RANDOM_AWG_H1_MAX=$((H1_START + RANGE_SIZE))
205+
206+
# H2 range
207+
local H2_START=$((MIN_VAL + SEGMENT_SIZE * 1 + $(shuf -i0-$((SEGMENT_SIZE - RANGE_SIZE)) -n1)))
208+
RANDOM_AWG_H2_MIN=${H2_START}
209+
RANDOM_AWG_H2_MAX=$((H2_START + RANGE_SIZE))
210+
211+
# H3 range
212+
local H3_START=$((MIN_VAL + SEGMENT_SIZE * 2 + $(shuf -i0-$((SEGMENT_SIZE - RANGE_SIZE)) -n1)))
213+
RANDOM_AWG_H3_MIN=${H3_START}
214+
RANDOM_AWG_H3_MAX=$((H3_START + RANGE_SIZE))
215+
216+
# H4 range
217+
local H4_START=$((MIN_VAL + SEGMENT_SIZE * 3 + $(shuf -i0-$((SEGMENT_SIZE - RANGE_SIZE)) -n1)))
218+
RANDOM_AWG_H4_MIN=${H4_START}
219+
RANDOM_AWG_H4_MAX=$((H4_START + RANGE_SIZE))
220+
}
221+
222+
function readHRange() {
223+
local H_NAME=$1
224+
local DEFAULT_MIN=$2
225+
local DEFAULT_MAX=$3
226+
local RESULT_VAR_MIN="${H_NAME}_MIN"
227+
local RESULT_VAR_MAX="${H_NAME}_MAX"
228+
229+
local INPUT=""
230+
local VALID=0
231+
232+
until [[ ${VALID} == 1 ]]; do
233+
read -rp "Server AmneziaWG ${H_NAME} [5-2147483647] (format: min-max or single value): " -e -i "${DEFAULT_MIN}-${DEFAULT_MAX}" INPUT
234+
235+
if parseRange "${INPUT}" "TEMP"; then
236+
if validateRange "${TEMP_MIN}" "${TEMP_MAX}" 5 2147483647; then
237+
eval "${RESULT_VAR_MIN}=${TEMP_MIN}"
238+
eval "${RESULT_VAR_MAX}=${TEMP_MAX}"
239+
VALID=1
240+
else
241+
echo -e "${ORANGE}Invalid range. Min must be <= Max and both must be between 5 and 2147483647.${NC}"
242+
fi
243+
else
244+
echo -e "${ORANGE}Invalid format. Use 'min-max' for a range or a single number.${NC}"
245+
fi
148246
done
149-
until [[ ${SERVER_AWG_H4} =~ ^[0-9]+$ ]] && (( ${SERVER_AWG_H4} >= 5 )) && (( ${SERVER_AWG_H4} <= 2147483647 )); do
150-
read -rp "Server AmneziaWG H4 [5-2147483647]: " -e -i ${RANDOM_AWG_H4} SERVER_AWG_H4
247+
}
248+
249+
function readH1AndH2AndH3AndH4Ranges() {
250+
# Read H1 range
251+
readHRange "H1" "${RANDOM_AWG_H1_MIN}" "${RANDOM_AWG_H1_MAX}"
252+
253+
# Read H2 range and check for overlap with H1
254+
local H2_VALID=0
255+
until [[ ${H2_VALID} == 1 ]]; do
256+
readHRange "H2" "${RANDOM_AWG_H2_MIN}" "${RANDOM_AWG_H2_MAX}"
257+
if rangesOverlap "${H1_MIN}" "${H1_MAX}" "${H2_MIN}" "${H2_MAX}"; then
258+
echo -e "${ORANGE}H2 range overlaps with H1. Please enter a non-overlapping range.${NC}"
259+
else
260+
H2_VALID=1
261+
fi
151262
done
263+
264+
# Read H3 range and check for overlap with H1 and H2
265+
local H3_VALID=0
266+
until [[ ${H3_VALID} == 1 ]]; do
267+
readHRange "H3" "${RANDOM_AWG_H3_MIN}" "${RANDOM_AWG_H3_MAX}"
268+
if rangesOverlap "${H1_MIN}" "${H1_MAX}" "${H3_MIN}" "${H3_MAX}"; then
269+
echo -e "${ORANGE}H3 range overlaps with H1. Please enter a non-overlapping range.${NC}"
270+
elif rangesOverlap "${H2_MIN}" "${H2_MAX}" "${H3_MIN}" "${H3_MAX}"; then
271+
echo -e "${ORANGE}H3 range overlaps with H2. Please enter a non-overlapping range.${NC}"
272+
else
273+
H3_VALID=1
274+
fi
275+
done
276+
277+
# Read H4 range and check for overlap with H1, H2, and H3
278+
local H4_VALID=0
279+
until [[ ${H4_VALID} == 1 ]]; do
280+
readHRange "H4" "${RANDOM_AWG_H4_MIN}" "${RANDOM_AWG_H4_MAX}"
281+
if rangesOverlap "${H1_MIN}" "${H1_MAX}" "${H4_MIN}" "${H4_MAX}"; then
282+
echo -e "${ORANGE}H4 range overlaps with H1. Please enter a non-overlapping range.${NC}"
283+
elif rangesOverlap "${H2_MIN}" "${H2_MAX}" "${H4_MIN}" "${H4_MAX}"; then
284+
echo -e "${ORANGE}H4 range overlaps with H2. Please enter a non-overlapping range.${NC}"
285+
elif rangesOverlap "${H3_MIN}" "${H3_MAX}" "${H4_MIN}" "${H4_MAX}"; then
286+
echo -e "${ORANGE}H4 range overlaps with H3. Please enter a non-overlapping range.${NC}"
287+
else
288+
H4_VALID=1
289+
fi
290+
done
291+
292+
# Set the final SERVER_AWG_H* variables
293+
SERVER_AWG_H1="${H1_MIN}-${H1_MAX}"
294+
SERVER_AWG_H2="${H2_MIN}-${H2_MAX}"
295+
SERVER_AWG_H3="${H3_MIN}-${H3_MAX}"
296+
SERVER_AWG_H4="${H4_MIN}-${H4_MAX}"
152297
}
153298

154299
function installQuestions() {
@@ -233,17 +378,23 @@ function installQuestions() {
233378
readS1AndS2
234379
done
235380

236-
# H1 && H2 && H3 && H4
237-
generateH1AndH2AndH3AndH4
238-
while (( ${RANDOM_AWG_H1} == ${RANDOM_AWG_H2} )) || (( ${RANDOM_AWG_H1} == ${RANDOM_AWG_H3} )) || (( ${RANDOM_AWG_H1} == ${RANDOM_AWG_H4} )) || (( ${RANDOM_AWG_H2} == ${RANDOM_AWG_H3} )) || (( ${RANDOM_AWG_H2} == ${RANDOM_AWG_H4} )) || (( ${RANDOM_AWG_H3} == ${RANDOM_AWG_H4} )); do
239-
generateH1AndH2AndH3AndH4
381+
# S3 && S4 (AmneziaWG 2.0)
382+
echo -e "\n${GREEN}AmneziaWG 2.0 Features:${NC}"
383+
generateS3AndS4
384+
while (( ${RANDOM_AWG_S3} + 56 == ${RANDOM_AWG_S4} )); do
385+
generateS3AndS4
240386
done
241-
readH1AndH2AndH3AndH4
242-
while (( ${SERVER_AWG_H1} == ${SERVER_AWG_H2} )) || (( ${SERVER_AWG_H1} == ${SERVER_AWG_H3} )) || (( ${SERVER_AWG_H1} == ${SERVER_AWG_H4} )) || (( ${SERVER_AWG_H2} == ${SERVER_AWG_H3} )) || (( ${SERVER_AWG_H2} == ${SERVER_AWG_H4} )) || (( ${SERVER_AWG_H3} == ${SERVER_AWG_H4} )); do
243-
echo "AmneziaWG require H1 and H2 and H3 and H4 be different"
244-
readH1AndH2AndH3AndH4
387+
readS3AndS4
388+
while (( ${SERVER_AWG_S3} + 56 == ${SERVER_AWG_S4} )); do
389+
echo "AmneziaWG require S3 + 56 <> S4"
390+
readS3AndS4
245391
done
246392

393+
# H1-H4 Ranged Headers (AmneziaWG 2.0)
394+
echo -e "\n${GREEN}H1-H4 Ranged Headers (ranges must not overlap):${NC}"
395+
generateH1AndH2AndH3AndH4Ranges
396+
readH1AndH2AndH3AndH4Ranges
397+
247398
echo ""
248399
echo "Okay, that was all I needed. We are ready to setup your AmneziaWG server now."
249400
echo "You will be able to generate a client at the end of the installation."
@@ -314,6 +465,8 @@ SERVER_AWG_JMIN=${SERVER_AWG_JMIN}
314465
SERVER_AWG_JMAX=${SERVER_AWG_JMAX}
315466
SERVER_AWG_S1=${SERVER_AWG_S1}
316467
SERVER_AWG_S2=${SERVER_AWG_S2}
468+
SERVER_AWG_S3=${SERVER_AWG_S3}
469+
SERVER_AWG_S4=${SERVER_AWG_S4}
317470
SERVER_AWG_H1=${SERVER_AWG_H1}
318471
SERVER_AWG_H2=${SERVER_AWG_H2}
319472
SERVER_AWG_H3=${SERVER_AWG_H3}
@@ -329,6 +482,8 @@ Jmin = ${SERVER_AWG_JMIN}
329482
Jmax = ${SERVER_AWG_JMAX}
330483
S1 = ${SERVER_AWG_S1}
331484
S2 = ${SERVER_AWG_S2}
485+
S3 = ${SERVER_AWG_S3}
486+
S4 = ${SERVER_AWG_S4}
332487
H1 = ${SERVER_AWG_H1}
333488
H2 = ${SERVER_AWG_H2}
334489
H3 = ${SERVER_AWG_H3}
@@ -467,6 +622,8 @@ Jmin = ${SERVER_AWG_JMIN}
467622
Jmax = ${SERVER_AWG_JMAX}
468623
S1 = ${SERVER_AWG_S1}
469624
S2 = ${SERVER_AWG_S2}
625+
S3 = ${SERVER_AWG_S3}
626+
S4 = ${SERVER_AWG_S4}
470627
H1 = ${SERVER_AWG_H1}
471628
H2 = ${SERVER_AWG_H2}
472629
H3 = ${SERVER_AWG_H3}
@@ -645,4 +802,4 @@ if [[ -e "${AMNEZIAWG_DIR}/params" ]]; then
645802
manageMenu
646803
else
647804
installAmneziaWG
648-
fi
805+
fi

0 commit comments

Comments
 (0)