碰到一个运维问题,目标是需要远程访问mysql,花了一些时间总算搞定,聊作记录。
场景是远程有一台物理服务器WinServer2012,里头用VMware装了若干台Ubuntu 16.04虚拟机,虚拟机网络采样NAT方式,在虚拟机里搭的mysql,3306端口,在虚拟机内部通过localhost或者127.0.0.1是可以访问的,外网无法访问。
外网要访问虚拟机里的mysql在3306端口的服务,需要做好三件事情:
1. 将物理主机(假定ip为202.113.xxx.xxx)的一个端口(这里用13306)映射到虚拟机的3306端口
2. 物理服务器和虚拟机的防火墙设置,确保物理主机的13306端口外网能访问,确保虚拟机的3306端口能通过主机访问。
3. mysql远程访问权限设置以及ip绑定修改
在VMware中设置端口映射,首先在虚拟机里通过ifconfig查看虚拟机在局域网中的ip,这里我用192.168.56.133,有时候多个局域网地址不知道该用哪个,先看看VMware里NAT的子网地址,比如这里是192.168.56.0,那么就选属于这
个子网的那个ip。
然后在虚拟网络编辑器里进入NAT设置窗口,添加一项端口转发,填写用于外网访问的主机端口,虚拟机ip和mysql端口3306,类型选择TCP。
做完端口映射讲道理现在访问主机202.113.xxx.xxx:13306就相当于在访问虚拟机的3306端口了,但是还要确保端口是对外开放的。查看某个ip是否可达我们可以ping一下这个地址,而查看某ip的某个端口是否可以访问,如果在机器内检查自己的端口服务情况就用netstat查看,也可以从外部检验端口,想搞事情的话可以用端口扫描工具,其实这里用telnet就很方便。
我们先在远程telnet一下服务器主机13306端口,如果连接不上,一般我们服务器还是不能直接粗暴地关防火墙的,就需要去控制面板->系统和安全->Windows 防火墙->高级设置里新建一个入站规则,选择端口类型,允许外网连接这个端口。再在远程telnet一下这个端口,确认可以连接。
好了,远程对服务器主机的13306端口telnet通了,我们再到物理主机里用局域网ip来telnet虚拟机的3306端口看看通不通。如果不通,就需要到Ubuntu虚拟机里修改防火墙,有几种途径,用iptables命令,修改iptables的配置文件以及用ufw命令。iptables命令行工具比较常用,ufw也很方便,修改iptables配置文件就麻烦一点,不同系统版本的配置文件名字和位置有些不一样,容易晕乎。
iptables有很多实用细节,可以参考此文,不同系统还是稍有些出入,得自己慢慢试,举几个我们此处用到的例子。
sudo iptables -L #查看防火墙规则列表
sudo iptables -F #清空防火墙规则
sudo iptables -A INPUT -p tcp --dport 3306 -j ACCEPT #设置3306外部端口可访问
service iptables save #使iptables设置长久有效,重启不丢失
1 启用
sudo ufw enable
sudo ufw default deny
作用:开启了防火墙并随系统启动同时关闭所有外部对本机的访问(本机访问外部正常)。
2 关闭
sudo ufw disable
2 查看防火墙状态
sudo ufw status
3 开启/禁用相应端口或服务举例
sudo ufw allow 3306 允许外部访问80端口
sudo ufw delete allow 3306 禁止外部访问80 端口
sudo ufw allow from 192.168.1.1 允许此IP访问所有的本机端口
做完端口映射,也设置了防火墙,远程访问mysql还是can not connect to mysql server,那还有一件事要考虑就是mysql server的远程访问限制。想起当初实习的时候leader叫我看两遍《mysql5.5中文参考手册》,现在也没看完一遍,借此又翻一翻手册,Mysql访问权限系统那一节。我们要做的呢就是将访问权限all一下。
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'WITH GRANT OPTION; //任何远程主机都可以访问数据库
mysql> FLUSH PRIVILEGES; //需要输入次命令使修改生效
此外ubuntu中mysql默认绑定的是127.0.0.1,这样就只允许本机登录,想要允许其他地方登录只需要把bind改成公网ip或者任何ip均可。需要编辑配置文件mysqld.cnf,一般位置在
/etc/mysql/mysql.conf.d/mysqld.cnf
到此远程的机器就成功通过物理主机的映射端口访问虚拟机里的mysql服务了,
同样的道理做web服务,ssh远程有是一个套路。