방화벽 규칙을 잘못 짜면 두 가지가 일어납니다. 너무 느슨하면 열지 말아야 할 포트가 열리고, 너무 빡빡하면 자기 SSH 세션까지 끊겨 잠깁니다. 핵심은 규칙이 위에서 아래로 순서대로 평가되고, 먼저 매치되는 규칙이 이긴다는 점을 이해하는 것입니다.
현재 상태 먼저 본다
지금 어떤 규칙이 걸려 있는지부터 확인합니다.
iptables -L -n -v --line-numbers
-n은 이름 대신 IP·포트 숫자로 빠르게 출력하고, --line-numbers는 규칙 번호를 보여줘 나중에 특정 규칙을 지울 때 씁니다. policy ACCEPT인지 DROP인지(체인 기본 정책)를 먼저 봅니다.
⚠️ 아래 명령은 root 권한과 콘솔/OOB 접근이 있는 테스트 호스트에서만 실행하세요. 원격 SSH 세션을 변경하기 전에 현재 접속원의 공인 IPv4뿐 아니라 IPv6 주소와 관리 포트도 확인하고, 배포판의 방화벽 관리 도구(
nftables,firewalld,ufw)와 중복 관리하지 않는지 먼저 확인합니다. 적용 전 백업과 되돌리기 예약 없이는 기본 정책을 변경하지 마세요.
설계 원칙 — 기본 차단 + 명시적 허용
안전한 방화벽은 "기본은 모두 차단, 필요한 것만 허용"입니다. 단, 정책을 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으로 바꿀 때는 타임아웃 롤백을 걸어두면 실수해도 자동 복구됩니다.
# 원격 장비에서는 콘솔/OOB와 현재 ruleset 백업을 먼저 확보합니다.
BACKUP="/root/iptables.before.$(date +%Y%m%d%H%M%S)"
sudo iptables-save > "$BACKUP"
sudo iptables-restore --test "$BACKUP"
# 실제 변경은 허용 규칙을 먼저 추가한 뒤 별도 콘솔에서 검증합니다.
# 실패하면 백업 파일을 명시해 복구합니다(전체 체인 flush 예약 금지).
sudo iptables-restore "$BACKUP"
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 환경이면 이쪽 확인
# at을 쓸 경우에도 실제 복구 파일과 명령을 예약하고 예약 작업을 확인합니다.
echo 'iptables-restore /root/iptables.before.YYYYMMDDHHMMSS' | sudo at now + 5 minutes
sudo atq
규칙을 영구 저장하려면 iptables-save/netfilter-persistent 또는 nft list ruleset > /etc/nftables.conf를 씁니다(재부팅 시 초기화 방지).
방화벽·연결 상태·패킷 경로를 직접 끊어보며 진단하는 실습은 네트워크 트랙에서 회원가입 없이 무료로 할 수 있습니다.