Mysql通过ssh经常连接不上或者超时

Mysql通过ssh经常连接不上或者超时

我在一台机器(Ubuntu 14.04)上有一个 MariaDB 服务器(10.0.12),出于安全目的,其他服务器通过 ssh 连接到该服务器。

ssh 隧道通过 autossh 打开,如下所示:

autossh -M 3306 -f -Ng -L 3306:127.0.0.1:3306 mariaDB@server-ip

不幸的是,我经常遇到“无法连接”或“失去连接”的错误:

SQLSTATE[HY000] [2003] Can't connect to MySQL server on '127.0.0.1' (111)

or

SQLSTATE[HY000] [2013] Lost connection to MySQL server at 'reading authorization packet', system error: 0.

以下是一些可能有帮助的附加信息:

MariaDB [(none)]> show global variables like '%timeout';
+-----------------------------+----------+
| Variable_name               | Value    |
+-----------------------------+----------+
| connect_timeout             | 30       |
| delayed_insert_timeout      | 300      |
| innodb_flush_log_at_timeout | 1        |
| innodb_lock_wait_timeout    | 50       |
| innodb_rollback_on_timeout  | OFF      |
| interactive_timeout         | 28800    |
| lock_wait_timeout           | 31536000 |
| net_read_timeout            | 30       |
| net_write_timeout           | 60       |
| slave_net_timeout           | 3600     |
| thread_pool_idle_timeout    | 60       |
| wait_timeout                | 3600     |
+-----------------------------+----------+
12 rows in set (0.00 sec)

执行操作时的 Netstat 输出telnet 172.0.0.1 3306

netstat -naptu|grep 3306
tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN      5249/ssh        
tcp        0      0 127.0.0.1:46701         127.0.0.1:3306          TIME_WAIT   -               
tcp        0      0 127.0.0.1:46712         127.0.0.1:3306          TIME_WAIT   -               
tcp        0      0 127.0.0.1:46702         127.0.0.1:3306          TIME_WAIT   -               
tcp        0      0 127.0.0.1:46647         127.0.0.1:3306          TIME_WAIT   -               
tcp        0      0 127.0.0.1:46704         127.0.0.1:3306          TIME_WAIT   -               
tcp        0      0 127.0.0.1:46705         127.0.0.1:3306          TIME_WAIT   -               
tcp        0      0 127.0.0.1:46703         127.0.0.1:3306          TIME_WAIT   -               
tcp        0      0 127.0.0.1:46709         127.0.0.1:3306          TIME_WAIT   -               
tcp        0      1 37.187.91.194:52674     172.0.0.1:3306          SYN_SENT    5109/telnet     
tcp        0      0 127.0.0.1:46706         127.0.0.1:3306          TIME_WAIT   -               
tcp6       0      0 :::3306                 :::*                    LISTEN      5249/ssh        

Telnet 最终超时:

telnet 172.0.0.1 3306
Trying 172.0.0.1...
telnet: Unable to connect to remote host: Connection timed out

答案1

我来晚了一点,但是我今天大部分时间都在努力解决这个问题:MySQL 的 SSH 隧道就是得不到响应,并且netstat在远程主机上显示SYN_SENT(从127.0.0.1临时端口到127.0.0.1:3306)。

对我来说,问题是它iptables正在运行,但未配置为允许环回连接(旁注:如果有人知道为什么这是一个合理的默认值,我很想找到答案!),因此从 SSH 守护进程到 MySQL 的连接(SYN 数据包)被丢弃了iptables

修复方法很简单,只需在链中的任何全局规则之前添加一条-i lo -j ACCEPT规则即可。对我来说就是这样,但这将根据您现有的规则而有所不同。INPUTDROPiptables -I INPUT 4 -i lo -j ACCEPT

对我帮助最大的是这个答案:https://serverfault.com/a/319267

编辑:之后不要忘记保存你的 iptables 更改!

相关内容