방화벽 규칙을 잘못 짜면 두 가지가 일어납니다. 너무 느슨하면 열지 말아야 할 포트가 열리고, 너무 빡빡하면 자기 SSH 세션까지 끊겨 잠깁니다. 핵심은 규칙이 위에서 아래로 순서대로 평가되고, 먼저 매치되는 규칙이 이긴다는 점을 이해하는 것입니다.
현재 상태 먼저 본다
지금 어떤 규칙이 걸려 있는지부터 확인합니다.
iptables -L -n -v --line-numbers
-n은 이름 대신 IP·포트 숫자로 빠르게 출력하고, --line-numbers는 규칙 번호를 보여줘 나중에 특정 규칙을 지울 때 씁니다. policy ACCEPT인지 DROP인지(체인 기본 정책)를 먼저 봅니다.
설계 원칙 — 기본 차단 + 명시적 허용
안전한 방화벽은 "기본은 모두 차단, 필요한 것만 허용"입니다. 단, 정책을 DROP으로 바꾸기 전에 허용 규칙을 먼저 넣어야 자기 세션이 안 끊깁니다.
# 1) 루프백과 기존 연결은 항상 허용 (이걸 먼저)
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# 2) 필요한 서비스 포트만 허용
iptables -A INPUT -p tcp --dport 22 -j ACCEPT # SSH
iptables -A INPUT -p tcp --dport 443 -j ACCEPT # HTTPS
# 3) 그 다음에 기본 정책을 DROP으로
iptables -P INPUT DROP
ESTABLISHED,RELATED 규칙이 핵심입니다. 이게 있으면 이미 맺어진 연결의 응답 패킷은 통과하므로, 나가는 연결마다 별도 INPUT 규칙을 만들 필요가 없습니다.
순서의 함정
규칙은 순서대로 평가되니 거부 규칙을 허용 규칙보다 위에 두면 허용이 무력화됩니다.
# 잘못된 순서 — 위에서 다 막혀서 아래 허용이 의미 없음
iptables -A INPUT -j DROP
iptables -A INPUT -p tcp --dport 443 -j ACCEPT # 도달 못 함
특정 IP만 SSH를 허용하려면 더 구체적인(좁은) 규칙을 위에 둡니다.
iptables -I INPUT 3 -p tcp --dport 22 -s 203.0.113.0/24 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP
잠기지 않게 적용하기
원격 서버에서 정책을 DROP으로 바꿀 때는 타임아웃 롤백을 걸어두면 실수해도 자동 복구됩니다.
# 5분 뒤 규칙을 비우는 안전장치 예약
echo "iptables -F INPUT; iptables -P INPUT ACCEPT" | at now + 5 minutes
# 이후 규칙 적용·검증, 정상이면 at 작업 취소(atrm)
nftables — 요즘 기본
최신 배포판은 iptables의 후속인 nftables(nft)를 기본으로 씁니다. 같은 정책을 이렇게 표현합니다.
nft list ruleset # 현재 규칙 보기
nft add table inet filter
nft add chain inet filter input '{ type filter hook input priority 0; policy drop; }'
nft add rule inet filter input ct state established,related accept
nft add rule inet filter input iif lo accept
nft add rule inet filter input tcp dport { 22, 443 } accept
nft는 여러 포트를 { 22, 443 }처럼 집합으로 묶고 IPv4·IPv6를 inet 테이블 하나로 처리해 규칙이 간결합니다. 운영 중인 서버의 기존 도구(iptables vs nft)를 확인하고 한쪽으로 통일해 관리하세요.
체크리스트
iptables -L -n -v --line-numbers # 현재 규칙·기본 정책 확인
# 허용 규칙(lo, ESTABLISHED, 필요한 포트)을 먼저 넣고
# 마지막에 -P INPUT DROP
nft list ruleset # nftables 환경이면 이쪽 확인
echo "..." | at now + 5 minutes # 원격 적용 시 롤백 안전장치
규칙을 영구 저장하려면 iptables-save/netfilter-persistent 또는 nft list ruleset > /etc/nftables.conf를 씁니다(재부팅 시 초기화 방지).
방화벽·연결 상태·패킷 경로를 직접 끊어보며 진단하는 실습은 네트워크 트랙에서 회원가입 없이 무료로 할 수 있습니다.