diff --git a/.config/example.yml b/.config/example.yml index e28a20a3c7..c4c6340076 100644 --- a/.config/example.yml +++ b/.config/example.yml @@ -161,6 +161,9 @@ reservedUsernames: [ # deliverJobMaxAttempts: 12 # inboxJobMaxAttempts: 8 +# Local address used for outgoing requests +#outgoingAddress: 127.0.0.1 + # IP address family used for outgoing request (ipv4, ipv6 or dual) #outgoingAddressFamily: ipv4 diff --git a/packages/backend/src/config/types.ts b/packages/backend/src/config/types.ts index 7ead804a6f..52854db5a5 100644 --- a/packages/backend/src/config/types.ts +++ b/packages/backend/src/config/types.ts @@ -78,6 +78,7 @@ export type Source = { fingerprint?: string; }; + outgoingAddress?: string; outgoingAddressFamily?: "ipv4" | "ipv6" | "dual"; deliverJobConcurrency?: number; diff --git a/packages/backend/src/misc/fetch.ts b/packages/backend/src/misc/fetch.ts index 0e673ba3a8..e47ef0d47a 100644 --- a/packages/backend/src/misc/fetch.ts +++ b/packages/backend/src/misc/fetch.ts @@ -99,6 +99,7 @@ const _http = new http.Agent({ keepAlive: true, keepAliveMsecs: 30 * 1000, lookup: cache.lookup, + localAddress: config.outgoingAddress, } as http.AgentOptions); /** @@ -108,6 +109,7 @@ const _https = new https.Agent({ keepAlive: true, keepAliveMsecs: 30 * 1000, lookup: cache.lookup, + localAddress: config.outgoingAddress, } as https.AgentOptions); const maxSockets = Math.max(256, config.deliverJobConcurrency || 128); @@ -123,6 +125,7 @@ export const httpAgent = config.proxy maxFreeSockets: 256, scheduling: "lifo", proxy: config.proxy, + localAddress: config.outgoingAddress, }) : _http; @@ -137,6 +140,7 @@ export const httpsAgent = config.proxy maxFreeSockets: 256, scheduling: "lifo", proxy: config.proxy, + localAddress: config.outgoingAddress, }) : _https;