Вопрос: Как разрешить удаленный доступ MySQL к одному статическому IP?


Я пытаюсь включить удаленный доступ к MySQL через порт 3306, но не повезло. Мне предоставлен корневой доступ к производственной машине, чтобы я мог захватывать файлы и базы данных, работать с ними локально и возвращать измененные версии.

Мой доступ позволяет мне SSH в поле, и он позволяет FTP через SSH. Теперь я пытаюсь получить доступ к MySQL через SSH. MySQL работает (прослушивается локально) и доступен в командной строке и не имеет к нему доступа.

Я понимаю, что могу просто сбросить базу данных, восстановить файл локально и выполнить мою модификацию. Однако в будущем мне, вероятно, понадобится изменить некоторые вещи, и я бы предпочел не делать этого в командной строке, так как это быстрее с помощью графического интерфейса. Или было бы, если бы я мог подключиться, как я хочу.


7
2018-01-22 18:27


Источник




Ответы:


EDIT: Если вы используете Windows, ниже приведены инструкции, которые необходимо учитывать:

1) Изменение localhost в 127.0.0.1 поскольку Windows не имеет такой автоматической установки в %SystemRoot%\system32\drivers\etc\hosts,

2) Вы можете использовать малоизвестные plink.exe инструмент командной строки из PuTTY набор инструментов; он использует тот же синтаксис для опций, что и ssh поэтому, если вы замените ssh в приведенных ниже примерах с plink.exe все должно работать.


Вы хотите использовать туннель SSH для перенаправления локального порта на ваш клиент в порт mysql на сервере. Вы можете сделать это с помощью:

% ssh -f -N -L3306:localhost:3306 username@remoteserver
% mysql -h remoteserver -u mysqluser -p

Варианты SSH имею в виду:

-f Requests ssh to go to background just before command execution.
-N Do not execute a remote command.
-L [bind_address:]port:host:hostport
   Specifies that the given port on the local (client) host is to be 
   forwarded to the given host and port on the remote side.

С помощью -f -N также означает, что вы должны разветвить процесс ssh на задний план, а не оставаться подключенным к удаленному хосту так, как обычно, при входе в удаленную оболочку. Если вы хотите снести туннель, вы можете убить процесс ssh на своем клиенте следующим образом:

% pgrep -fl ssh
11145 ssh -f -N -L3306:localhost:3306 username@remoteserver
% kill -9 11145

Конечно, в этом случае 11145 это PID процесса ssh, который будет отличаться каждый раз, когда вы начинаете новый процесс ssh, чтобы открыть туннель.

Кроме того, это предполагает, что вы не сервер mysql также работает на вашем клиенте. Если это так, вам нужно будет изменить локальный порт, который вы связываете так:

% ssh -f -N -L3333:localhost:3306 username@remoteserver
% mysql -P 3333 -h remoteserver -u mysqluser -p

Порт 3333 произвольно; вы можете выбрать любой свободный номер порта, который имеет ваш клиент.


3
2018-01-23 06:34



Это именно то, что я хотел сделать, но я использую Windows в этом. Вчера вечером у меня был друг, и мы (он) поняли это для меня. - Codecraft
Если вы застряли в Windows, вы можете использовать малоизвестные палить инструмент командной строки из PuTTY набор инструментов; он использует тот же синтаксис для параметров, поэтому, если вы замените ssh в приведенных выше примерах с plink все должно работать. - aculich


С помощью -s 192.168.100.0/24 означает, что вы разрешаете доступ к порту 3306 удаленно для диапазонов IP, соответствующих 192.168.100.0/24, который является частной внутренней сетью. Это действительно то, что вы намереваетесь сделать? В противном случае это проблема, почему удаленные подключения от других IP-адресов не работают.

Обычно вам также не требуется правило выхода.

Если это не поможет, просьба предоставить немного больше информации о том, где вы тестируете, IP-адреса / интерфейсы машины, что происходит и, возможно, полный вывод iptables -vnL для нас?

Редактировать 1:
Основываясь на дополнительной информации, он показывает, что пример, используемый в качестве шаблона, был неправильно понят, вам нужно удалить исходный IP-диапазон (потому что вы хотите разрешить всем удаленно). Просто введите это и только это, и он должен работать:

iptables -A INPUT -i eth0 -p tcp --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT

Если вы хотите включить свой внешний IP-адрес, он должен быть IP-адресом назначения, например:

    iptables -A INPUT -i eth0 -p tcp -d xx.xx.xx.xx --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT

-s, как в источнике, используется только в том случае, если вы хотите ограничить доступ с определенных диапазонов IP.

Изменить 2:
Совсем не похоже на вопрос iptables, но больше на mySQL. Чтобы mySQL мог полностью прослушивать удаленные подключения, обязательно настройте его для прослушивания внешнего адреса. редактировать /etc/mysql/my.cnf и проверьте bind-address и измените его на:

bind-address = xx.xxx.xx.xx

Либо вы решили заменить xx.xx.xx.xx своим внешним IP-адресом, либо вы можете настроить его для прослушивания 0.0.0.0 что означает, что он будет слушать все интерфейсы.

После этого вам будет задан вопрос о том, как настроить весь брандмауэр для вашего сервера в первую очередь. Либо вы вручную заблокируете все определенные порты, к которым никто другой не сможет добраться, либо вам необходимо установить политику по умолчанию для отклонения трафика, а затем вручную открыть порт по порту (как указано в вашем первоначальном вопросе) для служб, которые вы хотите разрешить. Быть ОЧЕНЬ осторожно с этим, хотя, если его удаленная машина очень легко заблокировать себя, если вы поместите вещи неправильным порядком или неправильным способом.


4
2018-01-22 18:34



Вот пример со страницы, на которую я смотрел, вместо этого я заменил свой собственный внешний IP. - Codecraft
Если вы добавляете внешний IP-адрес, это означает, что вы разрешаете трафик (-s, как в источнике) ваш внешний IP-адрес на порт 3306. Чтобы разрешить любой вид трафика просто удалить -s 192.168.100.0/24 полностью, просто уходите: iptables -A INPUT -i eth0 -p tcp --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT - Mattias Ahnberg
Я хочу, чтобы он был доступен из моей сети, следовательно, IP-адрес. Я не хочу, чтобы открытый порт MySQL приглашал людей идти ... - Codecraft
Ага. Тогда совершенно другая ситуация. Вы сказали, что хотите получить доступ к нему удаленно. : P Я также вижу, что политика по умолчанию ACCEPT, и вы никому не отправляете трафик, поэтому брандмауэр не является проблемой в вашем случае в конце концов. Возможно, вам нужно настроить mySQL для прослушивания удаленных подключений. - Mattias Ahnberg
Да, это означает, что он просто слушает localhost. Вы можете легко туннелировать через SSH, хотя, я делаю это все время. От вашего клиента: ssh user@remote.host -L 3305:localhost:3306 а затем в другом терминале на клиенте выполните: mysql -h 127.0.0.1 -P 3305 -u username -p и вы подключитесь к удаленному mySQL через туннель SSH. Это предполагает, что удаленный сервер не заблокировал переадресацию портов и т. Д., Но обычно работает отлично! - Mattias Ahnberg


-A переход на iptables добавляет новые правила, а затем конец цепочки. Вероятно, у вас есть более раннее правило, запрещающее доступ, и с iptables выигрывает первый матч. Попробуйте использовать -I чтобы вставить правило в начале цепочки.

Если это не сработает, сообщите нам о выходе iptables -L -v -n как редактирование на ваш вопрос.


1
2018-01-22 19:14



Как представляется, никаких других правил нет, я отредактировал вопрос, однако xx.xx.xx.xx фактически является моим внешним IP-адресом. - Codecraft
@Codecrat: Вы разрешили удаленному хосту подключиться к серверу mysql? Пытаться telnet yourserver.tld 3306 и посмотреть, что он говорит. - Iain
Если я использую telnet (используя PuTTy) до 3306, он просто идет «boing» и выходит. Я могу использовать SSH просто отлично (это то, как я на сервере изменяю iptables). Я использовал свой MySQL-клиент (SQLYog) для доступа к MySQL через SSH, но он говорит, что он не может аутентифицироваться (используя те же SSH-учетные данные, что и я, чтобы получить доступ к терминалу). FTP через SSH работает отлично. Что-то странное! - Codecraft
используйте telnet с удаленного компьютера, к которому вы пытаетесь разрешить доступ. - Iain
В соединении отказано. - Codecraft


ПРИНИМАЕТСЯ ваша политика по умолчанию для INPUT и OUTPUT. Вы не определили какие-либо правила для удаления или отклонения пакетов. Это означает, что ваш брандмауэр не блокирует какие-либо подключения.

Проблема в другом.

использование netstat -tan | grep LISTEN чтобы убедиться, что вы используете MySQL и что он прослушивает.

Если это работает, возможно, есть еще один межсетевой экран, который блокирует соединение.


1
2018-01-23 11:36



Его запуск, веб-сайт запущен и работает, и я могу легко получить доступ к MySQL в командной строке, но это не полезно для разработки. Я был немного подозрительно относился к пустоте iptables, а также, если честно, но мне нечего делать дальше - у меня нет доступа к предыдущему разработчику, который перешел, а владелец проекта - технический. Я взял удар в IPTables, потому что мне дали вход в панель веб-хоста, и был предыдущий билет с просьбой о удалённом доступе, на который ответили, что его нужно настроить в IP-таблицах на самом сервере. - Codecraft
Apache, PHP и клиент командной строки могут взаимодействовать с сервером MySQL с помощью сокета без использования сети. netstat команда проверяет, что он также прослушивает. - Ladadadada
Я выполнил команду и предположил, что она показывает, что она была и прослушивается (127.0.0.1:3306) - Codecraft


Я нашел ответ на свой вопрос (я должен был уточнить, что я использую Windows 7 локально, а linux удаленно).

Во всяком случае, ответ заключался в том, чтобы отправить порт с помощью PuTTy, как и у другого ответчика, но это для пользователей Windows.

В PuTTy настройте соединение SSH как обычно, а затем перейдите к настройкам туннелей, под SSH, выберите произвольный порт (я использовал 5555) локально, чтобы переслать до 127.0.0.1:3306

PuTTy Tunneling Options

Откройте сеанс SSH и войдите в систему как обычно.

Затем в вашем клиенте MySQL установите адрес узла 127.0.0.1 и порт для выбранного вами (5555).

Следовательно, клиент MySQL подключается к вашей локальной машине, которая, в свою очередь, пересылается через SSH на 3306 на удаленном компьютере и разрешает соединение.

БОЛЬШОЕ ПРИМЕЧАНИЕ: Мы действительно создали эту настройку, используя термин локальный (как и вы) вместо 127.0.0.1, где-то между PuTTy и MySQL Client, это не помогло - так что, похоже, вы должны использовать loopback-адрес!


1
2018-03-29 02:59



Ах, да ... еще одна досада Windows, что у нее нет 127.0.0.1 решения для localhost. Это можно сделать, если вы добавите его в %SystemRoot%\system32\drivers\etc\hosts на вашей системе, но да, рад видеть, что вы поняли это, изменив числовое представление; Я уточню свой ответ с дополнительной информацией. Кроме того, вы можете использовать палить инструмент командной строки из PuTTY если вы не хотите открывать инструмент GUI PuTTY. - aculich
Когда вы используете клиентскую машину Windows, вы можете проверить HeidiSQL (www.heidisql.com), который позволяет вам управлять вашей системой MySQL через SSH-соединение без необходимости использования дополнительного программного обеспечения. - John Gardeniers
@aculich Я принял ваш ответ; вряд ли кажется справедливым, чтобы принять мои собственные :) - Codecraft
@JohnGardeniers клиент SQL, который я использую (SQLYog), имеет опции для подключения через SSH-туннель, но по какой-то неизвестной причине он не будет аутентифицироваться, хотя я не использую последнюю версию - отсюда обходной путь. - Codecraft
@Codecraft, HeidiSQL часто страдал от этой же проблемы, и чаще всего это был случай слишком короткого тайм-аута, поэтому, если это настраивается на SQLYog, возможно, стоит поэкспериментировать. - John Gardeniers


Спасибо огромное! Я пытался использовать все виды дерьма, чтобы иметь возможность использовать MySQL Workbench удаленно для работы с таблицами в моей реализации CentOS MySQL. В основном единственным решением было открыть порт 3306 для всех (плохо для безопасности).

Мы уже использовали Putty для безопасного доступа к командной строке на наш сервер и не подозревали, что мы могли бы создать такой туннель. В принципе, мы можем использовать существующее безопасное соединение SSH для подключения MySQL Workbench к нашему серверу. Спасибо ! ! !


0



Добро пожаловать в Server Fault! Этот сайт является сайтом Q & A, а не форумом. Вы не отвечаете на исходный вопрос OP. См. Вопросы-Ответы для получения дополнительной информации. - slm