【问题标题】:Is it possible to establish an SSH tunnel between two Windows computers? (without a third-party web server) [closed]是否可以在两台 Windows 计算机之间建立 SSH 隧道? (没有第三方网络服务器)[关闭]
【发布时间】:2013-04-08 14:55:01
【问题描述】:

问题的目的是在两个PostgreSQL 数据库之间创建远程连接。我目前使用Navicat。我已经阅读了很多关于使用PuTTYCygwin 创建SSH 服务器的教程,但它只适用于本地测试,当我尝试在另一个中使用公共IP 地址时电脑不行。

为了防止这成为私人/特殊问题,我将坚持如何在两台 Windows 计算机之间获得没有 Web 服务器的 SSH 隧道。对于 Windows 用户来说,这确实是一个普遍的问题。我在公司的六台不同的计算机和家里的两台计算机上都试过,而且一直都是相同的答案。根据我在论坛和 StackOverflow 上所做的研究,这是一个常见问题。我附上两张图,说明SSH服务器在本地运行流畅,但是当你使用ISP分配的IP地址时,它就失败了。

我开始认为在 Windows 环境中执行此操作是一个坏主意.. ps。 1-当您安装 bitvise 时,它​​会自动“打开”端口 22,所以我认为这不是端口问题。 2- 我公司的互联网提供商和家庭的不同,所以我认为这也不是 ISP 的问题。我不知道还有什么...

http://matheus25.site90.net/itworks.jpg

http://matheus25.site90.net/itdoesntwork.jpg

【问题讨论】:

  • 您可以通过 SSH 从一台机器手动登录到另一台机器吗?听起来可能是网络问题。
  • 从描述你真正想要达到的目标开始。您可以随意混合术语:create the ssh server?事实证明,这不是一个合适的问题。
  • 我想我理解“创建 ssh 服务器” - 与 Linux 或 Unix 不同,Windows 机器不会安装开箱即用的 SSH 服务器。但是,您所说的“两个 postgresql 数据库之间的远程连接”是什么意思——您到底在用这个连接做什么?复制?
  • 对不起@ErwinBrandstetter 和Balthus,这次我会尽量让自己更清楚。最终目标是使用 ssh 连接来同步两个数据库(navicat 具有内置的 ssh 登录功能)。现在,为了实现这一点,我为 Windows 安装了一个 ssh 服务器(如 openssh、bitvise 等)。问题是,一旦服务器运行,当我在会话类别的 destination 字段上键入 127.0.0.1 时,它会完美连接(本地主机)。但是,当我输入我的公共地址时,我的 isp 分配给我的那个,putty 没有连接,它只打开 cmd 屏幕,光标卡住。
  • 好的,听起来其中一台数据库服务器实际上也是您运行客户端工具的服务器。数据库没有相互连接这样,Navicat 正在从一个中提取数据/配置并将其推送到另一个。听起来对吗?

标签: postgresql ssh putty


【解决方案1】:

是的,这是可能的,但您需要做什么将取决于您的设置。 Web 服务器不应该是必需的或相关的。我不清楚你到底想要什么连接,但总的来说你需要 3 件事:

  1. 一个 SSH 客户端,在每台需要登录远程数据库的机器上
  2. 一个 SSH 服务器,在每台需要接受远程登录的机器上
  3. 能够通过介于两者之间的任何防火墙等从一个连接到另一个

第 1 项很简单:您可以安装 PuTTY,使用其图形应用程序进行测试,并使用命令行 plink 进行自动连接。 Navicat 也可以自己充当 SSH 客户端,通过 SSH 登录并自动配置隧道,但我没有使用该工具的经验。不过,PuTTY 肯定对初始测试很有用。

第 2 项可能有点棘手:您需要安装 SSH 服务器并配置适当的登录名。

第 3 项可能是也可能不是问题:客户端和服务器旁边可能有防火墙,它可能会限制构成 SSH 连接的流量(通常在端口 22 上),或者它可能已经打开并准备好采用。一种测试方法是从另一个位置运行telnet address.of.remote.machine 22。如果连接失败,则表明该端口上的连接被阻塞;在这种情况下,您可能需要与服务器的主机交谈,询问他们是否可以打开该端口。

一旦您完成所有工作以便您可以使用 PuTTY 手动登录,您需要在客户端配置您的 SSH 隧道,。这些基本上通过使客户端上的本地网络端口(例如,端口 5433)通过 SSH 连接连接到服务器上的不同端口(对于标准 Postgres 安装,端口 5432)来工作。

所以当你告诉 Navicat 连接到“localhost:5433”时,连接是“隧道式”的,实际上是从其他服务器上的端口 5432 向你提供数据。你将不会告诉 Navicat 它正在连接到远程机器的公共地址,因为它只会通过公共 Internet,而不是 SSH 隧道。

【讨论】:

  • 感谢您的支持@IMSoP,到目前为止,您比任何其他教程都更好地涵盖了这些步骤。但是,当您从本地网络转移到互联网时,就会出现巨大的挑战。我建议您查看我的问题的更新部分,以了解普通用户在使用其公共 IP 时会发生什么。
  • 我非常认为这是某个地方的防火墙问题,很可能是在您的 ISP 处:如果他们本身不支持 SSH,他们很可能已经在防火墙中关闭了该端口。一种测试方法是从另一个位置运行telnet address.of.remote.machine 22。如果连接失败,则说明该端口上的连接阻塞。
  • @MikaelBlomkvist 抱歉,“您的 ISP”是指“您的远程服务器的托管服务提供商”。您可能需要很好地询问他们是否可以打开端口 22,因为它可能不在 Windows 服务器的标准列表中。
  • 好主意!我试过 telnet 命令,我认为它在端口 23 上工作,因为它提示登录屏幕,但在端口 22 上没有......有什么建议吗?
  • @Mikael 端口 23 上的实际 telnet 协议对您没有用(我很惊讶它正在监听)。与 SSH 服务器的 telnet 连接不会给您一个登录屏幕,它会等待您向它发送加密数据。它只是作为防火墙规则的精简测试很有用。
【解决方案2】:

如果您想重新发明 database replication,请考虑一种可用于生产的解决方案。


如果您只想在数据库之间复制选定的数据,您可以使用附加模块dblink 将数据直接从数据库复制到数据库,可选使用 SSL 加密 .服务器可以在网络中任何地方

从另一个数据库(网络中的任何地方)获取数据的基本示例如下所示:

CREATE TABLE tbl (tbl_id integer, col1 text, col2 text);

SELECT dblink_connect('myserver');
-- FDW postgresql, USER MAPPING FOR postgres; PW from .pgpass

INSERT INTO tbl (tbl_id, col1, col2)  -- same table exists on foreign server
SELECT *
FROM   dblink('SELECT tbl_id, col1, col2 FROM tbl') AS b(
        tbl_id integer
       ,col1 text
       ,col2 text);

SELECT dblink_disconnect();

您可以轻松地将其封装在一个函数中:

CREATE OR REPLACE FUNCTION foo()
  RETURNS text AS
$func$
 -- code from above goes here
$func$  LANGUAGE sql;

呼叫:

SELECT foo();

我在这里使用FOREIGN SERVER。要创建的基本示例语句:

FDW(仅当您还没有它时):

CREATE FOREIGN DATA WRAPPER postgresql VALIDATOR postgresql_fdw_validator;

Foreign server:

CREATE SERVER myserver
FOREIGN DATA WRAPPER postgresql
OPTIONS (hostaddr '1.2.3.4', port '5432', dbname 'mydb', sslmode 'require');

通过将sslmode 'require' 添加到您的连接字符串中,您只能强制实施 SSL 加密连接。 Read more in the manual here.

User mapping:

CREATE USER MAPPING FOR postgres
SERVER myserver OPTIONS (user 'postgres');

为了简化事情并确保安全,我使用.pgpass file 来提供密码。在使用任何这些之前,您可能需要阅读一些文档。

【讨论】:

  • Erwin 非常感谢您花时间详细说明答案,这似乎是一种更专业的方法。在开始通过navicat进行同步之前,我已经阅读了很多关于复制的内容;我选择了后者,因为只涉及 2 个表,并且复制增加了冲突问题。所以,我已经很满意按下数据同步按钮,它会插入/更新表格,这是它只在本地工作的大事,因此我现在正在为如何在 远程上进行此过程而苦苦挣扎数周b> 级别。 SSH 似乎是答案,但我无法让它工作。
  • 为了防止这成为私人/特殊问题,我将坚持如何在没有 Web 服务器的情况下获得 ssh 隧道。对于 Windows 用户来说,这确实是一个普遍的问题。我在公司尝试了 6 台不同的计算机,在家里尝试了 2 台,并且始终是相同的答案。根据我在论坛和 SO 中所做的研究,这是一个常见问题。我附上了两张图片,显示一个ssh服务器在本地运行流畅,但是当你使用你的isp分配的ip时,它就失败了。我开始认为在 Windows 环境中执行此操作是一个坏主意..
  • @Erwin “网络中的任何地方”部分与任何数据库连接具有相同的要求,包括 Postgres 级别的 pg_hba.conf,以及网络级别的各种防火墙注意事项。
猜你喜欢
  • 2019-03-18
  • 2012-03-18
  • 2011-08-12
  • 1970-01-01
  • 2011-11-25
  • 1970-01-01
  • 2020-12-21
  • 1970-01-01
  • 2016-11-07
相关资源
最近更新 更多