메일은 한 번에 가지 않는다 — 인터넷 서비스의 역할 분담

메일을 보냈다. 바로 도착할까? 아니다. 메일은 송신자 → 송신 서버(MTA) → 수신 서버(MTA) → 메일함(MDA) → 수신자(MUA) 의 다단계 흐름을 거친다. 어디쯤 걸려 지연되는지 알려면 이 흐름을 알아야 한다. 단일 "메일 서버"라는 말이 감추는 것이 바로 이 분업이다.

서버의 주된 용도가 바로 이 서비스들이다 — 웹, 이름 해석(DNS), 메일, 파일 공유, 데이터베이스. 각각 고유한 프로토콜·포트·패키지·설정 파일을 갖는다. 이 글은 그 매핑과, 서비스가 "설치했는데 외부 접속이 안 될 때"의 3단계 진단을 다룬다.

서비스는 역할별 부서다 — 포트가 내선 번호다

서버는 하나의 회사, 각 서비스는 부서이자 안내 데스크다. 각 부서에 고유 내선(포트)이 있다.

flowchart TB
    CLIENT[클라이언트] --> WEB[웹: 80/443<br/>httpd / nginx]
    CLIENT --> DNS[DNS: 53<br/>BIND named]
    CLIENT --> MAIL[메일: 25/465/993<br/>Postfix + Dovecot]
    CLIENT --> FILE[파일공유: 445/2049/21<br/>Samba / NFS / vsftpd]
    CLIENT --> DB[DB: 3306/5432<br/>MariaDB / PostgreSQL]
서비스 프로토콜 포트 Rocky 10 패키지
HTTP/HTTPS 80 / 443 httpd, nginx 1.26
DNS DNS(UDP/TCP) 53 bind(named)
메일 송신 SMTP 25, 465(SMTPS), 587 postfix(기본 MTA)
메일 수신 IMAP/POP3 143/993, 110/995 dovecot
파일(윈도 공유) SMB/CIFS 445, 139 samba
파일(유닉스 공유) NFS 2049 nfs-utils
파일(FTP) FTP 21(제어), 20(데이터) vsftpd
DB MySQL 프로토콜 3306 MariaDB 10.11 / MySQL 8.4
DB PostgreSQL 5432 PostgreSQL 16.8

부서 비유는 "역할별 부서 + 고유 내선(포트)"만 잡는다. 서비스는 동시 다수 연결을 처리하고(멀티스레드/이벤트), 메일은 여러 서버를 거친다는 점에서 비유를 넘어선다.

웹 서버 — httpd(Apache) / nginx

HTTP 요청을 받아 정적/동적 콘텐츠를 제공한다.

  • httpd(Apache): 전통 모듈 구조(prefork/worker/event MPM). .htaccess, 가상호스트.
  • nginx: 이벤트 기반, 고동시성에 강, 리버스 프록시/로드밸런서로도 사용.
sudo dnf install -y httpd       # 또는 nginx
sudo systemctl enable --now httpd
sudo firewall-cmd --permanent --add-service={http,https}
sudo firewall-cmd --reload
패키지 주 설정 가상호스트 문서루트
httpd /etc/httpd/conf/httpd.conf, /etc/httpd/conf.d/*.conf /etc/httpd/conf.d/vhost.conf /var/www/html
nginx /etc/nginx/nginx.conf, /etc/nginx/conf.d/*.conf /etc/nginx/conf.d/vhost.conf /usr/share/nginx/html

비표준 포트/디렉토리를 쓰면 SELinux가 차단한다 — semanage로 컨텍스트/포트 허용 추가(10장).

DNS — BIND(named)

도메인 이름 ↔ IP 변환. 영역(zone) 단위로 관리한다.

  • 데몬: named. 포트 53(UDP/TCP).
  • 마스터(Primary)/슬레이브(Secondary) 영역 복제.

DNS 레코드 종류:

레코드 의미
A 도메인 → IPv4
AAAA 도메인 → IPv6
MX 메일 교환 서버
CNAME 별칭(다른 이름으로 리디렉션)
NS 네임서버
TXT 임의 텍스트(SPF, DKIM 등)
SOA 영역 시작·관리 정보
sudo dnf install -y bind bind-utils
sudo systemctl enable --now named
  • /etc/named.conf — 주 설정(옵션, zone 선언, ACL).
  • /var/named/ — zone 파일(example.com.zone).

메일 — 왜 한 번에 안 가는가 (다단계 흐름)

도입부의 질문으로 돌아가자. 메일은 한 번에 가지 않는다.

flowchart LR
    S[송신자 MUA] -->|SMTP| MTA1[MTA - Postfix<br/>송신 서버]
    MTA1 -->|SMTP| MTA2[MTA - 수신 서버]
    MTA2 -->|LDA| MDA[MDA - Dovecot<br/>메일함 저장]
    R[수신자 MUA] -->|IMAP/POP3| MDA
  • MTA(Mail Transfer Agent): 서버 간 메일 송수신. SMTP. Rocky 10 기본 = postfix(sendmail은 사실상 사장).
  • MDA(Mail Delivery Agent): 메일함에 저장. Dovecot이 겸함.
  • MUA(Mail User Agent): 사용자 클라이언트(Thunderbird). IMAP/POP3로 Dovecot에 접속.

이 분업 덕에 송신 서버와 수신 서버가 다를 수 있고, 수신자는 나중에 메일함에서 읽을 수 있다. "메일이 지연된다"면 이 흐름의 어느 단계(MTA↔MTA 전송? MDA 저장? MUA 조회?)인지를 봐야 한다.

SMTP 포트의 분담도 이 분업을 반영한다: 25번은 서버 간(MTA↔MTA), 587/465는 사용자 제출(MUA→MTA, 인증). 25번을 사용자 송신용으로 쓰지 않는다.

sudo dnf install -y postfix dovecot
sudo systemctl enable --now postfix
  • /etc/postfix/main.cf — Postfix 주 설정(myhostname, mydomain, myorigin, inet_interfaces).
  • /etc/dovecot/dovecot.conf — Dovecot 주 설정.

파일 공유 — Samba / NFS / vsftpd

서비스 용도 클라이언트
Samba(SMB/CIFS) 윈도우와 공유 Windows 탐색기, smbclient
NFS 유닉스/리눅스 간 공유 mount -t nfs
vsftpd(FTP) 범용 파일 전송(레거시) ftp 클라이언트
  • Samba: /etc/samba/smb.conf.
  • NFS: /etc/exports(내보낼 디렉토리). exportfs -rav로 적용.
  • vsftpd: /etc/vsftpd/vsftpd.conf.

NFSv3와 NFSv4는 다르다. NFSv4는 단일 포트(2049)로 방화벽이 쉽지만, v3는 동적 다수 포트를 쓴다. Rocky 10은 v4가 기본. FTP는 평문 비밀번호 문제로 레거시 — 신규는 SFTP/SCP를 권장한다.

NFS 마운트(클라이언트):

sudo mount -t nfs server:/shared /mnt

데이터베이스 — MariaDB / PostgreSQL

구조화 데이터 저장·질의. LAMP/LEMP 스택의 핵심이다.

  • MariaDB: MySQL 포크. Rocky 10 기본 DB(10.11). MySQL 8.4도 선택 가능.
  • PostgreSQL: 객체-관계형 DB. Rocky 10 = 16.8.

MariaDB에 mysql 명령으로 접속하는 건 이상해 보이지만 자연스럽다 — MariaDB가 MySQL의 포크라 클라이언트 호환성을 유지하기 때문. 명령은 mysql이지만 실제는 MariaDB다.

# MariaDB
sudo dnf install -y mariadb-server
sudo systemctl enable --now mariadb
sudo mysql_secure_installation      # 초기 보안 설정

# PostgreSQL
sudo dnf install -y postgresql-server
sudo postgresql-setup --initdb
sudo systemctl enable --now postgresql

Rocky 10에서 직접 확인하기

미검증(출처 인용). Rocky 10 VM에서 실행 권장. 서비스 시작 전 항상 SELinux/firewalld를 고려하라.

# 패키지 버전 확인
dnf info nginx | grep Version          # 1.26.x
dnf info mariadb-server | grep Version # 10.11
dnf info postgresql-server | grep Version  # 16.8
# 서비스 운영 공통
sudo dnf install -y <pkg>
sudo systemctl enable --now <svc>   # 부팅 자동 + 즉시 시작
sudo systemctl status <svc>
sudo systemctl reload <svc>         # 끊김 없이 재적용(httpd/nginx/postfix)
sudo journalctl -u <svc> -f         # 실시간 로그
# 웹 서버 기동 확인
curl -I http://localhost            # HTTP/1.1 200
ss -tlnp | grep -E ':80|:443'       # 리스닝 확인
# 방화벽에 서비스 개방
sudo firewall-cmd --permanent --add-service={http,https,dns,smtp,imap}
sudo firewall-cmd --reload
firewall-cmd --list-services

흔히 묻는 것, 흔히 틀리는 것

오해 정정
"MariaDB와 MySQL은 다른 DB" MariaDB가 MySQL 포크. mysql 명령으로 접속하지만 실제는 MariaDB
"메일 25번이 사용자용" 25는 서버 간(MTA↔MTA). 587/465가 사용자 제출(MUA→MTA, 인증)
"FTP가 파일 공유 표준" 레거시. 평문 비번 문제. 신규는 SFTP/SCP 권장
"NFSv3와 NFSv4는 같다" NFSv4는 단일 포트(2049)로 방화벽 쉬움. v3는 동적 다수 포트. Rocky 10은 v4 기본
"서비스 설정 파일 위치는 다 비슷" 아니다. 각기 다름(표 참조). 반드시 매핑 숙지
"서비스 안 되면 패키지만 재설치" 9할은 SELinux/firewalld. 설정 파일·포트·컨텍스트 확인 먼저
"포트만 열면 외부 접속된다" 서비스가 0.0.0.0에 바인딩돼야(127.0.0.1이면 로컬만)
"DB 데이터는 어디든 둬도 된다" SELinux가 기본 경로(/var/lib/mysql, /var/lib/pgsql) 외엔 차단. semanage fcontext로 허용

더 깊이

  • 가상화·컨테이너: KVM/libvirt(네이티브 하이퍼바이저, VM 실행), Podman 5(Docker 호환, daemonless/rootless, systemd quadlet 통합).
  • 인증 서비스: LDAP(중앙 계정 디렉토리), Kerberos(티켓 기반 강력 인증), SSSD(로컬과 IdM/AD/LDAP 연결).
  • NTP/chrony: 시간 동기화. Rocky 10 기본 = chrony. 인증서(Kerberos), 로그 정렬, 분산 시스템에 필수. chronyc sources로 상태 확인.

요약 — 이 글의 결론

  • 서비스별 포트: 80/443(웹), 53(DNS), 25/465/587(SMTP), 143/993(IMAP), 445(SMB), 2049(NFS), 21(FTP), 3306(MariaDB), 5432(PostgreSQL).
  • : httpd(/etc/httpd/), nginx(/etc/nginx/). Rocky 10 nginx 1.26.
  • DNS: bind(named), /etc/named.conf. 레코드: A/AAAA/MX/CNAME/NS/TXT/SOA.
  • 메일: postfix(MTA) + dovecot(MDA/IMAP). /etc/postfix/main.cf. 한 번에 안 간다 — MUA→MTA→MTA→MDA→MUA 다단계. 25=서버 간, 587/465=사용자 제출.
  • 파일: Samba(SMB/윈도), NFS(유닉스, v4 기본), vsftpd(FTP/레거시).
  • DB: MariaDB 10.11(Rocky 10 기본, MySQL 포크), PostgreSQL 16.8.
  • 서비스 안 될 때 3단계: (1) 서비스 상태 (2) firewalld 포트 (3) SELinux 컨텍스트.

생각해 볼 문제

  1. 웹/DNS/메일(SMTP)/파일(SMB)/DB(PostgreSQL)의 기본 포트를 말하라.
  2. httpd와 nginx의 핵심 설정 파일 경로와 기본 문서루트를 비교하라.
  3. DNS 레코드 A, MX, CNAME, NS의 의미를 말하라.
  4. MTA, MDA, MUA의 역할과 메일 흐름을 설명하라. 메일이 "한 번에 안 가는" 이유는?
  5. SMTP 25와 587/465의 용도 차이는?
  6. Samba와 NFS의 주요 차이. 각각 어떤 환경에 어울리는가?
  7. MariaDB와 MySQL의 관계는? 왜 mysql 명령으로 접속하는가?
  8. 서비스가 설치됐는데 외부 접속이 안 될 때 확인 3단계는?

참고

'Tech Artifacts > Linux' 카테고리의 다른 글

Linux - 10. security  (0) 2026.07.09
Linux - 09. network  (0) 2026.07.09
Linux - 08. package  (0) 2026.07.09
Linux - 07. shell script  (0) 2026.07.09
Linux - 06. io device  (0) 2026.07.09