메일은 한 번에 가지 않는다 — 인터넷 서비스의 역할 분담
메일을 보냈다. 바로 도착할까? 아니다. 메일은 송신자 → 송신 서버(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 컨텍스트.
생각해 볼 문제
- 웹/DNS/메일(SMTP)/파일(SMB)/DB(PostgreSQL)의 기본 포트를 말하라.
- httpd와 nginx의 핵심 설정 파일 경로와 기본 문서루트를 비교하라.
- DNS 레코드 A, MX, CNAME, NS의 의미를 말하라.
- MTA, MDA, MUA의 역할과 메일 흐름을 설명하라. 메일이 "한 번에 안 가는" 이유는?
- SMTP 25와 587/465의 용도 차이는?
- Samba와 NFS의 주요 차이. 각각 어떤 환경에 어울리는가?
- MariaDB와 MySQL의 관계는? 왜
mysql명령으로 접속하는가? - 서비스가 설치됐는데 외부 접속이 안 될 때 확인 3단계는?
참고
- Rocky Linux 10 Release Notes — Notable packages - 접근 2026-07-09 (nginx 1.26, MariaDB 10.11, PostgreSQL 16.8)
- RHEL 10 문서 - 접근 2026-07-09
- man page:
man httpd,man nginx,man named,man postfix,man smb.conf,man exports(5),man mysqld
'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 |
