[리눅스] Samba 서버 구축

목차

Samba 서버는 리눅스·유닉스에서 SMB/CIFS 프로토콜을 구현해 윈도우와 파일·프린터를 공유하게 해 주는 오픈 소스 소프트웨어다. 윈도우 클라이언트가 별도 프로그램 없이 탐색기로 리눅스 서버의 디렉터리에 접근할 수 있어, 윈도우와 리눅스가 섞인 혼합 환경에서 가장 널리 쓰인다. 이 글에서는 CentOS·RHEL 계열에서 Samba 서버를 구축해 리눅스↔윈도우 양방향으로 폴더를 공유하는 과정을 패키지 설치 → 공유 디렉터리·계정 → smb.conf 설정 → 서비스·방화벽·SELinux → 클라이언트 접속 순서로 정리한다.

Samba란?

Samba는 SMB(Server Message Block)/CIFS 프로토콜을 구현해 윈도우 기반 시스템과 호환되는 파일·프린터 공유를 제공한다. 사용자 인증과 권한 부여로 파일 접근을 제어할 수 있고, SMB3 프로토콜을 쓰면 전송 구간 암호화도 지원한다. 대부분의 리눅스 배포판에서 기본 패키지로 제공되므로, 윈도우와 리눅스가 섞인 환경에서 시스템 간 통합을 손쉽게 해 주는 도구다.

Samba 데몬은 두 가지로 나뉜다. smb(smbd)는 실제 파일·프린터 공유를 담당하며 TCP 139·445 포트를 사용하고, nmb(nmbd)는 NetBIOS 이름 서비스를 제공해 윈도우 네트워크 탐색에 쓰인다(UDP 137). 그래서 CentOS·RHEL 계열에서는 두 서비스를 함께 켜는 것이 일반적이다.

Samba 서버 파일 공유 구조

Samba 패키지 설치

서버 역할을 할 리눅스에 Samba 서버 패키지와 클라이언트 도구를 함께 설치한다. samba는 서버 데몬, samba-clientsmbclient 같은 점검·접속 도구를 제공한다. root가 아니라면 명령 앞에 sudo를 붙인다.

dnf -y install samba samba-client

설치가 끝나면 버전을 확인한다. 아래는 출력 예시다.

# 설치 확인
rpm -qa | grep samba
smbd --version

# 출력 예시
samba-4.x.x-x.el8.x86_64
samba-client-4.x.x-x.el8.x86_64
Version 4.x.x

공유 디렉터리와 Samba 계정 설정

공유 디렉터리와 그룹 만들기

공유에 사용할 디렉터리(/share)와, 접근을 허가할 전용 그룹(sambaGroup)을 만든다. 디렉터리의 그룹 소유자를 이 그룹으로 바꾸고 권한을 770으로 주면, 그룹에 속한 사용자만 읽고 쓸 수 있다.

mkdir /share
groupadd sambaGroup
chgrp sambaGroup /share
chmod 770 /share

Samba 계정 등록

Samba는 리눅스 로그인 비밀번호와 별도로 Samba 전용 비밀번호를 관리한다. 공유에 접근할 리눅스 사용자(예: centos)를 앞서 만든 그룹에 넣고, smbpasswd -a로 Samba 비밀번호를 등록한다. 이때 사용자는 시스템에 이미 존재하는 계정이어야 한다.

usermod -aG sambaGroup centos
smbpasswd -a centos

# 출력 예시
New SMB password:
Retype new SMB password:
Added user centos.

usermod에는 -aG(append)를 쓰는 것이 안전하다. -a 없이 -G만 쓰면 기존에 속해 있던 다른 보조 그룹이 모두 사라지니 주의한다.

smb.conf 설정

Samba 설정 파일은 /etc/samba/smb.conf다. 수정 전에 원본을 백업해 두면 문제가 생겼을 때 되돌리기 쉽다.

cp /etc/samba/smb.conf /etc/samba/smb.conf.bak
vi /etc/samba/smb.conf

설정은 크게 전역 설정을 담는 [global] 섹션과, 공유 단위로 만드는 공유 섹션([Share])으로 나뉜다. 아래와 같이 작성한다.

[global]
    workgroup = WORKGROUP        # 윈도우 작업 그룹과 동일하게
    server string = Samba Server
    unix charset = UTF-8         # 한글 파일명 인코딩
    security = user              # 사용자 계정 기반 인증

[Share]
    comment = Samba Share
    path = /share                # 공유할 디렉터리
    valid users = @sambaGroup    # sambaGroup 소속 사용자만 허용
    writable = yes               # 쓰기 허용
    browseable = yes             # 네트워크 탐색 시 표시
    guest ok = no                # 게스트(익명) 접속 거부
    create mask = 0770           # 새 파일 권한
    directory mask = 0770        # 새 디렉터리 권한

주요 지시어의 의미는 다음과 같다.

지시어의미
path공유할 디렉터리의 실제 경로
valid users접근을 허용할 사용자·그룹(@그룹명은 그룹 지정)
writable쓰기 허용 여부(yes면 업로드·삭제 가능)
browseable네트워크 목록에 공유 이름을 노출할지 여부
guest ok인증 없는 게스트 접속 허용 여부(no 권장)
create maskSamba로 만든 새 파일의 권한 마스크
directory maskSamba로 만든 새 디렉터리의 권한 마스크

설정을 마쳤으면 testparm 명령으로 문법 오류가 없는지 검증한다. Loaded services file OK.가 보이면 정상이다.

testparm

# 출력 예시
Load smb config files from /etc/samba/smb.conf
Loaded services file OK.
Server role: ROLE_STANDALONE

서비스·방화벽·SELinux 설정

서비스 시작과 자동 실행

Samba 데몬(smb, nmb)을 시작하고 부팅 시 자동 실행되도록 등록한 뒤 상태를 확인한다. --now를 붙이면 enable과 start를 한 번에 처리한다.

systemctl enable --now smb nmb
systemctl status smb

# 출력 예시
● smb.service - Samba SMB Daemon
   Active: active (running)

방화벽 개방

외부에서 접속하려면 방화벽에서 Samba 서비스를 허용해야 한다. firewalld에는 samba 서비스 정의가 기본 포함되어 있어 서비스 이름만 추가하면 된다.

firewall-cmd --permanent --add-service=samba
firewall-cmd --reload

# 적용 확인
firewall-cmd --list-services

SELinux 설정

SELinux가 켜져 있으면(enforcing) 기본 정책상 Samba가 임의 디렉터리를 공유하지 못해 접근이 거부될 수 있다. 두 가지를 처리하면 SELinux를 끄지 않고도 공유가 동작한다.

먼저 공유 디렉터리에 Samba 전용 컨텍스트 타입(samba_share_t)을 부여한다. chcon은 임시 적용이고, 영구 적용하려면 semanage fcontext로 규칙을 등록한 뒤 restorecon으로 반영한다.

# 임시 적용
chcon -t samba_share_t /share

# 영구 적용(권장)
semanage fcontext -a -t samba_share_t "/share(/.*)?"
restorecon -Rv /share

이어서 Samba가 공유 디렉터리를 읽고 쓸 수 있도록 불(boolean)을 켠다. 읽기·쓰기를 모두 허용하려면 samba_export_all_rw, 읽기 전용이면 samba_export_all_ro를 사용한다. -P는 재부팅 후에도 유지되는 영구 옵션이다.

setsebool -P samba_export_all_rw on

클라이언트에서 공유 폴더 접속

윈도우에서 접속하기

윈도우 파일 탐색기를 열어 [내 PC]를 우클릭하고 [네트워크 드라이브 연결]을 선택한다. 드라이브 문자를 고른 뒤 [폴더]에 \서버IPShare 형식으로 공유 경로를 입력하고 [마침]을 클릭한다(예: \192.168.111.100Share). 자격 증명 창이 뜨면 앞서 smbpasswd로 지정한 Samba 사용자와 비밀번호를 입력한다.

윈도우 네트워크 드라이브로 Samba 공유 폴더 연결

연결에 성공하면 탐색기에 새 드라이브(예: Z:)가 추가된다. 그 드라이브에 파일을 만들어 본 뒤, 리눅스 서버에서 /share 디렉터리를 확인하면 윈도우에서 만든 파일이 그대로 들어와 있다.

# 리눅스 서버에서 확인
[root@localhost ~]# ls -l /share
-rwxrwx---. 1 centos sambaGroup 0 ... test.txt

리눅스에서 접속하기

다른 리눅스에서 접속할 때는 samba-clientsmbclient로 공유 목록을 먼저 확인한다.

# 공유 목록 확인
smbclient -L //서버IP -U centos

# 출력 예시
        Sharename       Type      Comment
        ---------       ----      -------
        Share           Disk      Samba Share

공유가 보이면 cifs 타입으로 마운트해 일반 디렉터리처럼 사용할 수 있다. cifs-utils 패키지가 필요하므로 없으면 함께 설치한다.

dnf -y install cifs-utils
mkdir /mnt/smb
mount -t cifs //서버IP/Share /mnt/smb -o username=centos

트러블슈팅과 자주 묻는 질문

접속이 안 될 때 점검 순서

  • 방화벽firewall-cmd --list-servicessamba가 있는지 확인한다.
  • SELinuxausearch -m avc -ts recent 또는 /var/log/audit/audit.log에서 거부 로그를 확인하고, samba_export_all_rw 불과 samba_share_t 컨텍스트를 점검한다.
  • 설정 문법testparm으로 smb.conf 오류 여부를 확인한다.
  • 계정·권한pdbedit -L로 Samba 계정 등록을 확인하고, 공유 디렉터리의 리눅스 권한(chmod·그룹)이 valid users와 맞는지 본다.

smbpasswd와 리눅스 비밀번호는 다른가?

그렇다. Samba는 자체 비밀번호 데이터베이스를 사용하므로, 리눅스 로그인 비밀번호를 바꿔도 Samba 비밀번호는 그대로다. Samba 비밀번호를 변경하려면 smbpasswd 사용자명을 다시 실행한다.

“권한 거부”가 뜨는데 설정은 맞다면?

대부분 SELinux 또는 리눅스 파일 권한 문제다. SELinux가 enforcing이라면 위의 samba_share_t 컨텍스트와 불 설정을 다시 확인하고, 공유 디렉터리가 valid users에 지정한 그룹 소유로 되어 있는지(chgrp·chmod 770) 점검한다.

정리

지금까지 CentOS·RHEL 계열에서 Samba 서버를 구축해 윈도우·리눅스 클라이언트와 파일을 공유하는 과정을 정리했다. 핵심 순서는 패키지 설치(samba·samba-client) → 공유 디렉터리·그룹·Samba 계정 → smb.conf의 [global]·[Share] 설정 → 서비스(smb·nmb)·방화벽·SELinux 개방 → 클라이언트 접속이다. 특히 방화벽과 SELinux가 빠지면 “설정은 맞는데 접속·쓰기가 안 되는” 증상이 자주 생기니 끝까지 확인하자. 리눅스끼리 디렉터리를 공유하려면 NFS 서버 구축 글을 함께 참고하면 좋다.

💬 댓글 0

💬 댓글을 남기려면?
첫 댓글을 남겨보세요 ✨

이 콘텐츠가 도움이 됐나요?

누스쿨 커뮤니티에서 더 많은 커리어 전략을 나눠요