PostgreSQL的SSH隧道 - 拒绝连接

时间:2017-08-20 13:48:10

标签: postgresql ssh

我是第一次尝试在远程/云VPS上设置应用程序(如果重要的话,我正在使用Digital Ocean)。我正在尝试从客户端创建SSH隧道到远程数据库。由于这不是我以前尝试过的,我引用了thisthisthis

查看文章后,我在客户端/本地计算机上运行了以下命令:

 ssh -L 5433:localhost:5432 user@REMOTE_IP

然后我尝试连接:

 psql -h localhost -p 5433 postgres;

但是,我收到以下错误:

psql: could not connect to server: Connection refused
Is the server running on host "localhost" (127.0.0.1) and accepting
TCP/IP connections on port 5433?

据我所知,我的pg_hba.conf(在远程服务器上)是默认的:

# Database administrative login by Unix domain socket
local   all             postgres                                peer

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     peer
# IPv4 local connections:
host    all             all             127.0.0.1/32            md5
# IPv6 local connections:
host    all             all             ::1/128                 md5

我将postgresql.conf中的“listen_addresses”更改为*

    # - Connection Settings -

listen_addresses = '*'          # what IP address(es) to listen on;
                                        # comma-separated list of addresses;
                                        # defaults to 'localhost'; use '*' for all
                                        # (change requires restart)
port = 5432                             # (change requires restart)
max_connections = 100                   # (change requires restart)

我也尝试用127.0.0.1代替本地主机,但没有成功。

任何建议都将受到赞赏; SSH隧道等不是我熟悉的。

感谢。 编辑:

根据@drdaeman的优秀建议,我运行了以下内容:

sudo ssh -N -vvv -L 5433:localhost:5432 user @ host

最后几个调试行如下:

    debug1: Local forwarding listening on 127.0.0.1 port 5433.
debug2: fd 5 setting O_NONBLOCK
debug3: fd 5 is O_NONBLOCK
debug1: channel 1: new [port listener]
debug2: fd 3 setting TCP_NODELAY
debug3: ssh_packet_set_tos: set IP_TOS 0x10
debug1: Requesting no-more-sessions@openssh.com
debug3: send packet: type 80
debug1: Entering interactive session.
debug1: pledge: network
debug3: receive packet: type 80
debug1: client_input_global_request: rtype hostkeys-00@openssh.com want_reply 0

sudo netstat -ltpn | grep 5432

的输出
tcp        0      0 127.0.0.1:5432          0.0.0.0:*               LISTEN      5835/postgres 

它停在那里,对任何命令都没有反应。

感谢任何指示。

1 个答案:

答案 0 :(得分:2)

根据您的描述,一切看起来都不错 - 不要看问题所在,但是您运行的命令和配置看起来是正确的。以下是诊断问题的一般步骤:

首先,检查你的PostgreSQL服务器是否真正在监听。在您的服务器上,运行:

$ sudo netstat -ltpn | grep 5432

(或者您可以使用来自iproute2的ss -ltpn代替较旧的netstat

如果您没有看到任何内容,则表示没有进程正在侦听tcp / 5432。您可以尝试查看PostgreSQL是否在任何地方收听:

$ sudo netstat -lpn | grep postgre

如果没有 - 检查服务器实际运行的时间(取决于操作系统和分发,但先检查ps aux输出)并检查服务器日志(可能在/var/log)看到那里的任何问题。

然后,确保您不会在服务器上意外运行psql(当您使用SSH时,它还会打开shell会话,除非您指定-N标志)。您需要在本地计算机上运行它;)

然后,您还可以考虑将-v(或甚至-vvv)添加到您的ssh命令中 - 它会发出大量有用的调试信息,例如正常操作如下所示:

debug1: Connection to port 5433 forwarding to localhost port 5432 requested.
debug1: channel 3: new [direct-tcpip]
debug1: channel 3: free: direct-tcpip: listening port 5433 for localhost port 5432, connect from ::1 port 60039 to ::1 port 5433, nchannels 4

如果您看到类似channel 3: open failed: connect failed: Connection refused的内容,这意味着PostgreSQL拒绝了连接 - 您需要检查其日志以获取推理 - 可能在启用log_connectionslog_disconnections之后配置(不要忘记重新加载配置)。