是否可以在两台Windows计算机之间建立SSH隧道? (没有第三方Web服务器)

时间:2013-04-08 14:55:01

标签: postgresql ssh putty

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

为了防止这成为私人/特定问题,我将坚持如何在两台Windows计算机之间没有Web服务器的情况下获得SSH隧道。对于Windows用户来说,这确实是一个普遍的问题。我已经在我公司的六台不同的计算机上试过,两次在家里试过,所有的时间都是同样的答案。从我在论坛和Stack Overflow中所做的研究来看,这是一个常见的问题。我附上了两张图片,以显示SSH服务器在本地运行顺畅,但是当您使用ISP分配的IP地址时,它会失败。

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

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

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

2 个答案:

答案 0 :(得分:1)

是的,这是可能的,但您确切需要做的事情将取决于您拥有的具体设置。 Web服务器不应该是必需的或相关的。我不清楚你想要什么样的联系,但一般来说你需要3件事:

  1. 每台需要登录远程数据库的计算机上的SSH 客户端
  2. 每台需要接受远程登录的计算机上的SSH 服务器
  3. 通过任何防火墙之间的连接从一个连接到另一个的能力
  4. 第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隧道。

答案 1 :(得分:1)

如果您正在尝试重新发明database replication,请考虑一种生产就绪解决方案。


如果您只想在数据库之间复制所选数据,可以使用附加模块dblink将数据直接从DB复制到DB,可选使用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提供密码。在使用任何文档之前,您可能需要读取一些文档。