⚙️ 정보보안기사 | systemd의 .service와 .socket — xinetd 구성 (4/4)
.service 상주형 vs .socket 온디맨드형 · xinetd → systemd 1:1 대응 관계 · 접근 제어의 firewalld 분리 · 변환 예제까지 시리즈 최종편
#systemd
#.service
#.socket
#socket_activation
#xinetd대체
#정보보안기사
📋 목차
- 1. 서비스 기동 방식의 3가지 모델
- 2. .service 파일 구조와 핵심 명령어
- 3. .socket 파일 구조 — xinetd의 현대판
- 4. xinetd → systemd 1:1 대응 관계표
- 5. 변환 예제 — xinetd 설정을 systemd로
- 6. systemd의 추가 보안 기능
- 7. 시험 출제 맥락 5가지
- 8. 시리즈 총정리
1. 서비스 기동 방식의 3가지 모델
모델 A · 레거시
xinetd 방식
평소에 데몬 꺼짐 → xinetd가 포트를 대신 듣다가 → 요청 시 fork로 데몬 실행
모델 B · 상주형
.service 방식
부팅 시 데몬이 올라와서 항상 실행중. 요청 즉시 응답. SSH, 웹서버 등에 적합.
모델 C · 온디맨드 (xinetd 대체)
.socket 방식
systemd가 소켓만 열어둠 → 요청 시 .service 시작. xinetd와 동작 원리 동일.
🔄 .socket 방식 동작 흐름
Client
→ :873 →
rsync.socket (대기중)
→ start →
rsync.service (이때 시작)
2. .service 파일 구조와 핵심 명령어
파일 위치 (우선순위 순서)
📁 유닛 파일 우선순위
/etc/systemd/system/
← 관리자 생성 (최우선)/usr/lib/systemd/system/ ← 패키지 기본값
/lib/systemd/system/ ← Debian 계열
구조 예시: sshd.service
[Unit]
Description=OpenSSH server daemon
After=network.target
[Service]
Type=notify
ExecStart=/usr/sbin/sshd -D
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
RestartSec=42s
[Install]
WantedBy=multi-user.target
| 섹션 | 항목 | 의미 |
|---|---|---|
| [Unit] | Description | 서비스 설명 |
| After | 이 서비스보다 먼저 시작되어야 할 유닛 | |
| [Service] | ExecStart | 서비스 시작 명령 (절대경로 필수) |
| Restart | 재시작 정책 (on-failure, always 등) | |
| Type | 서비스 타입 (simple, forking, notify) | |
| [Install] | WantedBy | systemctl enable 시 연결할 타겟 |
핵심 관리 명령어
| 명령어 | 의미 |
|---|---|
| systemctl start sshd | 서비스 시작 |
| systemctl stop sshd | 서비스 중지 |
| systemctl restart sshd | 재시작 |
| systemctl reload sshd | 설정만 리로드 (중단 없음) |
| systemctl enable sshd | 부팅 시 자동 시작 등록 |
| systemctl disable sshd | 자동 시작 해제 |
| systemctl status sshd | 상태 확인 |
| systemctl is-enabled sshd | 자동 시작 등록 여부 확인 |
3. .socket 파일 구조 — xinetd의 현대판
예시: rsync.socket
[Unit]
Description=Rsync Server Socket
[Socket]
ListenStream=873
Accept=false
[Install]
WantedBy=sockets.target
| .socket 항목 | 의미 | xinetd 대응 |
|---|---|---|
| ListenStream | TCP 포트 번호 | xinetd의 포트 지정 |
| ListenDatagram | UDP 포트 번호 | socket_type=dgram |
| Accept=true | 접속마다 새 인스턴스 | wait=no와 유사 |
| Accept=false | 하나의 서비스가 전체 처리 | wait=yes와 유사 |
💡 핵심 규칙: 파일명 매칭
.socket과 .service는 파일 이름이 같아야 자동 연결됩니다.
rsync.socket → 요청 시 → rsync.service 자동 시작
파일명이 다를 경우 .socket 안에서 Service=다른이름.service로 명시 지정도 가능.
4. xinetd → systemd 1:1 대응 관계표
| xinetd 구성요소 | systemd 대응 |
|---|---|
| xinetd 데몬 자체 | systemd 소켓 활성화 (.socket) |
| /etc/xinetd.d/rsync | rsync.socket + rsync.service |
| server = /usr/bin/rsync | ExecStart=/usr/bin/rsync --daemon |
| socket_type = stream | ListenStream=포트 |
| socket_type = dgram | ListenDatagram=포트 |
| disable = yes/no | systemctl enable/disable .socket |
| cps / per_source | MaxConnections / MaxConnectionsPerSource |
⚠️ 가장 중요한 차이점
xinetd의 IP 접근 제어(only_from, no_access)가 systemd .socket에는 없습니다.
→ firewalld 또는 iptables/nftables로 분리해서 처리해야 합니다.
5. 변환 예제 — xinetd 설정을 systemd로
xinetd 원본: /etc/xinetd.d/rsync
service rsync
{
disable = no
socket_type = stream
wait = no
user = root
server = /usr/bin/rsync
server_args = --daemon
only_from = 192.168.1.0/24
per_source = 5
}
systemd 변환 결과
소켓 유닛
rsync.socket
[Unit]
Description=Rsync Server Socket
[Socket]
ListenStream=873
Accept=false
MaxConnectionsPerSource=5
[Install]
WantedBy=sockets.target
서비스 유닛
rsync.service
[Unit]
Description=Rsync Server
[Service]
ExecStart=/usr/bin/rsync --daemon
User=root
Type=forking
접근 제어: firewalld로 분리
# only_from = 192.168.1.0/24 에 해당하는 방화벽 정책
firewall-cmd --add-rich-rule='rule family="ipv4" \
source address="192.168.1.0/24" \
port port="873" protocol="tcp" accept' --permanent
firewall-cmd --reload
# 또는 iptables로:
iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 873 -j ACCEPT
iptables -A INPUT -p tcp --dport 873 -j DROP
6. systemd의 추가 보안 기능
💡 xinetd에 없던 프로세스 격리
시험 직접 출제 가능성은 낮지만, 실무와 면접 대비로 알아두면 좋습니다.
| 설정 항목 | 의미 |
|---|---|
| ProtectSystem=strict | 파일시스템을 읽기 전용으로 마운트 |
| ProtectHome=yes | /home, /root 접근 차단 |
| PrivateTmp=yes | 서비스 전용 /tmp (다른 서비스와 격리) |
| NoNewPrivileges=yes | 실행 중 권한 상승 차단 |
7. 시험에서 systemd가 나오는 맥락 5가지
Q1 “xinetd를 대체하는 systemd 기능은?”
→ 소켓 활성화(socket activation) 또는 .socket 유닛
Q2 “서비스를 부팅 시 자동 시작하려면?”
→ systemctl enable 서비스명
Q3 “서비스 상태를 확인하는 명령은?”
→ systemctl status 서비스명
Q4 “systemd 유닛 파일 경로는?”
→ /etc/systemd/system/ 또는 /usr/lib/systemd/system/
Q5 “xinetd의 only_from에 해당하는 systemd 설정은?”
→ systemd .socket에는 해당 기능 없음.
firewalld 또는 iptables/nftables로 대체.
8. 시리즈 총정리
| 비교 항목 | xinetd | systemd .socket |
|---|---|---|
| 동작 원리 | 포트 대기 → 요청 시 데몬 기동 | 소켓 대기 → 요청 시 서비스 기동 |
| 설정 파일 | /etc/xinetd.d/서비스명 | 서비스명.socket + .service |
| IP 접근 제어 | only_from / no_access 자체 내장 | 없음 → firewalld로 분리 |
| DoS 방어 | cps / per_source / instances | MaxConnections / MaxConnectionsPerSource |
| 프로세스 격리 | 없음 | ProtectSystem, PrivateTmp 등 |
| 로깅 | 자체 로그 설정 | journalctl 통합 로그 |
| 현재 상태 | 레거시 (기본 미설치 추세) | 현대 배포판 표준 |
| 편 | 주제 | 핵심 한 줄 |
|---|---|---|
| 1편 | 전체 지도 | 6단계 구조 — “왜 파일이 많은가” |
| 2편 | xinetd + TCP Wrapper | 슈퍼서버 항목 + allow→deny→기본허용 |
| 3편 | 데몬별 보안 설정 | 설정값 → 위험 → 조치 즉답 훈련 |
| 4편 | systemd .service/.socket | xinetd → .socket 전환 + 접근 제어 분리 |
🎯 4편 암기 포인트
.service= 상주형 /.socket= 온디맨드형 (xinetd 대체)- .socket + .service는 파일명이 같아야 자동 연결
- xinetd의 only_from/no_access → systemd에 없음 → firewalld/iptables로 분리
- 유닛 파일 위치: /etc/systemd/system/ (관리자) · /usr/lib/systemd/system/ (패키지)
- 핵심 명령: systemctl enable/start/status/is-enabled
- systemd 추가 보안: ProtectSystem, PrivateTmp, NoNewPrivileges
- 발전 흐름: inetd → xinetd → systemd socket activation

