iptables는 커널 netfilter를 테이블→체인→규칙 구조로 제어한다.
filter 테이블의 세 체인은 방향으로 외운다.
체인 방향 예 INPUT들어옴(서버로) 외부→내 80 포트 OUTPUT나감(서버에서) 내→외부 DNS FORWARD통과(라우팅) 게이트웨이 경유
옵션 의미 타깃 의미 -A체인 끝에 추가 ACCEPT허용 -I앞에 삽입 DROP응답 없이 버림 -D삭제 REJECT거부 응답 보냄 -P기본 정책 LOG로그 남기고 통과 -j타깃 지정 -p프로토콜(tcp/udp) --dport목적지 포트 -s출발지 IP --sport출발지 포트
# 규칙 조회
iptables -L -n -v --line-numbers # 줄 번호 포함 상세 조회
# 80(HTTP), 22(SSH) 들어오는 TCP 허용
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 특정 IP만 허용
iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 3306 -j ACCEPT
# 나머지 INPUT은 모두 차단(기본 정책)
iptables -P INPUT DROP
# 규칙 삭제 / 초기화
iptables -D INPUT 3 # 3번 규칙 삭제
iptables -F # 전체 규칙 플러시
# 저장(재부팅 후 유지) — 메모리에만 있으므로 필수
service iptables save # 또는 iptables-save > /etc/sysconfig/iptables
⚠️ 치명적 함정 : 원격 SSH 중에 iptables -P INPUT DROP을 먼저 하면 자기 자신이 끊긴다 . 반드시 22번 ACCEPT 규칙을 먼저 넣고 정책을 바꿔야 한다.
순서가 전부 : 규칙은 위→아래로 매칭되고 첫 매칭에서 멈춘다. "모두 DROP"이 위에 있으면 뒤(-A)의 ACCEPT는 도달 못 한다 → -I로 앞에 삽입해야 효과.
firewalld는 신뢰 수준을 zone 으로 묶어 관리한다.
런타임과 영구 설정이 분리돼 있다는 점이 핵심이다.
# 상태·기본 정보
firewall-cmd --state # 동작 여부
firewall-cmd --get-default-zone # 기본 zone
firewall-cmd --list-all # 현재 zone 전체 규칙
# 서비스/포트 허용 (영구 + 즉시 적용)
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-port=8080/tcp
firewall-cmd --reload # permanent를 현재에 반영
# 특정 IP만 허용 (rich rule)
firewall-cmd --permanent --add-rich-rule= 'rule family="ipv4" source address="192.168.1.0/24" service name="ssh" accept'
# 제거
firewall-cmd --permanent --remove-service=http
firewall-cmd --reload
옵션 의미 --add-service / --add-port서비스명/포트 허용 --permanent영구 저장(즉시 적용 X) --reloadpermanent를 현재 세션에 반영 --list-all현재 규칙 전체 확인 --get-default-zone기본 zone 조회
⚠️ 핵심 함정 : --permanent만 쓰면 지금은 적용 안 된다 . --reload를 해야 현재 세션에 반영된다. 반대로 --reload 없이 --add-service만 하면 재부팅 시 사라진다. "영구 + 즉시" = --permanent 후 --reload.
iptables vs firewalld 저장 : iptables는 service iptables save, firewalld는 --permanent. 둘 다 "메모리 규칙은 휘발된다"는 같은 문제를 다르게 해결.
SELinux는 전통 권한(DAC) 위에 type 기반 강제 제어(MAC)를 얹는다.
세 모드와 컨텍스트가 핵심이다.
getenforce # 현재 모드 (Enforcing/Permissive/Disabled)
setenforce 0 # Permissive로 일시 전환
setenforce 1 # Enforcing로 일시 전환
# 영구 변경(disabled 포함)은 /etc/selinux/config의 SELINUX= 수정 후 재부팅
모드 동작 Enforcing정책 위반 차단 + 로그 Permissive위반 허용하되 로그만 DisabledSELinux 완전 비활성
컨텍스트는 user:role:type:level 형식이며 type이 핵심 이다.
ls -Z /var/www/html # 파일 컨텍스트 확인 (-Z)
ps -eZ # 프로세스 컨텍스트
# 컨텍스트 변경
chcon -t httpd_sys_content_t /web/index.html # 즉시 변경(임시)
semanage fcontext -a -t httpd_sys_content_t "/web(/.*)?" # 정책에 영구 등록
restorecon -Rv /web # 정책 기준으로 기본 컨텍스트 복원
# 불리언(기능 on/off)
getsebool -a | grep httpd
setsebool -P httpd_can_network_connect on # -P=영구
명령 역할 ls -Z컨텍스트 조회 chcon -t type컨텍스트 임시 변경 restorecon기본 컨텍스트 복원 semanage fcontext컨텍스트 영구 정책 등록 setsebool -P불리언 영구 변경
진단 신호 : "권한(rwx)은 맞는데 접근이 안 된다" → SELinux 의심. setenforce 0으로 되면 SELinux 문제(운영에선 끄지 말고 restorecon/chcon으로 컨텍스트 수정).
chcon vs restorecon : chcon은 직접 지정(재라벨링 시 사라질 수 있음), restorecon은 정책 기준 복원, semanage fcontext+restorecon이 영구적인 정석. setenforce로는 Disabled로 못 간다(영구는 config 파일).
/etc/rsyslog.conf(또는 /etc/rsyslog.d/*.conf)가 로그를 분배한다.
형식은 facility.priority 대상이다.
# facility.priority 대상파일
*.info;mail.none;authpriv.none;cron.none /var/log/messages
authpriv.* /var/log/secure
mail.* /var/log/maillog
cron.* /var/log/cron
*.emerg :omusrmsg:*
kern.* /var/log/kern.log
local7.* /var/log/boot.log
facility 의미 priority(낮→높) auth/authpriv인증·보안 debugcron크론 infokern커널 noticemail메일 warning/warndaemon데몬 err/errorlocal0~7사용자 정의 crit, alert, emerg
priority는 지정 수준 이상 을 기록한다. 특수 표기는 다음과 같다.
표기 의미 mail.infomail의 info 이상 전부 mail.=info정확히 info 수준만 mail.nonemail은 제외 *.info모든 facility의 info 이상
# 수정 후 적용
systemctl restart rsyslog
보안 인증 로그를 /var/log/secure에 모으는 설정은 authpriv.* /var/log/secure. .none은 제외, .=는 정확히 그 수준만.
/etc/logrotate.conf와 /etc/logrotate.d/*가 로그가 무한히 커지는 것을 막는다.
# /etc/logrotate.d/myapp
/var/log/myapp/*.log {
weekly # 순환 주기: daily/weekly/monthly
rotate 4 # 보관 개수(4개=약 4주치), 초과분 삭제
compress # 순환된 로그 gzip 압축
delaycompress # 한 세대는 압축 지연(직전 로그 가독)
missingok # 파일 없어도 오류 안 냄
notifempty # 비어 있으면 순환 안 함
create 0640 root root # 새 로그 파일 권한·소유자
size 100M # (선택) 크기 기준 순환
postrotate # 순환 후 실행할 명령
systemctl reload rsyslog > /dev/null 2>&1 || true
endscript
}
지시어 의미 daily/weekly/monthly순환 주기 rotate N보관할 세대 수 compressgzip 압축 size크기 기준 순환 create새 파일 권한·소유 postrotate...endscript순환 후 명령
logrotate -d /etc/logrotate.d/myapp # 디버그(실제 실행 X, 동작 예측)
logrotate -f /etc/logrotate.d/myapp # 강제 즉시 순환
시험 해석 : weekly + rotate 4 + compress = 매주 순환, 최근 4개(약 4주치)를 압축 보관, 초과분 삭제. 크기 기준은 size, 주기 기준은 daily/weekly.
방화벽보다 상위 계층에서, libwrap을 쓰는 서비스(sshd, vsftpd 등)는 두 파일로 접근을 통제한다.
# /etc/hosts.allow (먼저 검사, 일치하면 허용)
sshd: 192.168.1.0/24
vsftpd: 192.168.1.10
# /etc/hosts.deny (그 다음 검사, 일치하면 거부)
ALL: ALL
검사 순서는 hosts.allow(허용) → hosts.deny(거부) → 둘 다 없으면 기본 허용 이다.
문법은 서비스 : 호스트이며 ALL/LOCAL/EXCEPT 키워드를 쓴다.
키워드 의미 ALL모든 서비스/호스트 LOCAL점(.)이 없는 로컬 호스트 EXCEPT예외 지정
순서가 결과를 바꾼다 : allow가 deny보다 우선. hosts.deny에 ALL: ALL을 두고 hosts.allow에 허용할 대상만 화이트리스트로 적는 것이 보안 정석. 둘 다 비면 모두 허용된다.
작업 iptables firewalld 주의 포트 허용 -A INPUT -p tcp --dport N -j ACCEPT--permanent --add-port=N/tcp방향·프로토콜 차단 -j DROP/REJECT--remove-serviceDROP=무응답 저장 service iptables save--permanent --reload휘발 방지 정책 -P INPUT DROPzone 기본값 SSH 먼저 허용
# 현재 방화벽 상태 한눈에
iptables -L -n -v --line-numbers
firewall-cmd --list-all
# SELinux 상태와 컨텍스트
getenforce
ls -Z /var/www/html 2> /dev/null
# 로그 설정 미리보기(실제 순환 X)
logrotate -d /etc/logrotate.conf 2>&1 | head -20
작업형은 결국 정확한 옵션과 지시어 를 묻는다 — 방향 하나, type 하나, --reload 하나가 합격을 가른다.
netfilter : 커널에 내장된 패킷 필터링 엔진. iptables와 firewalld 모두 이것을 조작한다.
체인(INPUT/OUTPUT/FORWARD) : 각각 서버로 들어오는·서버에서 나가는·서버를 통과하는 패킷에 적용되는 규칙 묶음.
-A / -I : 규칙을 체인 끝에 추가 / 맨 앞에 삽입. 첫 매칭에서 멈추므로 위치가 결과를 바꾼다.
DROP / REJECT : 응답 없이 조용히 버리기 / 거부 응답을 보내 즉시 알리기.
zone : firewalld가 신뢰 수준별로 묶어 둔 규칙 세트. 인터페이스나 출발지를 여기에 배정한다.
--permanent / --reload : 설정을 파일에 영구 저장하는 옵션 / 그 영구 설정을 현재 세션에 반영하는 명령.
rich rule : firewalld에서 출발지·서비스·동작을 조합해 세밀하게 지정하는 확장 규칙.
SELinux 컨텍스트 : 파일·프로세스에 붙는 user:role:type:level 라벨. 판정은 type 이 좌우한다.
chcon / restorecon / semanage fcontext : 컨텍스트 임시 변경 / 정책 기준 복원 / 정책에 영구 등록.
SELinux 불리언 : 특정 기능을 켜고 끄는 on/off 스위치. setsebool -P로 영구 변경한다.
facility / priority : 로그를 낸 출처 분류 / 메시지의 심각도. rsyslog는 이 짝으로 로그를 나눈다.
.none / .= : 그 facility를 기록에서 제외 / 정확히 그 수준만 기록하라는 rsyslog 표기.
rotate N : logrotate가 보관할 이전 로그 세대 수. 초과분은 삭제된다.
hosts.allow / hosts.deny : TCP Wrapper의 허용·거부 목록. allow를 먼저 검사하며, 둘 다 없으면 허용된다.
📝 연습 문제 선택지를 클릭하면 정답·해설이 펼쳐집니다.
외부에서 들어오는 22번 포트(SSH) TCP 접속을 허용하는 iptables 명령으로 옳은 것은?
A iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT B iptables -A INPUT -p tcp --dport 22 -j ACCEPT C iptables -A FORWARD -p udp --dport 22 -j ACCEPT D iptables -P INPUT -p tcp --dport 22 -j DROP 원격 SSH로 서버를 관리하던 중 방화벽 기본 정책을 DROP으로 바꾸려 한다. 올바른 작업 순서는?
A -P INPUT DROP을 먼저 실행하고 SSH를 허용한다 B SSH(22) 허용 규칙을 먼저 넣은 뒤 -P INPUT DROP을 실행한다 C 순서는 상관없다 D -F로 모두 비운 뒤 -P INPUT DROP만 실행한다 firewalld에서 http 서비스를 재부팅 후에도 유지되게 허용하고 즉시 반영하려면?
A firewall-cmd --add-service=http B firewall-cmd --permanent --add-service=http 후 firewall-cmd --reload C firewall-cmd --permanent --add-service=http 만 실행 D firewall-cmd --reload 후 firewall-cmd --add-service=http SELinux의 동작 모드 중 정책 위반을 차단하지 않고 로그만 남기는 모드는?
A Enforcing B Permissive C Disabled D Targeted 파일의 SELinux 컨텍스트를 정책 기준의 기본값으로 복원하는 명령은?
A chcon B restorecon C setenforce D getsebool rsyslog.conf에서 mail.none의 의미로 옳은 것은?
A mail facility의 모든 메시지를 기록한다 B mail facility의 메시지를 해당 대상에서 제외한다 C mail의 none 수준만 기록한다 D 모든 facility의 메시지를 mail로 보낸다 logrotate 설정 weekly, rotate 4, compress의 동작으로 옳은 것은?
A 매일 순환하며 4개를 압축 없이 보관한다 B 매주 순환하며 최근 4개(약 4주치)를 압축해 보관하고 초과분은 삭제한다 C 로그가 4MB를 넘으면 순환한다 D 4주에 한 번만 순환한다