我正在尝试允许外部客户端通过极其严格的大学防火墙(即仅开放端口 80 和 443)访问我的数据库服务器。为了允许客户端与服务器通信,我计划将服务器监听的端口从(MySQL 默认)端口 3306 更改为端口 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-server 和 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 启动吗?
答案1
鉴于这些限制
- 仅限端口
80
和443
可用
并牢记安全
- MySQL 不应以 root 身份运行(特权端口
< 1024
需要 root 访问权限) - 最好避免让 MySQL 监听公共 IP
我建议使用 SSH 或 OpenVPN 监听端口443
。这样,您可以将 MySQL 保留在默认端口上3306
,并仅允许从localhost
(如果使用 SSH 隧道)或 OpenVPN 使用的内部 IP 池进行访问。使这种方法更好的其他原因包括:
- 防火墙可能对端口 进行内容过滤
80
。透明代理会丢弃 MySQL 流量,因为它只假设 HTTP 流量。 - 尝试检测端口上的加密非 HTTPS 流量很困难,也不常见
443
。因此,SSH 和 OpenVPN 都可以在大多数远程位置上运行。 - 您最终不必仅为 MySQL 保留端口
80
。443
这意味着您可以允许最多 2 种不同的协议,而使用 SSH 隧道或 VPN 则不受任何限制,如果将来服务数量增加的话。
答案2
按照 Esa Jokinen 的建议,我关闭了服务器的 HTTPS 端口 - 并将其专用于 SSH。然后我可以通过隧道穿过学院防火墙,因为内容没有被过滤。使用 PuTTY,我能够创建此隧道并为其分配一个端口以允许 MySQL 流量通过 - 效果很好!
对于希望在 Windows 上执行相同操作的任何人,我遵循本指南;
https://www.skyverge.com/blog/how-to-set-up-an-ssh-tunnel-with-putty/