이 상세한 튜토리얼은 오랜 시간 검증되고 신뢰받아 온 리눅스 방화벽 iptables를 처음 시작하는 분들을 위해 준비되었습니다.
왜 방화벽 설정이 필요한가?
리눅스 시스템은 보안성이 뛰어난 것으로 널리 알려져 있습니다. 여러 연구에 따르면 리눅스는 설계 단계부터 보안을 고려하여 만들어졌습니다. 그러나 아무리 강력한 보안 기능이 기본 탑재되어 있더라도, 이를 올바르게 설정하지 않으면 실질적인 보호 효과를 얻기 어렵습니다. 이 글에서는 서버를 안전하게 지켜주는 핵심 도구인 방화벽(firewall)을 설정하는 과정을 안내합니다.
여기서는 리눅스의 iptables 방화벽을 사용하며, Red Hat Enterprise Linux 4 또는 유사한 환경에서 실행 중인 서버를 기준으로 설명합니다. 다만 대부분의 절차는 다른 리눅스 배포판에서도 동일하게 적용할 수 있습니다. 이번 실습에서는 아파치 웹 서버(Apache Web Server), FTP, SSH가 구동되는 리눅스 서버에 방화벽을 구축해 보겠습니다.
1단계: 열어야 할 포트 확인하기
먼저 각 애플리케이션이 사용하는 포트와, 방화벽에서 반드시 열어두어야 할 포트가 무엇인지 살펴봅시다.
- Apache 웹 서버: 기본적으로 80번 포트를 사용합니다. 모든 웹 콘텐츠가 이 포트를 통해 제공되므로 방화벽에서 열어두어야 합니다.
- SSH: 22번 포트를 사용합니다. 원격으로 서버에 접속하여 작업하려면 이 포트가 열려 있어야 합니다.
- FTP: 21번 포트를 사용합니다. 파일 전송 통신을 위해 이 포트 역시 열어두어야 합니다.
2단계: iptables 설치 확인
다음으로 iptables가 설치되어 있는지 확인합니다. root 권한으로 아래 명령어를 실행하세요.
# rpm -qa | grep iptables
iptables가 이미 설치되어 있다면 시스템에 설치된 버전 정보가 출력됩니다. 만약 설치되어 있지 않다면 다음 명령어로 설치하고 실행할 수 있습니다.
# yum install iptables
# /etc/init.d/iptables start
3단계: 현재 방화벽 규칙 확인하기
iptables가 현재 어떤 설정으로 동작 중인지 확인하려면 아래 명령어를 입력합니다.
# iptables --list
Chain INPUT (policy ACCEPT)
target prot opt source destinationChain FORWARD (policy ACCEPT)
target prot opt source destinationChain OUTPUT (policy ACCEPT)
target prot opt source destination
이 명령은 현재 설정된 모든 방화벽 규칙을 나열합니다. 여기서는 서버에 아직 별도의 방화벽 규칙이 없다고 가정하고 진행하겠습니다. 이제 웹 서버용 80번 포트, SSH용 22번 포트, FTP용 21번 포트의 통신을 허용하고, 그 외 지정되지 않은 모든 포트의 통신은 차단하도록 방화벽을 구성해 봅시다.
4단계: 방화벽 스크립트 작성하기
아래는 방화벽 설정 스크립트입니다. 새 파일을 생성하고 이름을 iptable-firewall.sh로 지정한 뒤, 다음 내용을 복사해 넣으세요.
#!/bin/sh
ANY="0/0"
OPEN_PORTS="21 22 80"iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT# Flush (-F) all specific rules
iptables -F INPUT
iptables -F FORWARD
iptables -F OUTPUTfor port in $OPEN_PORTS
do
iptables -A INPUT -i eth0 -p tcp -s $ANY -d $ANY --destination-port $port --syn -j ACCEPT
iptables -A INPUT -i eth1 -p tcp -s $ANY -d $ANY --destination-port $port --syn -j ACCEPT
doneiptables -A INPUT -i eth1 -p icmp -s $ANY -d $ANY -j ACCEPT
#Allow any related/established connections
iptables -A INPUT -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT#Kill everything else
iptables -A INPUT -i eth0 -j DROP
iptables -A INPUT -i eth1 -j DROP#write for boot
iptables-save > /etc/sysconfig/iptables
이 스크립트의 동작 순서를 간단히 정리하면 다음과 같습니다. 먼저 모든 체인(Chain)의 기본 정책을 ACCEPT로 초기화하고, 기존 규칙을 모두 삭제(-F)합니다. 이후 OPEN_PORTS 변수에 지정된 각 포트에 대해 eth0과 eth1 인터페이스의 새 연결(SYN 패킷)을 허용합니다. ICMP(ping) 요청도 허용하고, 이미 연결된 세션(ESTABLISHED, RELATED)은 그대로 통과시킵니다. 마지막으로 나머지 모든 들어오는 트래픽은 DROP으로 차단하며, iptables-save 명령으로 설정을 저장해 재부팅 후에도 규칙이 유지되도록 합니다.
5단계: 스크립트 실행 및 확인
파일을 저장한 후 실행 권한을 부여하고 스크립트를 실행합니다.
# chmod +x iptable-firewall.sh
# ./iptable-firewall.sh
이제 방화벽 규칙이 제대로 적용되었는지 확인해 봅니다.
# iptables --list
모든 방화벽 규칙이 정상적으로 설정되었다면, 이제 여러분의 서버는 안전하게 보호됩니다.
규칙 수정 및 관리 팁
설정된 규칙에 수정이나 추가가 필요하다면, 스크립트에서 OPEN_PORTS 매개변수가 정의된 부분을 편집하여 포트를 추가하거나 제거하면 됩니다. 변경 후에는 반드시 스크립트를 다시 실행해야 변경 사항이 적용됩니다.
만약 커맨드라인 작업이 부담스럽다면, 직관적인 그래픽 인터페이스(GUI)를 제공하는 리눅스 방화벽 도구 Firestarter 설정 방법을 다룬 튜토리얼을 참고하는 것도 좋은 대안입니다.