使用本地SSH隧道与Docker(PhpMyAdmin)-连接被拒绝

9rnv2umw  于 2022-11-09  发布在  PHP
关注(0)|答案(1)|浏览(248)

我正在运行PhpMyAdmin使用Docker在我的本地机器上与docker-compose。在远程服务器上,我正在使用mysql用户谁只能从本地主机访问,这就是为什么我需要ssh隧道。

version: '3.1'

services:
  phpmyadmin:
    image: phpmyadmin
    restart: always
    ports:
      - 8080:80
    environment:
      - PMA_ARBITRARY=1
    volumes:
      - /usr/local/etc/php/php.ini:/php-make/upload.ini
      - ./config.inc.php:/etc/phpmyadmin/config.inc.php
    networks:
      - host

networks:
  host:

由于我使用主机网络,Docker容器应该知道本地端口转发(不太确定这一点,但我不能找到很多关于主机网络实际上是如何工作的在线信息)。
SSH配置

host remote-server-name
    HostName remote-server-ip
    User user
    IdentityFile path-to-ssh-key
    ForwardAgent yes
    LocalForward 3306 127.0.0.1:3306

在我对远程服务器执行ssh之后,我的本地机器上应该有一个指向远程服务器上的3306端口的隧道。下面是netstat -tulpn来确认:

tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      17506/ssh

PhpMyAdmin的服务器选择配置(phpmyadmin.config.inc)

$cfg['Servers'][$i]['verbose'] = 'remote-server-name';
$cfg['Servers'][$i]['host'] = '127.0.0.1';
$cfg['Servers'][$i]['port'] = '3306';
$cfg['Servers'][$i]['connect_type'] = 'tcp';
$cfg['Servers'][$i]['extension'] = 'mysqli';
$cfg['Servers'][$i]['auth_type'] = 'cookie';
$cfg['Servers'][$i]['AllowNoPassword'] = false;
$cfg['LoginCookieValidity'] = 24*60*60*30;

在服务器选择中选择remote-server-name后,我得到以下消息

mysqli::real_connect(): (HY000/2002): Connection refused

这意味着mysql用户不允许从给定的ip地址访问(在这种情况下是我的公共ip),我猜这是因为docker容器没有从我的本地机器使用ssh隧道,即使我使用的是主机网络(我也不确定它实际上是做什么的)。
有人知道我哪里做错了吗?

q9yhzks0

q9yhzks01#

您需要更改服务配置,以表明

services:
  phpmyadmin:
    network_mode: host
    # and not networks:

您的配置创建了一个名为host的合成网络,但它不是“主机网络”。
您可以使用不同的方法连接到ssh隧道;特别是,如果你在MacOS或Windows主机上,主机网络就不起作用了(你连接到一个隐藏的Linux VM的“主机网络”),你需要使用特殊的host.docker.internal主机名而不是localhost。为此,你根本不需要任何特殊的networks:network_mode:选项。
您可能需要更改ssh隧道侦听器的设置,127.0.0.1:3306设置绑定到主机的localhost接口,但至少在本机Linux上,请求实际上是从docker0接口到达的。将隧道侦听器设置为侦听0.0.0.0:3306将解决此问题,但也将允许网络上的其他人连接到转发的数据库。这不是一个简单的解决方案。

相关问题