@@ -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
154299function 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}
314465SERVER_AWG_JMAX=${SERVER_AWG_JMAX}
315466SERVER_AWG_S1=${SERVER_AWG_S1}
316467SERVER_AWG_S2=${SERVER_AWG_S2}
468+ SERVER_AWG_S3=${SERVER_AWG_S3}
469+ SERVER_AWG_S4=${SERVER_AWG_S4}
317470SERVER_AWG_H1=${SERVER_AWG_H1}
318471SERVER_AWG_H2=${SERVER_AWG_H2}
319472SERVER_AWG_H3=${SERVER_AWG_H3}
@@ -329,6 +482,8 @@ Jmin = ${SERVER_AWG_JMIN}
329482Jmax = ${SERVER_AWG_JMAX}
330483S1 = ${SERVER_AWG_S1}
331484S2 = ${SERVER_AWG_S2}
485+ S3 = ${SERVER_AWG_S3}
486+ S4 = ${SERVER_AWG_S4}
332487H1 = ${SERVER_AWG_H1}
333488H2 = ${SERVER_AWG_H2}
334489H3 = ${SERVER_AWG_H3}
@@ -467,6 +622,8 @@ Jmin = ${SERVER_AWG_JMIN}
467622Jmax = ${SERVER_AWG_JMAX}
468623S1 = ${SERVER_AWG_S1}
469624S2 = ${SERVER_AWG_S2}
625+ S3 = ${SERVER_AWG_S3}
626+ S4 = ${SERVER_AWG_S4}
470627H1 = ${SERVER_AWG_H1}
471628H2 = ${SERVER_AWG_H2}
472629H3 = ${SERVER_AWG_H3}
@@ -645,4 +802,4 @@ if [[ -e "${AMNEZIAWG_DIR}/params" ]]; then
645802 manageMenu
646803else
647804 installAmneziaWG
648- fi
805+ fi
0 commit comments