1. 程式人生 > >解決阿里雲無法正常使用samba的問題

解決阿里雲無法正常使用samba的問題

昨天在阿里雲上申請了一個雲伺服器,系統用的是ubuntu14.04,由於是免費的(初次使用),配置較低(單核1G記憶體,40G硬碟),所以在伺服器上不方便安裝圖形介面(預設的系統映象是沒有桌面系統的,畢竟只是伺服器),沒有圖形介面總覺得不是很方便,就想著用samba把遠端目錄掛載到本地來訪問更方便一些,但是其中卻遇到了不少問題,記錄一下。

(1)我起初的操作

首先在用ssh遠端登入到伺服器(開始以root賬戶登入):

建立賬戶warren:

adduser warren

將warren新增為sudoers:

vim /etc/sudoers

在root    ALL=(ALL:ALL) ALL下面一行新增:

warren  ALL=(ALL:ALL) ALL

儲存並退出,則warren賬戶有了sudo的許可權

su warren

sudo apt-get update

sudo apt-get install samba

sudo vim /etc/samba/smb.conf

配置自己的共享目錄

[warren]
   comment = warren
   path = /home/warren
   browseable = yes
   read only = yes
   guest ok = no

這樣配置好了,執行:

sudo smbpasswd -a warren

輸入密碼將warren加入samba賬戶,用於安全登入

sudo service smdb restart

這樣samba伺服器基本配置完成,本以為大功告成了,誰知道後面卻遇到了一大堆問題。

(2)遇到的問題

1.windows下無法掛載

在本地的windows(win7)上試著連結:

開啟任何一個資料夾,在位址列輸入

\\公網ip地址\共享目錄,卻是死活連不上,

以為是本地防火牆的原因,試著打開了防火牆中關於smb服務的規則,仍然不行

後來有看了網上說開啟什麼Serser,workstation等服務,還是不行。

後來我開始懷疑是伺服器端的配置有問題,為了確定是伺服器問題還是客戶端問題,我就試著在本地Ubuntu下掛載。

2.Ubuntu下無法掛載

試著掛載命令: sudo mount -t cifs //公網ip地址/共享目錄 /本地掛載目錄 -o username=warren,passwd=前面設定的密碼
(注意共享目錄是warren,而不是路徑/home/warren) 結果: mount error(115): Operation now in progress
Refer to the mount.cifs(8) manual page (e.g. man mount.cifs)
為了查詢原因我決定深入瞭解一下samba samba使用了兩個服務: (1)nmbd:埠號137/UDP(Netbios Name Service),138/UDP(Netbios Datagram Service) (2)smbd:埠號139/TCP(Netbios Session service),445/TCP(Microsoft Naked CIFS) 首先確定伺服器上的埠已經開啟: sudo service smbd stop sudo netstat -ln > netstat-ln-smbd.before sudo service smbd start sudo netstat -ln > netstat-ln-smbd.after
diff netstat-ln-smbd.before netstat-ln-smbd.after 可以看到smbd的埠確實是開放的 為了確定伺服器埠是正常的,在伺服器上執行: nc -z -w 1 公網ip地址 smbd埠號 發現是正常的,但是在本地Ubuntu上執行: nc -z -w 1 公網ip地址 smbd埠號
卻發現超時了,用wireshark抓包看到
看到tcp一直在連結請求,但是伺服器卻沒有迴應!可見smbd的兩個埠都是不通的。試試nmbd的埠 nc -v -zu -w 2 公網ip 137
Connection to 112.126.80.71 137 port [udp/netbios-ns] succeeded!
nc -v -zu -w 2 公網ip 138
Connection to 112.126.80.71 138 port [udp/netbios-ns] succeeded! 可見nmbd服務是可以正常連通的。 後來又查了下,發現有人說可能是samba對網絡卡的繫結可能有問題,這裡說一下,我申請的阿里雲伺服器有兩塊網絡卡eth0,eth1 其中eth0是雲伺服器的內網網絡卡,對應內網ip,而eth1是雲伺服器的外網網絡卡,對應外網ip,但是不知samba預設是所有網絡卡都監聽還是隻監聽某些網絡卡,為了確保我修改了smb.conf檔案,在interfaces的配置裡添加了: interfaces = eth0 eth1 重啟了smbd服務在本地Ubuntu上仍然掛載不上!看來是路由出了問題!

(3)問題定位

確定了是路由問題,就要定位是哪一個環節出了問題,首先整個網路的框架應該是這樣的:
可見雙方要想通訊,資料包至少要通過兩層防火牆,還有 Internet與阿里雲端的管控中心,其中有一個環節被限制都會導致通訊失敗。一般Internet是不會出問題的,問題應該出在防火牆與阿里雲端上。

1.配置iptables

Ubuntu下的防火牆就是iptables了,在伺服器端: sudo iptables -A INPUT -p tcp -m multiport --dports 139,445 -j ACCEPT sudo iptables -A INPUT -p udp -m multiport --dports 137,138 -j ACCEPT sudo iptables -A OUTPUT -p tcp -m multiport --sports 139,445 -j ACCEPT sudo iptables -A OUTPUT -p udp -m multiport --sports 137,138 -j ACCEPT 而在客戶端:(源埠與目的埠交換) sudo iptables -A INPUT -p tcp -m multiport --sports 139,445 -j ACCEPT sudo iptables -A INPUT -p udp -m multiport --sports 137,138 -j ACCEPT sudo iptables -A OUTPUT -p tcp -m multiport --dports 139,445 -j ACCEPT sudo iptables -A OUTPUT -p udp -m multiport --dports 137,138 -j ACCEPT

這樣雙方的防火牆就都已經開放了埠,但是在本地掛載仍是掛載不上,還是TCP連結不上。

2.配置雲伺服器

在雲伺服器管理頁面設定安全規則:

再次嘗試在本地掛載,仍然如故。。。。。。看來應該是阿里雲端做了埠限制。

後來打了客戶電話諮詢,他們說阿里雲不會做限制,那就奇怪了,到底是哪裡出了問題?突然想到要是能追蹤tcp資料包就好了,traceroute可以追蹤ip包的路徑,但是卻不能追蹤tcp包,這裡明顯是埠被限制了,因此traceroute是一直通的,並不能查詢問題,於是上網搜了一下可以追蹤tcp包(埠)的工具,還真有,就是tcptraceroute,於是就用它試了一下結果發現追蹤

tcptraceroute 公網ip地址 22 -n -q 1

22埠是ssh,肯定能通的,事實結果也是如此,但是試了smbd的埠445

tcptraceroute 公網ip地址 445 -n -q 1

結果從第一跳到第三十跳都不通,這樣問題就確定了,這應該是我的上層路由器把埠封了,因此資料包第一跳就沒通過!想想也應該是,我們是在學校的實驗室內部,可能為了保密就把埠限制了!(後來讓其他朋友試著掛載,結果他們卻能連上,這也更加確定這一點了)

(4)解決辦法

1.Ubuntu

既然封了埠,那就只能更換埠了。開啟smb.conf,在[global]section中新增: smb ports = 1315 1314 注意點1.確定指定的兩個埠未被使用,2.前面的埠號要大於後面的埠號,我之前試的把小的寫前面發現沒有生效,用的還是預設的埠。 用前面的方法確認開啟的是否是指定的埠。 sudo mount -t cifs //公網ip地址/warren 本地目錄 -o username=warren,passwd=密碼,port=1315
終於掛載上了。

2.win7

網上搜索了一下,還沒找到win7直接訪問非標準samba共享的辦法,但是有一個思路就是在本地做埠轉發,像我這種情況只能在本地將445埠直接轉發至1315,具體好像netsh命令可以,但是沒有仔細研究,現在做論文忙死了,等以後有時間了好好研究一下。

(5)遺留問題

1.在smb.conf中指定了smbd的兩個埠1315 1314,在命令列中只是指定了1315埠,那1314埠號客戶端是如何知道的? 雖然折騰了這多久,結果還是自己這邊的問題,但或多或少還是學到了點東西,不虛此行。