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) 

执行telnet 172.0.0.1 3306 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 

我晚了一点,但我一直在这个问题上一直在挣扎:一个MySQL的SSH隧道只是不会得到一个响应,远程主机上的netstat显示SYN_SENT (从127.0.0.1在一个短暂的端口127.0.0.1:3306 )。

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

解决方法与在任何全局DROP规则之前在您的INPUT链中添加-i lo -j ACCEPT规则一样简单。 对我来说,这是iptables -I INPUT 4 -i lo -j ACCEPT但是这取决于你现有的规则。

信用帮助我与这一个去这个答案: https : //serverfault.com/a/319267

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