Назад | Перейти на главную страницу

Сервер MySQL не запускается на нестандартном порту

Я пытаюсь разрешить внешним клиентам доступ к моему серверу базы данных через чрезвычайно строгий межсетевой экран колледжа, то есть открыты только порты 80 и 443. Чтобы клиенты могли обмениваться данными с сервером, я планировал изменить порт, который сервер слушает, с порта 3306 (по умолчанию MySQL) на порт 80. При изменении настроек в файле /var/mysql/my.cnf для отражения изменений Хочу сделать, сервер mysql запускаться отказывается.

Server: Debian 8.0 x64
MySQL Server: 5.5.57-0+deb8u1

Конфигурация для MySQL: (/etc/mysql/my.cnf)

[client]
port        = 80
socket      = /var/run/mysqld/mysqld.sock

[mysqld_safe]
socket      = /var/run/mysqld/mysqld.sock
nice        = 0

[mysqld]
user        = mysql
pid-file    = /var/run/mysqld/mysqld.pid
socket      = /var/run/mysqld/mysqld.sock
port        = 80
basedir     = /usr
datadir     = /var/lib/mysql
tmpdir      = /tmp
lc-messages-dir = /usr/share/mysql
skip-external-locking
#bind-address       = 127.0.0.1
key_buffer      = 16M
max_allowed_packet  = 16M
thread_stack        = 192K
thread_cache_size       = 8
myisam-recover         = BACKUP
#max_connections        = 100
#table_cache            = 64
#thread_concurrency     = 10
query_cache_limit   = 1M
query_cache_size        = 16M
#general_log_file        = /var/log/mysql/mysql.log
#general_log             = 1
log_error = /var/log/mysql/error.log
expire_logs_days    = 10
max_binlog_size         = 100M

[mysqldump]
quick
quote-names
max_allowed_packet  = 16M

[mysql]
#no-auto-rehash # faster start of mysql but no tab completition

[isamchk]
key_buffer      = 16M

!includedir /etc/mysql/conf.d/

Примечание. Единственные изменения, внесенные в порт [client], порт [mysqld] и прокомментированный 'bind-address'.

При попытке запустить сервер в журнале (/var/log/mysql/error.log) указано:

171013  1:25:50 [Warning] Using unique option prefix myisam-recover instead of myisam-recover-options is deprecated and will be removed in a future release. Please use the full name instead.
171013  1:25:50 [Note] Plugin 'FEDERATED' is disabled.
171013  1:25:50 InnoDB: The InnoDB memory heap is disabled
171013  1:25:50 InnoDB: Mutexes and rw_locks use GCC atomic builtins
171013  1:25:50 InnoDB: Compressed tables use zlib 1.2.8
171013  1:25:50 InnoDB: Using Linux native AIO
171013  1:25:50 InnoDB: Initializing buffer pool, size = 128.0M
171013  1:25:50 InnoDB: Completed initialization of buffer pool
171013  1:25:50 InnoDB: highest supported file format is Barracuda.
171013  1:25:51  InnoDB: Waiting for the background threads to start
171013  1:25:52 InnoDB: 5.5.57 started; log sequence number 1595685
171013  1:25:52 [Note] Server hostname (bind-address): '0.0.0.0'; port: 80
171013  1:25:52 [Note]   - '0.0.0.0' resolves to '0.0.0.0';
171013  1:25:52 [Note] Server socket created on IP: '0.0.0.0'.
171013  1:25:52 [ERROR] Can't start server: Bind on TCP/IP port: Permission denied
171013  1:25:52 [ERROR] Do you already have another mysqld server running on port: 80 ?
171013  1:25:52 [ERROR] Aborting

171013  1:25:52  InnoDB: Starting shutdown...
171013  1:25:52  InnoDB: Shutdown completed; log sequence number 1595685
171013  1:25:52 [Note] /usr/sbin/mysqld: Shutdown complete

Это говорит о том, что порт 80 используется другим процессом, но это неверно, если сервер выполняет новую установку. Если установлен только MySQL-сервер и Fail2Ban, другой процесс не может его использовать.

netstat -pln подтверждает это:

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      3070/sshd
tcp6       0      0 :::22                   :::*                    LISTEN      3070/sshd
Active UNIX domain sockets (only servers)
Proto RefCnt Flags       Type       State         I-Node   PID/Program name    Path
unix  2      [ ACC ]     SEQPACKET  LISTENING     969834547 1/systemd           /run/udev/control
unix  2      [ ACC ]     STREAM     LISTENING     969834550 1/systemd           /run/systemd/journal/stdout
unix  2      [ ACC ]     STREAM     LISTENING     970364573 1/systemd           /run/systemd/private
unix  2      [ ACC ]     STREAM     LISTENING     972931518 5692/python         /var/run/fail2ban/fail2ban.sock

Может ли кто-нибудь предложить решение этой проблемы и / или объяснить, почему сервер не запускается с портом 80?

Как предложил Эса Йокинен, я отключил порт HTTPS сервера и посвятил его SSH. Затем мне разрешают пройти через брандмауэр колледжа с туннелем, поскольку контент не фильтруется. Используя PuTTY, я смог создать этот туннель и назначить ему порт, чтобы пропускать трафик MySQL - отличная работа!

Для всех, кто хочет сделать то же самое в Windows, я следовал этому руководству;

https://www.skyverge.com/blog/how-to-set-up-an-ssh-tunnel-with-putty/

Учитывая эти ограничения

  • только порты 80 и 443 доступный

и помня о безопасности

  • MySQL не должен запускаться от имени пользователя root (привилегированные порты < 1024 нужен root-доступ)
  • лучше избегать прослушивания MySQL на общедоступном IP

Я бы предложил SSH или OpenVPN прослушивать порт 443. Таким образом, вы можете оставить свой MySQL на порту по умолчанию 3306 и разрешить доступ только из localhost (в случае SSH-туннелирования) или внутренний пул IP-адресов, используемый OpenVPN. Другие причины, улучшающие этот подход, включают:

  • Брандмауэры могут иметь фильтрацию содержимого по порту 80. Прозрачный прокси отбрасывает трафик MySQL, поскольку он принимает только HTTP-трафик.
  • Трудно и не так часто пытаться обнаружить зашифрованный трафик без HTTPS на порту 443. Следовательно, и SSH, и OpenVPN будут работать в большинстве удаленных мест.
  • Вы не зарезервируете порт 80 или 443 только для MySQL. Это означало бы, что вы можете разрешить максимум 2 разных протокола, при использовании SSH-туннелирования или VPN у вас нет никаких ограничений, если количество услуг увеличится в будущем.