Samba, NFS hay SFTP — Chọn cái nào cho mạng nội bộ?
Khi cần chia sẻ file giữa máy Linux và Windows trong cùng mạng LAN, có 3 phương án chính: Samba (SMB/CIFS), NFS, và SFTP qua SSH. Mình dùng Fedora làm máy development chính đã 2 năm, và đã thử cả ba. Mỗi cái có điểm mạnh riêng và phù hợp với kịch bản khác nhau — không có phương án nào hoàn hảo cho mọi trường hợp.
Phân tích ưu nhược của từng phương án
NFS (Network File System) là lựa chọn lý tưởng nếu bạn làm việc thuần Linux-to-Linux. Hiệu suất cao, cấu hình đơn giản. Nhược điểm: Windows không hỗ trợ NFS natively — phải cài thêm phần mềm bên Windows và trải nghiệm vẫn giật cục, nhất là trên Windows 10/11 Home.
SFTP qua SSH cực kỳ bảo mật, chỉ cần mở port 22. Phù hợp để transfer file thủ công. Cái dở là không mount thành network drive được trong Windows Explorer — mỗi lần phải mở WinSCP hay FileZilla, không tiện cho công việc hàng ngày.
Samba dùng giao thức SMB — chính là giao thức Windows dùng nội bộ để chia sẻ file. Windows Explorer nhận ra ngay, mount thành network drive không cần cài thêm gì, hỗ trợ cả chia sẻ máy in. Nhược điểm duy nhất: cấu hình trên Fedora phức tạp hơn vì SELinux và firewalld mặc định rất chặt.
Khi nào Samba là lựa chọn đúng?
- Môi trường hybrid Linux + Windows, cần chia sẻ file thường xuyên
- Muốn mount thành network drive trong Windows Explorer không cần phần mềm thứ ba
- Cần chia sẻ máy in qua mạng nội bộ
- Team dùng Windows, server chạy Fedora
Thuần Linux thì dùng NFS. Chỉ transfer file đôi khi, SFTP đủ dùng. Bài này tập trung vào Samba vì đây là trường hợp phức tạp nhất và hay gặp lỗi im lặng nhất trên Fedora.
Tại sao Fedora “khó” hơn các distro khác khi chạy Samba?
Nếu bạn đã từng cài Samba trên Ubuntu và thấy nhanh gọn, khi sang Fedora sẽ bị choáng. Hai thứ gây đau đầu nhất là SELinux và firewalld — cả hai bật mặc định và đều có thể chặn Samba mà không báo lỗi rõ ràng ra màn hình.
Lỗi kinh điển: cấu hình smb.conf đúng, service đang chạy, nhưng từ Windows vào hoặc không thấy share, hoặc thấy nhưng mở ra bị từ chối — chỉ vì SELinux context sai hoặc firewalld chưa mở đúng zone. Đây là nguyên nhân của khoảng 80% câu hỏi “Samba không hoạt động trên Fedora” trên các forum kỹ thuật.
Cài đặt Samba trên Fedora
Bước 1: Cài gói Samba
sudo dnf install samba samba-common samba-client -y
Gói samba-client không bắt buộc cho server, nhưng hữu ích để test kết nối ngay từ chính máy Fedora mà không cần nhờ đến máy Windows.
Bước 2: Enable và start service
sudo systemctl enable --now smb nmb
smb là service Samba chính xử lý SMB/CIFS. nmb là NetBIOS name service — giúp Windows tìm thấy server qua tên thay vì phải nhớ địa chỉ IP.
Cấu hình thư mục chia sẻ
Tạo folder và phân quyền
# Tạo thư mục chia sẻ
sudo mkdir -p /srv/samba/shared
# Tạo group quản lý Samba user
sudo groupadd sambashare
# Gán quyền đọc/ghi cho nhóm
sudo chmod 0775 /srv/samba/shared
sudo chgrp sambashare /srv/samba/shared
Cấu hình smb.conf
File cấu hình chính nằm ở /etc/samba/smb.conf. Backup trước khi chỉnh — thói quen tốt mà không mất gì:
sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.bak
sudo nano /etc/samba/smb.conf
Thêm section sau vào cuối file:
[global]
workgroup = WORKGROUP
server string = Fedora Samba Server
security = user
passdb backend = tdbsam
log file = /var/log/samba/log.%m
max log size = 50
[shared]
comment = Shared Folder
path = /srv/samba/shared
browseable = yes
read only = no
valid users = @sambashare
create mask = 0664
directory mask = 0775
Kiểm tra cú pháp ngay sau khi lưu:
testparm
Tạo Samba user
Samba dùng database user riêng, tách biệt với user hệ thống. Nhưng user Samba phải tồn tại trong Linux trước — không thể tạo Samba password cho tài khoản không có trong /etc/passwd.
# Thêm user hiện tại vào group sambashare
sudo usermod -aG sambashare $(whoami)
# Tạo Samba password cho user
sudo smbpasswd -a $(whoami)
Restart Samba để apply cấu hình mới:
sudo systemctl restart smb nmb
Xử lý SELinux — Phần quan trọng nhất trên Fedora
Đây là bước mà phần lớn hướng dẫn trên internet bỏ qua hoặc ghi gọn lại “tắt SELinux đi”. Mình không khuyến khích tắt — cần set đúng context và booleans. Mất 5 phút, giữ nguyên bảo mật hệ thống, và không phải mò lại sau khi server bị audit.
Set SELinux context cho thư mục chia sẻ
# Cài công cụ quản lý SELinux policy nếu chưa có
sudo dnf install policycoreutils-python-utils -y
# Gán context samba_share_t cho thư mục
sudo semanage fcontext -a -t samba_share_t "/srv/samba/shared(/.*)?"
# Apply context xuống file system
sudo restorecon -Rv /srv/samba/shared
Kiểm tra context đã được gán đúng chưa:
ls -Z /srv/samba/shared
Output nên có samba_share_t trong cột context. Còn nếu vẫn thấy default_t hoặc user_home_t, Samba sẽ bị từ chối truy cập — dù service đang chạy bình thường.
Bật SELinux booleans cần thiết
# Cho phép Samba đọc/ghi thư mục đã được label samba_share_t
sudo setsebool -P samba_export_all_rw on
# Cho phép Samba truy cập home directory (chỉ bật nếu cần)
sudo setsebool -P samba_enable_home_dirs on
Flag -P giúp boolean persist qua reboot. Quên flag này, setting sẽ reset về mặc định sau lần khởi động tiếp theo — và bạn lại mất cả buổi debug lại từ đầu.
Cấu hình firewalld
firewalld chia network interface theo zone. Samba dùng 4 port: 137/UDP, 138/UDP (NetBIOS) và 139/TCP, 445/TCP (SMB). Trước khi mở, xác định interface đang ở zone nào:
# Kiểm tra zone hiện tại
sudo firewall-cmd --get-active-zones
Mở service Samba cho zone tương ứng (thường là public hoặc internal):
# Mở Samba trên zone public
sudo firewall-cmd --permanent --add-service=samba --zone=public
# Apply ngay lập tức
sudo firewall-cmd --reload
Kiểm tra lại:
sudo firewall-cmd --list-services --zone=public
Nên thấy samba trong danh sách. LAN hoàn toàn nội bộ? Gán interface vào zone internal thay vì public — policy thoáng hơn, phù hợp với mạng công ty hơn.
Chia sẻ máy in với Windows (tùy chọn)
Có máy in muốn dùng chung cho cả team? Cài thêm CUPS và bật print server trong Samba:
sudo dnf install cups samba-common-tools -y
sudo systemctl enable --now cups
Thêm vào smb.conf:
[printers]
comment = All Printers
path = /var/spool/samba
browseable = no
guest ok = no
printable = yes
[print$]
comment = Printer Drivers
path = /var/lib/samba/printers
browseable = yes
read only = yes
guest ok = no
Tạo thư mục spool và gán SELinux context:
sudo mkdir -p /var/spool/samba
sudo chmod 1777 /var/spool/samba
sudo chcon -t samba_spool_t /var/spool/samba
Kết nối từ Windows
Từ máy Windows, mở Run (Win+R) và nhập trực tiếp:
\\192.168.1.100\shared
Thay 192.168.1.100 bằng IP thực của máy Fedora. Để mount thành network drive cố định:
- Mở File Explorer → This PC → Map Network Drive
- Chọn ký tự drive (VD: Z:)
- Nhập path:
\\192.168.1.100\shared - Tick Connect using different credentials nếu username Windows khác username Samba
- Click Finish và nhập username/password Samba đã tạo ở bước trên
Debug khi gặp lỗi kết nối
Không kết nối được? Kiểm tra theo thứ tự này — từ đơn giản đến phức tạp:
# 1. Kiểm tra service có đang chạy không
sudo systemctl status smb nmb
# 2. Test kết nối từ chính máy Fedora
smbclient -L localhost -U $(whoami)
# 3. Kiểm tra log SELinux — thường là thủ phạm chính
sudo ausearch -m avc -ts recent | grep samba
# 4. Kiểm tra firewall đã mở chưa
sudo firewall-cmd --list-all
# 5. Kiểm tra port Samba có đang lắng nghe không
ss -tlnp | grep -E '139|445'
# 6. Xem kết nối đang active (xác nhận ai đang vào được)
sudo smbstatus
Lỗi SELinux xuất hiện ở output ausearch dạng denied { write } ... samba_t .... Khi thấy, kiểm tra lại context bằng ls -Z và các boolean bằng getsebool -a | grep samba. Phần lớn trường hợp chỉ cần chạy lại restorecon là xong.

