碰到一個運維問題,目標是需要遠程訪問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綁定修改
1. 端口映射
在VMware中設置端口映射,首先在虛擬機裏通過ifconfig查看虛擬機在局域網中的ip,這裏我用192.168.56.133,有時候多個局域網地址不知道該用哪個,先看看VMware裏NAT的子網地址,比如這裏是192.168.56.0,那麼就選屬於這
個子網的那個ip。
然後在虛擬網絡編輯器裏進入NAT設置窗口,添加一項端口轉發,填寫用於外網訪問的主機端口,虛擬機ip和mysql端口3306,類型選擇TCP。
2. 防火牆設置
做完端口映射講道理現在訪問主機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外部端口可訪問
用命令配置是即時生效的,重啓以後規則又會丟失。想要永久有效可以去修改iptables配置文件,也可以用命令
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訪問所有的本機端口
3. mysql遠程訪問配置
做完端口映射,也設置了防火牆,遠程訪問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遠程有是一個套路。