diff --git a/packages/api/src/proc/serverConnectionProcess.js b/packages/api/src/proc/serverConnectionProcess.js
index 3f32c0c5e..327c4f44f 100644
--- a/packages/api/src/proc/serverConnectionProcess.js
+++ b/packages/api/src/proc/serverConnectionProcess.js
@@ -166,7 +166,9 @@ function start() {
if (time - lastPing > 40 * 1000) {
logger.info('Server connection not alive, exiting');
const driver = requireEngineDriver(storedConnection);
- await driver.close(dbhan);
+ if (dbhan) {
+ await driver.close(dbhan);
+ }
process.exit(0);
}
}, 10 * 1000);
diff --git a/packages/api/src/proc/sshForwardProcess.js b/packages/api/src/proc/sshForwardProcess.js
index 63e14bed1..870c00905 100644
--- a/packages/api/src/proc/sshForwardProcess.js
+++ b/packages/api/src/proc/sshForwardProcess.js
@@ -7,7 +7,7 @@ const { getLogger, extractErrorLogData, extractErrorMessage } = require('dbgate-
const logger = getLogger('sshProcess');
-async function getSshConnection(connection) {
+async function getSshConnection(connection, tunnelConfig) {
const sshConfig = {
endHost: connection.sshHost || '',
endPort: connection.sshPort || 22,
@@ -23,6 +23,7 @@ async function getSshConnection(connection) {
: undefined,
skipAutoPrivateKey: true,
noReadline: true,
+ bindHost: tunnelConfig.fromHost,
};
const sshConn = new SSHConnection(sshConfig);
@@ -31,7 +32,7 @@ async function getSshConnection(connection) {
async function handleStart({ connection, tunnelConfig }) {
try {
- const sshConn = await getSshConnection(connection);
+ const sshConn = await getSshConnection(connection, tunnelConfig);
await sshConn.forward(tunnelConfig);
process.send({
diff --git a/packages/api/src/utility/SSHConnection.js b/packages/api/src/utility/SSHConnection.js
index 19aceaa8d..6cd4c4db0 100644
--- a/packages/api/src/utility/SSHConnection.js
+++ b/packages/api/src/utility/SSHConnection.js
@@ -130,7 +130,7 @@ class SSHConnection {
const connectionToBastion = await this.connect(bastionHost);
return new Promise((resolve, reject) => {
connectionToBastion.forwardOut(
- '127.0.0.1',
+ this.options.bindHost,
22,
this.options.endHost,
this.options.endPort || 22,
@@ -228,9 +228,9 @@ class SSHConnection {
options.toPort
);
connection.forwardOut(
- '127.0.0.1',
+ this.options.bindHost,
options.fromPort,
- options.toHost || '127.0.0.1',
+ options.toHost || this.options.bindHost,
options.toPort,
(error, stream) => {
if (error) {
@@ -241,7 +241,7 @@ class SSHConnection {
}
);
})
- .listen(options.fromPort, '127.0.0.1', () => {
+ .listen(options.fromPort, this.options.bindHost, () => {
return resolve();
});
});
diff --git a/packages/api/src/utility/connectUtility.js b/packages/api/src/utility/connectUtility.js
index a8485261a..45d3f5a42 100644
--- a/packages/api/src/utility/connectUtility.js
+++ b/packages/api/src/utility/connectUtility.js
@@ -63,7 +63,7 @@ async function connectUtility(driver, storedConnection, connectionMode, addition
throw new Error(tunnel.message);
}
- connection.server = 'localhost';
+ connection.server = tunnel.localHost;
connection.port = tunnel.localPort;
}
diff --git a/packages/api/src/utility/sshTunnel.js b/packages/api/src/utility/sshTunnel.js
index 85d7fb8e3..aec723b65 100644
--- a/packages/api/src/utility/sshTunnel.js
+++ b/packages/api/src/utility/sshTunnel.js
@@ -61,15 +61,20 @@ function callForwardProcess(connection, tunnelConfig, tunnelCacheKey) {
}
async function getSshTunnel(connection) {
+ const config = require('../controllers/config');
+
const tunnelCacheKey = stableStringify(_.pick(connection, TUNNEL_FIELDS));
+ const globalSettings = await config.getSettings();
return await lock.acquire(tunnelCacheKey, async () => {
if (sshTunnelCache[tunnelCacheKey]) return sshTunnelCache[tunnelCacheKey];
const localPort = await portfinder.getPortPromise({ port: 10000, stopPort: 60000 });
+ const localHost = globalSettings?.['connection.sshBindHost'] || '127.0.0.1';
// workaround for `getPortPromise` not releasing the port quickly enough
await new Promise(resolve => setTimeout(resolve, 500));
const tunnelConfig = {
fromPort: localPort,
+ fromHost: localHost,
toPort: connection.port,
toHost: connection.server,
};
@@ -87,6 +92,7 @@ async function getSshTunnel(connection) {
sshTunnelCache[tunnelCacheKey] = {
state: 'ok',
localPort,
+ localHost,
subprocess,
};
return sshTunnelCache[tunnelCacheKey];
diff --git a/packages/web/src/settings/SettingsModal.svelte b/packages/web/src/settings/SettingsModal.svelte
index b19e8efef..c1a9d4173 100644
--- a/packages/web/src/settings/SettingsModal.svelte
+++ b/packages/web/src/settings/SettingsModal.svelte
@@ -202,6 +202,18 @@ ORDER BY
defaultValue="30"
disabled={values['connection.autoRefresh'] === false}
/>
+