TCP Wrapper로 호스트 기반 네트워크 접근 제어하기

TCP Wrapper의 hosts.allow·hosts.deny 규칙, libwrap 연동 방식과 서비스별 네트워크 접근 제어 설정을 정리한다.

2026-08-14 · 최초 발행 2025-06-28

서비스 접근 앞에서 적용되는 호스트 기반 ACL

TCP Wrapper는 리눅스/유닉스 환경에서 네트워크 서비스 접근을 통제하는 호스트 기반 ACL(Access Control List) 기술이다. IP 주소, 호스트명, 네트워크 대역을 기준으로 규칙을 적용하며, 텍스트 설정 파일만으로 허용 목록과 차단 목록을 관리할 수 있다.

이 방식은 접근 시도를 기록할 수 있고 서비스별로 정책을 나눌 수 있다는 점에서 기본 보안 계층으로 쓰인다. 구성에는 접근 허용 규칙을 담는 hosts.allow, 차단 규칙을 담는 hosts.deny, TCP Wrapper 라이브러리인 libwrap, inetd/xinetdtcpd가 관여한다.

요청은 allow 규칙부터 확인한다

클라이언트 요청을 받은 뒤 TCP Wrapper는 먼저 hosts.allow의 일치 여부를 본다. 이 파일에 맞는 규칙이 없을 때만 hosts.deny를 확인하며, 두 파일 어디에도 일치하지 않으면 접근을 허용한다.

매칭 규칙 존재매칭 규칙 없음매칭 규칙 존재매칭 규칙 없음클라이언트 접속 요청inetd/xinetd 서비스 수신libwrap 검사hosts.allow 확인접근 허용hosts.deny 확인접근 거부서비스 제공접속 차단

따라서 우선순위는 hosts.allow > hosts.deny다. 허용 규칙이 있으면 차단 파일의 규칙은 이어서 평가하지 않는다.

규칙에는 서비스와 클라이언트를 함께 적는다

설정 파일의 기본 형식은 다음과 같다.

서비스명 : 클라이언트_목록 [: 옵션]

서비스명에는 sshd, ftpd처럼 제어 대상 서비스를 적고, 클라이언트 목록에는 IP 주소·호스트명·네트워크 대역을 지정한다. 필요하면 로깅이나 명령 실행 같은 옵션을 뒤에 붙일 수 있다.

ALL은 모든 서비스 또는 호스트, LOCAL은 로컬 도메인 호스트, PARANOID는 호스트명과 IP 주소가 일치하지 않는 경우를 지정한다. !는 부정 조건이며, EXCEPT는 목록에서 특정 대상을 제외할 때 사용한다.

허용 규칙과 차단 규칙을 분리해 관리하는 예

hosts.allow에는 예외적으로 열어 둘 서비스와 대상을 적을 수 있다.

# SSH 서비스는 특정 IP 대역에서만 허용
sshd: 192.168.1. 10.0.0.
# FTP는 특정 호스트에서만 허용
ftpd: host1.example.com host2.example.com
# 모든 서비스는 로컬호스트에서 허용
ALL: 127.0.0.1 localhost
# 특정 네트워크 대역에서 모든 서비스 허용, 단 하나의 호스트 제외
ALL: 192.168.0. EXCEPT 192.168.0.100

hosts.deny는 전체 차단 정책이나 특정 출발지 차단 규칙을 담는다.

# 기본적으로 모든 서비스 거부 (기본 보안 정책)
ALL: ALL
# 특정 IP에서 SSH 접근 차단
sshd: 10.0.0.5
# 특정 도메인의 모든 호스트 차단
ALL: .malicious-domain.com

접근 시도에 대응하는 옵션

규칙은 허용·차단만 수행하는 데 그치지 않고 로그 기록이나 외부 명령 실행과 연결할 수 있다.

# 접근 시도 로깅
sshd: 192.168.1. : spawn /bin/echo "SSH access attempt from %h at %d" >> /var/log/access.log

# 이메일 알림
ftpd: .suspicious-domain.com : spawn /bin/mail -s "Suspicious FTP access" admin@example.com

특정 출발지에 대응하는 스크립트를 호출하거나, 차단과 후속 조치를 한 규칙에 연결하는 구성도 가능하다.

# 특정 IP에서 접근 시 스크립트 실행
telnetd: 10.0.0.5 : spawn /usr/local/bin/security-alert.sh %h

# 접근 차단 후 추가 조치
ALL: .known-bad.com : spawn /usr/local/bin/block-ip.sh %a : deny

서비스 성격에 따라 접근 범위를 나누는 구성

내부 서버의 SSH 접속을 특정 관리 네트워크와 로컬호스트로 제한하고, 나머지 요청을 차단하는 구성은 다음과 같다.

# hosts.allow
sshd: 10.10.50. 127.0.0.1

# hosts.deny
sshd: ALL

웹 서비스는 열어 두되 데이터베이스와 관리 서비스를 내부망으로 제한하려면 서비스별 규칙을 달리 둘 수 있다.

# hosts.allow
httpd, nginx: ALL
mysqld, pgresql: 192.168.0. 127.0.0.1
sshd, ftpd: 10.0.0. 127.0.0.1

# hosts.deny
ALL: ALL

반복적인 침입 시도가 감지된 출발지 주소를 차단 목록에 넣는 방식도 사용한다.

# hosts.deny
ALL: 45.132.56.78 89.123.45.67 91.234.55.32

적용 전 확인할 제약

모든 서비스가 TCP Wrapper를 지원하는 것은 아니다. 대상 서비스가 libwrap 라이브러리와 링크되어 있는지 확인해야 하며, 최신 서비스는 지원 여부를 별도로 점검할 필요가 있다.

규칙이 많아질수록 성능에 영향을 줄 수 있고, 넓게 잡은 차단 조건은 정상 사용자까지 막을 수 있다. 장애 원인을 추적할 수 있도록 로깅도 함께 활용한다.

다음 명령으로 라이브러리 의존성, 설정, 규칙 적용을 확인할 수 있다.

# libwrap 의존성 확인
ldd /usr/sbin/sshd | grep libwrap

# 설정 테스트
tcpdchk

# 테스트 시뮬레이션
tcpdmatch sshd 192.168.1.100

다른 보안 계층과 함께 놓기

TCP Wrapper는 서비스 수준의 접근 제어를 맡으며, 방화벽·호스트 패킷 필터링·강제 접근 제어·서비스 자체 설정과 역할을 나눌 수 있다.

네트워크 보안 계층방화벽TCP WrapperSELinux/AppArmoriptables/nftables서비스 자체 접근 제어

방화벽은 네트워크 경계를, iptables/nftables는 호스트 수준 패킷 필터링을 담당한다. TCP Wrapper는 서비스 수준에서 접근을 제한하고, 서비스 자체 보안 설정은 애플리케이션 계층을 보완한다. 기존 시스템이나 소규모 환경에서는 이런 심층 방어 구성의 한 층으로 활용할 수 있다.

TCP Wrapper호스트 기반 접근 제어네트워크 보안libwrapACL