리눅스 정보실

Rocky Linux에서 iptables 실전 설정 완전 정리

고지존 2025. 7. 24. 16:38

리눅스 서버 방화벽 관리에서 iptables는 필수 도구입니다. 하지만 단순 명령어 나열만으로는 실제 운영 중 발생하는 문제를 해결하기 어렵습니다. 이번 글에서는 Rocky Linux 환경을 기준으로 iptables 기본 정책부터, 실전에서 자주 쓰는 옵션과 룰 구성을 자세히 살펴보겠습니다.

1. 기본 정책부터 무조건 DROP으로 시작하기

iptables의 기본 정책(POLICY)은 기본적으로 DROP으로 설정하는 것이 보안의 시작입니다. 기본 정책이 ACCEPT면 원하지 않는 트래픽이 들어올 수 있기 때문입니다.

iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP

각 체인의 의미는 다음과 같습니다.

  • INPUT: 서버로 들어오는 트래픽
  • FORWARD: 서버를 경유하는 트래픽 (라우터 역할이 아니면 DROP)
  • OUTPUT: 서버에서 나가는 트래픽

주의! OUTPUT 기본 DROP 정책을 적용하면, 서버에서 외부로 나가는 필수 트래픽을 허용하는 룰도 꼭 만들어야 합니다.

2. 루프백 인터페이스(lo)는 무조건 허용

서버 내부 프로세스 간 통신에 필수적인 루프백 인터페이스는 반드시 허용해야 합니다.

iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

lo 인터페이스가 차단되면 내부 서비스 간 통신이 끊겨 서버 장애가 발생할 수 있습니다.

3. 연결 상태 추적 (conntrack) 모듈 활용

iptables는 conntrack 모듈을 이용해 연결 상태를 추적합니다. 이미 연결된 세션의 패킷은 허용하고, 새 연결만 제어할 수 있습니다.

iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

이 룰이 없으면 서버가 응답 패킷을 보내지 않아 정상적인 통신이 불가능합니다. 예를 들어 SSH 접속은 성공해도, 인증 후 연결이 끊길 수 있습니다.

4. SSH(22) 포트 새 연결 허용

외부에서 SSH 접속을 허용하려면 NEW 상태 패킷만 허용해야 합니다.

iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT
iptables -A OUTPUT -p tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT

OUTPUT 체인의 ESTABLISHED 허용이 없으면, 접속은 되지만 로그인 후 통신이 끊길 수 있습니다.

5. HTTP/HTTPS (80, 443) 포트 허용

웹 서버 운영 시 HTTP와 HTTPS 포트를 열어야 합니다.

iptables -A INPUT -p tcp -m multiport --dports 80,443 -m conntrack --ctstate NEW -j ACCEPT
iptables -A OUTPUT -p tcp -m multiport --sports 80,443 -m conntrack --ctstate ESTABLISHED -j ACCEPT

OUTPUT에 대한 허용이 없으면 웹 접속은 되지만 페이지가 정상적으로 표시되지 않습니다.

6. DNS (UDP 53) 쿼리 허용

서버에서 도메인 이름으로 외부 서비스에 접속하려면 DNS 요청이 필요합니다.

iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
iptables -A INPUT -p udp --sport 53 -m conntrack --ctstate ESTABLISHED -j ACCEPT

DNS가 막히면 yum, curl, ping 등 도메인 기반 서비스가 실패합니다.

7. NTP (UDP 123) 시간 동기화 허용

서버의 정확한 시간 유지를 위해 NTP도 허용해야 합니다.

iptables -A OUTPUT -p udp --dport 123 -j ACCEPT
iptables -A INPUT -p udp --sport 123 -m conntrack --ctstate ESTABLISHED -j ACCEPT

시간이 맞지 않으면 로그, 인증서 오류 등 다양한 문제가 발생합니다.

8. 비정상 패킷 차단: 포트 스캔 및 INVALID 세션

비정상적인 TCP 패킷이나 세션은 공격의 징후일 수 있어 차단합니다.

iptables -A INPUT -p tcp ! --syn -m conntrack --ctstate NEW -j DROP
iptables -A INPUT -m conntrack --ctstate INVALID -j DROP

이 룰이 없으면 포트 스캔에 쉽게 노출되고, 비정상 패킷이 서버를 공격할 수 있습니다.

9. 룰 적용 후 설정 확인 방법

설정이 제대로 적용됐는지 확인하려면 다음 명령어를 씁니다.

iptables -nvL --line-numbers
  • -n: IP 주소나 포트를 숫자로 표시해 속도 향상
  • -v: 패킷 및 바이트 수 표시, 룰이 작동하는지 확인 가능
  • --line-numbers: 룰 번호 표시, 수정 및 삭제에 도움

출력 결과에서 패킷 수가 0이면 해당 룰에 트래픽이 없다는 뜻으로, 설정 오류 가능성을 점검해야 합니다.

 

설정 확인 보기

10. 룰 저장과 자동 적용

iptables 룰은 재부팅하면 초기화됩니다. 따라서 반드시 저장 후 자동 적용 설정이 필요합니다.

iptables-save > /etc/sysconfig/iptables
systemctl enable iptables
systemctl restart iptables

---

지금까지 Rocky Linux 기준으로 iptables 옵션과 실전 운영에 꼭 필요한 룰 구성을 다뤘습니다. 각 룰이 왜 필요한지, 없으면 어떤 문제가 발생하는지 정확히 이해하고 적용하는 것이 중요합니다. 추가로 fail2ban과 연계한 자동 차단, rate limiting, 화이트리스트 설정 등 고급 보안 설정도 필요하면 언제든 문의 주세요.