3

该问题的目的是在两个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

4

2 回答 2

1

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

  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 它正在连接到远程机器的公共地址,因为它只会通过公共互联网,而不是 SSH 隧道。

于 2013-04-08T17:08:53.950 回答
1

如果您尝试重新发明数据库复制,请考虑一种生产就绪的解决方案。


如果您只想在数据库之间复制选定的数据,您可以使用附加模块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;

国外服务器

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

通过添加sslmode 'require'到您的连接字符串,您只强制执行 SSL 加密连接。在此处阅读手册中的更多信息。

用户映射

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

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

于 2013-04-08T18:12:24.087 回答