У меня есть сервер MariaDB (10.0.12) на машине (Ubuntu 14.04), с которой соединяются другие серверы через 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
Я немного опоздал на вечеринку, но я боролся с этой проблемой большую часть дня: SSH-туннель для MySQL просто не получил ответа, а netstat
на удаленном хосте показал SYN_SENT
(с 127.0.0.1
на временном порте на 127.0.0.1:3306
).[12127 impression Для меня проблема заключалась в том, что iptables
был запущен, но не был настроен для разрешения петлевых подключений (примечание: если кто-нибудь знает почему ], это разумное значение по умолчанию, хотелось бы узнать!), и поэтому соединение (пакет SYN) от демона SSH к MySQL разорвано iptables
.
Исправление так же просто, как добавить [11561 83] -i lo -j ACCEPT правило в вашей цепочке INPUT
перед любыми глобальными правилами DROP
. Для меня это было iptables -I INPUT 4 -i lo -j ACCEPT
, но это будет зависеть от ваших существующих правил.
Благодарим за помощь в этом ответе: https : //serverfault.com/a/319267
Изменить: Не забудьте после этого сохранить изменения в iptables!