Browse Source

feat: add description to fields, add I5

pull/2226/head
cany748 9 months ago
committed by Bernd Storath
parent
commit
3defd09ffe
  1. 61
      src/app/pages/admin/config.vue
  2. 117
      src/app/pages/admin/interface.vue
  3. 61
      src/app/pages/clients/[id].vue
  4. 35
      src/i18n/locales/en.json
  5. 13
      src/server/database/migrations/0002_keen_sleepwalker.sql
  6. 35
      src/server/database/migrations/meta/0002_snapshot.json
  7. 4
      src/server/database/migrations/meta/_journal.json
  8. 1
      src/server/database/repositories/client/schema.ts
  9. 1
      src/server/database/repositories/client/service.ts
  10. 1
      src/server/database/repositories/client/types.ts
  11. 13
      src/server/database/repositories/interface/schema.ts
  12. 1
      src/server/database/repositories/interface/types.ts
  13. 1
      src/server/database/repositories/userConfig/schema.ts
  14. 1
      src/server/database/repositories/userConfig/types.ts
  15. 21
      src/server/utils/WireGuard.ts
  16. 2
      src/server/utils/wgHelper.ts

61
src/app/pages/admin/config.vue

@ -48,14 +48,59 @@
/> />
</FormGroup> </FormGroup>
<FormGroup v-if="globalStore.information?.isAwg"> <FormGroup v-if="globalStore.information?.isAwg">
<FormHeading>Amnezia</FormHeading> <FormHeading>AmneziaWG Obfuscation Parameters</FormHeading>
<FormNumberField id="jC" v-model="data.defaultJC" label="Jc" />
<FormNumberField id="jMin" v-model="data.defaultJMin" label="Jmin" /> <FormNumberField
<FormNumberField id="jMax" v-model="data.defaultJMax" label="Jmax" /> id="jC"
<FormTextField id="i1" v-model="data.defaultI1" label="I1" /> v-model="data.defaultJC"
<FormTextField id="i2" v-model="data.defaultI2" label="I2" /> :label="$t('awg.jCLabel')"
<FormTextField id="i3" v-model="data.defaultI3" label="I3" /> :description="$t('awg.jCDescription')"
<FormTextField id="i4" v-model="data.defaultI4" label="I4" /> />
<FormNumberField
id="jMin"
v-model="data.defaultJMin"
:label="$t('awg.jMinLabel')"
:description="$t('awg.jMinDescription')"
/>
<FormNumberField
id="jMax"
v-model="data.defaultJMax"
:label="$t('awg.jMaxLabel')"
:description="$t('awg.jMaxDescription')"
/>
<div class="col-span-full text-sm">* {{ $t('awg.*') }}</div>
<FormTextField
id="i1"
v-model="data.defaultI1"
:label="$t('awg.i1Label')"
:description="$t('awg.i1Description')"
/>
<FormTextField
id="i2"
v-model="data.defaultI2"
:label="$t('awg.i2Label')"
:description="$t('awg.i2Description')"
/>
<FormTextField
id="i3"
v-model="data.defaultI3"
:label="$t('awg.i3Label')"
:description="$t('awg.i3Description')"
/>
<FormTextField
id="i4"
v-model="data.defaultI4"
:label="$t('awg.i4Label')"
:description="$t('awg.i4Description')"
/>
<FormTextField
id="i5"
v-model="data.defaultI5"
:label="$t('awg.i5Label')"
:description="$t('awg.i5Description')"
/>
</FormGroup> </FormGroup>
<FormGroup> <FormGroup>
<FormHeading>{{ $t('form.actions') }}</FormHeading> <FormHeading>{{ $t('form.actions') }}</FormHeading>

117
src/app/pages/admin/interface.vue

@ -22,22 +22,107 @@
/> />
</FormGroup> </FormGroup>
<FormGroup v-if="globalStore.information?.isAwg"> <FormGroup v-if="globalStore.information?.isAwg">
<FormHeading>Amnezia</FormHeading> <FormHeading>AmneziaWG Obfuscation Parameters</FormHeading>
<FormNumberField id="jC" v-model="data.jC" label="Jc" />
<FormNumberField id="jMin" v-model="data.jMin" label="Jmin" /> <FormNumberField
<FormNumberField id="jMax" v-model="data.jMax" label="Jmax" /> id="jC"
<FormNumberField id="s1" v-model="data.s1" label="S1" /> v-model="data.jC"
<FormNumberField id="s2" v-model="data.s2" label="S2" /> :label="$t('awg.jCLabel')"
<FormNumberField id="s3" v-model="data.s3" label="S3" /> :description="$t('awg.jCDescription')"
<FormNumberField id="s4" v-model="data.s4" label="S4" /> />
<FormTextField id="i1" v-model="data.i1" label="I1" /> <FormNumberField
<FormTextField id="i2" v-model="data.i2" label="I2" /> id="jMin"
<FormTextField id="i3" v-model="data.i3" label="I3" /> v-model="data.jMin"
<FormTextField id="i4" v-model="data.i4" label="I4" /> :label="$t('awg.jMinLabel')"
<FormNumberField id="h1" v-model="data.h1" label="H1" /> :description="$t('awg.jMinDescription')"
<FormNumberField id="h2" v-model="data.h2" label="H2" /> />
<FormNumberField id="h3" v-model="data.h3" label="H3" /> <FormNumberField
<FormNumberField id="h4" v-model="data.h4" label="H4" /> id="jMax"
v-model="data.jMax"
:label="$t('awg.jMaxLabel')"
:description="$t('awg.jMaxDescription')"
/>
<FormNumberField
id="s1"
v-model="data.s1"
:label="$t('awg.s1Label')"
:description="$t('awg.s1Description')"
/>
<FormNumberField
id="s2"
v-model="data.s2"
:label="$t('awg.s2Label')"
:description="$t('awg.s2Description')"
/>
<div class="col-span-full text-sm">* {{ $t('awg.*') }}</div>
<FormNumberField
id="s3"
v-model="data.s3"
:label="$t('awg.s3Label')"
:description="$t('awg.s3Description')"
/>
<FormNumberField
id="s4"
v-model="data.s4"
:label="$t('awg.s4Label')"
:description="$t('awg.s4Description')"
/>
<FormTextField
id="i1"
v-model="data.i1"
:label="$t('awg.i1Label')"
:description="$t('awg.i1Description')"
/>
<FormTextField
id="i2"
v-model="data.i2"
:label="$t('awg.i2Label')"
:description="$t('awg.i2Description')"
/>
<FormTextField
id="i3"
v-model="data.i3"
:label="$t('awg.i3Label')"
:description="$t('awg.i3Description')"
/>
<FormTextField
id="i4"
v-model="data.i4"
:label="$t('awg.i4Label')"
:description="$t('awg.i4Description')"
/>
<FormTextField
id="i5"
v-model="data.i5"
:label="$t('awg.i5Label')"
:description="$t('awg.i5Description')"
/>
<FormNumberField
id="h1"
v-model="data.h1"
:label="$t('awg.h1Label')"
:description="$t('awg.h1Description')"
/>
<FormNumberField
id="h2"
v-model="data.h2"
:label="$t('awg.h2Label')"
:description="$t('awg.h2Description')"
/>
<FormNumberField
id="h3"
v-model="data.h3"
:label="$t('awg.h3Label')"
:description="$t('awg.h3Description')"
/>
<FormNumberField
id="h4"
v-model="data.h4"
:label="$t('awg.h4Label')"
:description="$t('awg.h4Description')"
/>
</FormGroup> </FormGroup>
<FormGroup> <FormGroup>
<FormHeading>{{ $t('form.actions') }}</FormHeading> <FormHeading>{{ $t('form.actions') }}</FormHeading>

61
src/app/pages/clients/[id].vue

@ -83,14 +83,59 @@
/> />
</FormGroup> </FormGroup>
<FormGroup v-if="globalStore.information?.isAwg"> <FormGroup v-if="globalStore.information?.isAwg">
<FormHeading>Amnezia</FormHeading> <FormHeading>AmneziaWG Obfuscation Parameters</FormHeading>
<FormNumberField id="jC" v-model="data.jC" label="Jc" />
<FormNumberField id="Jmin" v-model="data.jMin" label="Jmin" /> <FormNumberField
<FormNumberField id="Jmax" v-model="data.jMax" label="Jmax" /> id="jC"
<FormTextField id="i1" v-model="data.i1" label="I1" /> v-model="data.jC"
<FormTextField id="i2" v-model="data.i2" label="I2" /> :label="$t('awg.jCLabel')"
<FormTextField id="i3" v-model="data.i3" label="I3" /> :description="$t('awg.jCDescription')"
<FormTextField id="i4" v-model="data.i4" label="I4" /> />
<FormNumberField
id="Jmin"
v-model="data.jMin"
:label="$t('awg.jMinLabel')"
:description="$t('awg.jMinDescription')"
/>
<FormNumberField
id="Jmax"
v-model="data.jMax"
:label="$t('awg.jMaxLabel')"
:description="$t('awg.jMaxDescription')"
/>
<div class="col-span-full text-sm">* {{ $t('awg.*') }}</div>
<FormTextField
id="i1"
v-model="data.i1"
:label="$t('awg.i1Label')"
:description="$t('awg.i1Description')"
/>
<FormTextField
id="i2"
v-model="data.i2"
:label="$t('awg.i2Label')"
:description="$t('awg.i2Description')"
/>
<FormTextField
id="i3"
v-model="data.i3"
:label="$t('awg.i3Label')"
:description="$t('awg.i3Description')"
/>
<FormTextField
id="i4"
v-model="data.i4"
:label="$t('awg.i4Label')"
:description="$t('awg.i4Description')"
/>
<FormTextField
id="i5"
v-model="data.i5"
:label="$t('awg.i5Label')"
:description="$t('awg.i5Description')"
/>
</FormGroup> </FormGroup>
<FormGroup> <FormGroup>
<FormHeading :description="$t('client.hooksDescription')"> <FormHeading :description="$t('client.hooksDescription')">

35
src/i18n/locales/en.json

@ -237,5 +237,40 @@
"postUp": "PostUp", "postUp": "PostUp",
"preDown": "PreDown", "preDown": "PreDown",
"postDown": "PostDown" "postDown": "PostDown"
},
"awg": {
"jCLabel": "Junk packet count (Jc)",
"jCDescription": "Number of junk packets to send (1-128, recommended: 4-12)",
"jMinLabel": "Junk packet min size (Jmin)",
"jMinDescription": "Minimum size of junk packets (0-1279*, recommended: 8, must be < Jmax)",
"jMaxLabel": "Junk packet max size (Jmax)",
"jMaxDescription": "Maximum size of junk packets (1-1280*, recommended: 80, must be > Jmin)",
"s1Label": "Init packet junk size (S1)",
"s1Description": "Init packet junk size (0-1132[1280* - 148 = 1132], recommended: 15-150, S1+56 ≠ S2)",
"s2Label": "Response packet junk size (S2)",
"s2Description": "Response packet junk size (0-1188[1280* - 92 = 1188], recommended: 15-150)",
"s3Label": "Cookie reply packet junk size (S3)",
"s3Description": "Cookie reply packet junk size",
"s4Label": "Transport packet junk size (S4)",
"s4Description": "Transport packet junk size",
"i1Label": "Special junk packet 1 (I1)",
"i1Description": "Protocol mimic packet in hex format: <b 0x...>",
"i2Label": "Special junk packet 2 (I2)",
"i2Description": "Protocol mimic packet in hex format: <b 0x...>",
"i3Label": "Special junk packet 3 (I3)",
"i3Description": "Protocol mimic packet in hex format: <b 0x...>",
"i4Label": "Special junk packet 4 (I4)",
"i4Description": "Protocol mimic packet in hex format: <b 0x...>",
"i5Label": "Special junk packet 5 (I5)",
"i5Description": "Protocol mimic packet in hex format: <b 0x...>",
"h1Label": "Init magic header (H1)",
"h1Description": "Init packet header value (5-2147483647, must be unique from H2-H4)",
"h2Label": "Response magic header (H2)",
"h2Description": "Response packet header value (5-2147483647, must be unique from H1, H3, H4)",
"h3Label": "Cookie reply magic header (H3)",
"h3Description": "Cookie reply packet header value (5-2147483647, must be unique from H1, H2, H4)",
"h4Label": "Transport magic header (H4)",
"h4Description": "Transport packet header value (5-2147483647, must be unique from H1-H3)",
"*": "Values depend on the MTU"
} }
} }

13
src/server/database/migrations/0002_optimal_pixie.sql → src/server/database/migrations/0002_keen_sleepwalker.sql

@ -5,6 +5,7 @@ ALTER TABLE `clients_table` ADD `i1` text;--> statement-breakpoint
ALTER TABLE `clients_table` ADD `i2` text;--> statement-breakpoint ALTER TABLE `clients_table` ADD `i2` text;--> statement-breakpoint
ALTER TABLE `clients_table` ADD `i3` text;--> statement-breakpoint ALTER TABLE `clients_table` ADD `i3` text;--> statement-breakpoint
ALTER TABLE `clients_table` ADD `i4` text;--> statement-breakpoint ALTER TABLE `clients_table` ADD `i4` text;--> statement-breakpoint
ALTER TABLE `clients_table` ADD `i5` text;--> statement-breakpoint
ALTER TABLE `interfaces_table` ADD `j_c` integer DEFAULT 7;--> statement-breakpoint ALTER TABLE `interfaces_table` ADD `j_c` integer DEFAULT 7;--> statement-breakpoint
ALTER TABLE `interfaces_table` ADD `j_min` integer DEFAULT 10;--> statement-breakpoint ALTER TABLE `interfaces_table` ADD `j_min` integer DEFAULT 10;--> statement-breakpoint
ALTER TABLE `interfaces_table` ADD `j_max` integer DEFAULT 1000;--> statement-breakpoint ALTER TABLE `interfaces_table` ADD `j_max` integer DEFAULT 1000;--> statement-breakpoint
@ -16,14 +17,16 @@ ALTER TABLE `interfaces_table` ADD `i1` text;--> statement-breakpoint
ALTER TABLE `interfaces_table` ADD `i2` text;--> statement-breakpoint ALTER TABLE `interfaces_table` ADD `i2` text;--> statement-breakpoint
ALTER TABLE `interfaces_table` ADD `i3` text;--> statement-breakpoint ALTER TABLE `interfaces_table` ADD `i3` text;--> statement-breakpoint
ALTER TABLE `interfaces_table` ADD `i4` text;--> statement-breakpoint ALTER TABLE `interfaces_table` ADD `i4` text;--> statement-breakpoint
ALTER TABLE `interfaces_table` ADD `h1` integer;--> statement-breakpoint ALTER TABLE `interfaces_table` ADD `i5` text;--> statement-breakpoint
ALTER TABLE `interfaces_table` ADD `h2` integer;--> statement-breakpoint ALTER TABLE `interfaces_table` ADD `h1` integer DEFAULT 0;--> statement-breakpoint
ALTER TABLE `interfaces_table` ADD `h3` integer;--> statement-breakpoint ALTER TABLE `interfaces_table` ADD `h2` integer DEFAULT 0;--> statement-breakpoint
ALTER TABLE `interfaces_table` ADD `h4` integer;--> statement-breakpoint ALTER TABLE `interfaces_table` ADD `h3` integer DEFAULT 0;--> statement-breakpoint
ALTER TABLE `interfaces_table` ADD `h4` integer DEFAULT 0;--> statement-breakpoint
ALTER TABLE `user_configs_table` ADD `default_j_c` integer DEFAULT 7;--> statement-breakpoint ALTER TABLE `user_configs_table` ADD `default_j_c` integer DEFAULT 7;--> statement-breakpoint
ALTER TABLE `user_configs_table` ADD `default_j_min` integer DEFAULT 10;--> statement-breakpoint ALTER TABLE `user_configs_table` ADD `default_j_min` integer DEFAULT 10;--> statement-breakpoint
ALTER TABLE `user_configs_table` ADD `default_j_max` integer DEFAULT 1000;--> statement-breakpoint ALTER TABLE `user_configs_table` ADD `default_j_max` integer DEFAULT 1000;--> statement-breakpoint
ALTER TABLE `user_configs_table` ADD `default_i1` text;--> statement-breakpoint ALTER TABLE `user_configs_table` ADD `default_i1` text;--> statement-breakpoint
ALTER TABLE `user_configs_table` ADD `default_i2` text;--> statement-breakpoint ALTER TABLE `user_configs_table` ADD `default_i2` text;--> statement-breakpoint
ALTER TABLE `user_configs_table` ADD `default_i3` text;--> statement-breakpoint ALTER TABLE `user_configs_table` ADD `default_i3` text;--> statement-breakpoint
ALTER TABLE `user_configs_table` ADD `default_i4` text; ALTER TABLE `user_configs_table` ADD `default_i4` text;--> statement-breakpoint
ALTER TABLE `user_configs_table` ADD `default_i5` text;

35
src/server/database/migrations/meta/0002_snapshot.json

@ -1,7 +1,7 @@
{ {
"version": "6", "version": "6",
"dialect": "sqlite", "dialect": "sqlite",
"id": "56cf26d3-6178-4089-9d94-533d3ea09a26", "id": "e09bc17a-dab6-45a3-a09c-57af222b08fb",
"prevId": "78de2e52-c4a8-4900-86c5-92f34739623a", "prevId": "78de2e52-c4a8-4900-86c5-92f34739623a",
"tables": { "tables": {
"clients_table": { "clients_table": {
@ -186,6 +186,13 @@
"notNull": false, "notNull": false,
"autoincrement": false "autoincrement": false
}, },
"i5": {
"name": "i5",
"type": "text",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"dns": { "dns": {
"name": "dns", "name": "dns",
"type": "text", "type": "text",
@ -564,33 +571,44 @@
"notNull": false, "notNull": false,
"autoincrement": false "autoincrement": false
}, },
"i5": {
"name": "i5",
"type": "text",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"h1": { "h1": {
"name": "h1", "name": "h1",
"type": "integer", "type": "integer",
"primaryKey": false, "primaryKey": false,
"notNull": false, "notNull": false,
"autoincrement": false "autoincrement": false,
"default": 0
}, },
"h2": { "h2": {
"name": "h2", "name": "h2",
"type": "integer", "type": "integer",
"primaryKey": false, "primaryKey": false,
"notNull": false, "notNull": false,
"autoincrement": false "autoincrement": false,
"default": 0
}, },
"h3": { "h3": {
"name": "h3", "name": "h3",
"type": "integer", "type": "integer",
"primaryKey": false, "primaryKey": false,
"notNull": false, "notNull": false,
"autoincrement": false "autoincrement": false,
"default": 0
}, },
"h4": { "h4": {
"name": "h4", "name": "h4",
"type": "integer", "type": "integer",
"primaryKey": false, "primaryKey": false,
"notNull": false, "notNull": false,
"autoincrement": false "autoincrement": false,
"default": 0
}, },
"enabled": { "enabled": {
"name": "enabled", "name": "enabled",
@ -886,6 +904,13 @@
"notNull": false, "notNull": false,
"autoincrement": false "autoincrement": false
}, },
"default_i5": {
"name": "default_i5",
"type": "text",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"host": { "host": {
"name": "host", "name": "host",
"type": "text", "type": "text",

4
src/server/database/migrations/meta/_journal.json

@ -19,8 +19,8 @@
{ {
"idx": 2, "idx": 2,
"version": "6", "version": "6",
"when": 1760948971158, "when": 1761298328460,
"tag": "0002_optimal_pixie", "tag": "0002_keen_sleepwalker",
"breakpoints": true "breakpoints": true
} }
] ]

1
src/server/database/repositories/client/schema.ts

@ -43,6 +43,7 @@ export const client = sqliteTable('clients_table', {
i2: text(), i2: text(),
i3: text(), i3: text(),
i4: text(), i4: text(),
i5: text(),
dns: text({ mode: 'json' }).$type<string[]>(), dns: text({ mode: 'json' }).$type<string[]>(),
serverEndpoint: text('server_endpoint'), serverEndpoint: text('server_endpoint'),
enabled: int({ mode: 'boolean' }).notNull(), enabled: int({ mode: 'boolean' }).notNull(),

1
src/server/database/repositories/client/service.ts

@ -221,6 +221,7 @@ export class ClientService {
i2: clientConfig.defaultI2, i2: clientConfig.defaultI2,
i3: clientConfig.defaultI3, i3: clientConfig.defaultI3,
i4: clientConfig.defaultI4, i4: clientConfig.defaultI4,
i5: clientConfig.defaultI5,
persistentKeepalive: clientConfig.defaultPersistentKeepalive, persistentKeepalive: clientConfig.defaultPersistentKeepalive,
serverAllowedIps: [], serverAllowedIps: [],
enabled: true, enabled: true,

1
src/server/database/repositories/client/types.ts

@ -79,6 +79,7 @@ export const ClientUpdateSchema = schemaForType<UpdateClientType>()(
i2: ISchema, i2: ISchema,
i3: ISchema, i3: ISchema,
i4: ISchema, i4: ISchema,
i5: ISchema,
persistentKeepalive: PersistentKeepaliveSchema, persistentKeepalive: PersistentKeepaliveSchema,
serverEndpoint: AddressSchema.nullable(), serverEndpoint: AddressSchema.nullable(),
dns: DnsSchema.nullable(), dns: DnsSchema.nullable(),

13
src/server/database/repositories/interface/schema.ts

@ -3,10 +3,6 @@ import { int, sqliteTable, text } from 'drizzle-orm/sqlite-core';
import { userConfig, hooks } from '../../schema'; import { userConfig, hooks } from '../../schema';
// H1/H2/H3/H4 — must be unique among each other; recommended range is from 5 to 2147483647 inclusive
const generateRandomHeaderValue = () =>
Math.floor(Math.random() * 2147483642) + 5;
// maybe support multiple interfaces in the future // maybe support multiple interfaces in the future
export const wgInterface = sqliteTable('interfaces_table', { export const wgInterface = sqliteTable('interfaces_table', {
name: text().primaryKey(), name: text().primaryKey(),
@ -28,10 +24,11 @@ export const wgInterface = sqliteTable('interfaces_table', {
i2: text(), i2: text(),
i3: text(), i3: text(),
i4: text(), i4: text(),
h1: int().$defaultFn(generateRandomHeaderValue), i5: text(),
h2: int().$defaultFn(generateRandomHeaderValue), h1: int().default(0),
h3: int().$defaultFn(generateRandomHeaderValue), h2: int().default(0),
h4: int().$defaultFn(generateRandomHeaderValue), h3: int().default(0),
h4: int().default(0),
// does nothing yet // does nothing yet
enabled: int({ mode: 'boolean' }).notNull(), enabled: int({ mode: 'boolean' }).notNull(),
createdAt: text('created_at') createdAt: text('created_at')

1
src/server/database/repositories/interface/types.ts

@ -42,6 +42,7 @@ export const InterfaceUpdateSchema = schemaForType<InterfaceUpdateType>()(
i2: ISchema, i2: ISchema,
i3: ISchema, i3: ISchema,
i4: ISchema, i4: ISchema,
i5: ISchema,
h1: HSchema, h1: HSchema,
h2: HSchema, h2: HSchema,
h3: HSchema, h3: HSchema,

1
src/server/database/repositories/userConfig/schema.ts

@ -25,6 +25,7 @@ export const userConfig = sqliteTable('user_configs_table', {
defaultI2: text('default_i2'), defaultI2: text('default_i2'),
defaultI3: text('default_i3'), defaultI3: text('default_i3'),
defaultI4: text('default_i4'), defaultI4: text('default_i4'),
defaultI5: text('default_i5'),
host: text().notNull(), host: text().notNull(),
port: int().notNull(), port: int().notNull(),
createdAt: text('created_at') createdAt: text('created_at')

1
src/server/database/repositories/userConfig/types.ts

@ -33,6 +33,7 @@ export const UserConfigUpdateSchema = schemaForType<UserConfigUpdateType>()(
defaultI2: ISchema, defaultI2: ISchema,
defaultI3: ISchema, defaultI3: ISchema,
defaultI4: ISchema, defaultI4: ISchema,
defaultI5: ISchema,
host: host, host: host,
}) })
); );

21
src/server/utils/WireGuard.ts

@ -5,6 +5,9 @@ import type { InterfaceType } from '#db/repositories/interface/types';
const WG_DEBUG = debug('WireGuard'); const WG_DEBUG = debug('WireGuard');
const generateRandomHeaderValue = () =>
Math.floor(Math.random() * 2147483642) + 5;
class WireGuard { class WireGuard {
/** /**
* Save and sync config * Save and sync config
@ -196,6 +199,24 @@ class WireGuard {
wgInterface = await Database.interfaces.get(); wgInterface = await Database.interfaces.get();
WG_DEBUG('New Wireguard Keys generated successfully.'); WG_DEBUG('New Wireguard Keys generated successfully.');
} }
if (WG_ENV.WG_EXECUTABLE === 'awg' && wgInterface.h1 === 0) {
WG_DEBUG('Generating random AmneziaWG obfuscation parameters...');
const headers = new Set<number>();
while (headers.size < 4) {
headers.add(generateRandomHeaderValue());
}
const [h1, h2, h3, h4] = Array.from(headers);
wgInterface.h1 = h1;
wgInterface.h2 = h2;
wgInterface.h3 = h3;
wgInterface.h4 = h4;
Database.interfaces.update(wgInterface);
}
WG_DEBUG(`Starting Wireguard Interface ${wgInterface.name}...`); WG_DEBUG(`Starting Wireguard Interface ${wgInterface.name}...`);
await this.#saveWireguardConfig(wgInterface); await this.#saveWireguardConfig(wgInterface);
await wg.down(wgInterface.name).catch(() => {}); await wg.down(wgInterface.name).catch(() => {});

2
src/server/utils/wgHelper.ts

@ -67,6 +67,7 @@ AllowedIPs = ${allowedIps.join(', ')}${extraLines.length ? `\n${extraLines.join(
i2: wgInterface.i2, i2: wgInterface.i2,
i3: wgInterface.i3, i3: wgInterface.i3,
i4: wgInterface.i4, i4: wgInterface.i4,
i5: wgInterface.i5,
H1: wgInterface.h1, H1: wgInterface.h1,
H2: wgInterface.h2, H2: wgInterface.h2,
H3: wgInterface.h3, H3: wgInterface.h3,
@ -134,6 +135,7 @@ PostDown = ${iptablesTemplate(hooks.postDown, wgInterface)}`;
i2: client.i2, i2: client.i2,
i3: client.i3, i3: client.i3,
i4: client.i4, i4: client.i4,
i5: client.i5,
H1: wgInterface.h1, H1: wgInterface.h1,
H2: wgInterface.h2, H2: wgInterface.h2,
H3: wgInterface.h3, H3: wgInterface.h3,

Loading…
Cancel
Save