公司在本部搭建了一臺編譯服務器,但外地其它分部研發同事通過VPN可以遠程登錄,但無法使用samba進行文件共享,由于smb服務器使用的139端口默認情況下是被電信運營商封掉的,禁止使用,所以必須想辦法繞過這個端口,改變smb服務器端口來實現。
按照如下路徑轉發數據:SMB客戶端—連接—>端口轉發—連接—>SMB服務端
1) 在win10 PC端訪問samba服務器(轉換端口),windows10系統開啟smb服務(自行百度,不再贅述,務必重啟電腦)
2) Linux smb服務器端需要安裝和配置samba服務,自定義端口smb_user_port、smb服務器IPsmb_ip_adreess、訪問用戶名user_name、密碼user_password等;
1)查看IP地址信息:
公網ip(如:135.153.222.222), 百度ip地址可以查到
內網ip(如: 192.168.0.2), 終端輸入ifconfig可查
2) 修改samba默認端口 :
##$ sudo vim /etc/samba/smb.conf
在[global]下增加 : smb ports=4455 ,將默認的445端口更換為4455
3) 重啟samba服務 :
$ sudo /etc/init.d/samba reload
$ sudo /etc/init.d/samba restart
4)服務器端系統執行的指令(打開路由轉發功能)
將/etc/sysctl.conf 中的net.ipv4.ip_forward的值改為1,如果被注釋了,將前面的#注釋去掉,保存
systcl -p 使數據包轉發規則生效
5)執行路由轉發命令(以下為例,請按實際情況修改):
----- sudo iptables -P FORWARD DROP ###將FORWARD鏈的策略設置為DROP
-----sudo iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT ###這條規則規定允許任何地址到任何地址的確認包和關聯包通過。一定要加這一條,否則你只允許lan IP訪問沒有用
-----sudo iptables -t nat -A PREROUTING -d 192.168.5.200 -p tcp --dport 4455 -j DNAT --to 192.168.5.200:445 #####這條指令的作用是將發送到服務器4455端口的數據包轉發到445端口
-----sudo iptables -A FORWARD -d 192.168.5.200 -p tcp --dport 4455 -j ACCEPT ####允許192.168.5.200: 4455 的數據包通過
-----sudo iptables -t nat -A POSTROUTING -d 192.168.5.200 -p tcp --dport 445 -j SNAT --to 192.168.5.200:4455 #### 在包出去之前又將包從445轉發到4455,從445是出不去的
服務器端的配置到這就可以了,僅僅是這樣客戶端還是無法訪問到服務器的,因為客戶端默認訪問的還是445端口, 所以需要將客戶端發送的445端口的數據包的目標端口轉到4455端口
1)在linux客戶端系統上掛載和訪問samba服務:
---iptables -P FORWARD DROP
---iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
---iptables -t nat -A OUTPUT -d 135.153.222.222 -p tcp --dport 445 -j DNAT --to 135.153.222.222:4455
將客戶端發送到 服務器端的目標地址從服務器的445端口改為4455端口,完畢。
思路大概就是講客戶端的消息發送到服務器端的4455端口,服務器端將4455端口收到的數據包轉到445端口,445端口發出來的數據包轉到4455端口發送到客戶端 。
2). 在本地虛擬機中安裝samba-client工具:
a. sudo apt-get install cifs-utils 然后創建一個目錄mkdir /mnt/www
b. 測試:smbclient -L //192.168.1.136
c. 掛載:
sudo mount //192.168.1.136/win10_share /mnt/smb/ -o username=smbuser,password=12345678
sudo mount //192.168.1.136/win10_share /mnt/hgfs/share_dir/ -o port=4455,username=smbuser,password=12345678
d. 解決中文亂碼問題:
codepage=cp936,iocharset=utf8
e. 轉換端口: sudo mount //192.168.1.136/win10_share /mnt/smb/ -o port=4455,username=smbuser,password=12345678
1) 打開samba訪問程序:
“控制面板”--->”程序”--->”啟用或關閉windows功能”
2)打開window下的samba功能組件:
3) 端口轉換(運行如下內容):
使用管理員權限打開cmd控制臺,運行如下內容:
a. 在公司隔離區訪問內網地址:
netsh interface portproxy add v4tov4 listenaddress=127.0.0.1 listenport=445 connectaddress=171.16.100.10 connectport=4455
b. 通過VPN訪問外網地址:
netsh interface portproxy add v4tov4 listenaddress=127.0.0.1 listenport=445 connectaddress=10.42.0.10 connectport=4455
c. 再通過命令查看:
netsh interface portproxy show all
d. 刪除端口映射服務:
netsh interface portproxy delete v4tov4 listenport=445 listenaddress=10.42.0.10
e.查看端口:
使用netstat -ano | findstr 445,查看端口,ID為4;
打開服務管理器,找到server,關閉它,然后重啟電腦;
f. 開機后再次使用netstat命令查看,不是4就說明沒問題了;
4) .測試:
客戶端轉發規則配置完成,win+R打開運行,輸入\127.0.0.1\即可看到遠程smb服務器內的所有文件夾
以上方法即可實現window系統和ubuntu服務器間的文件共享功能了。
用習慣了SI,vs code ,轉到linux 命令行那是一百個不適應。咋辦,用samba 把ubuntu的目錄共享給windows 10,可讀可寫,映射成一個文件夾。然后用SI,或者vs code打開就可以了。
安裝samba
apt install samba samba-common
修改/創建共享目錄,并且修改權限, 這里用我的esp32s3,SDK路徑esp-idf為例子
chmod 777 esp-idf/
目錄好了,就到samba的配置,修改配置文件
samb.conf,內容如下
配置文件好了之后,需要添加用戶名
sudo useradd test
sudo smbpasswd –a test #提示test用戶輸入密碼,記住
添加組件SMB 1.0 / CIFS File Sharing Support
訪問ubuntu的ip地址。正常情況下如果看到share目錄,提示輸入用戶名和密碼就正常了。可能會遇到下面的情況
修改安全策略,打開insecure guest logons.
最終在我的電腦里面就多個一個Network locations
下面就可以用SourceInsight,或者vs code打開這里編譯,然后在命令行編譯了。