iptables 방화벽 설정
iptables 방화벽 설정
iptables은 리눅스 운영체제에서 네트워크 방화벽을 관리하기 위한 소프트웨어 패키지입니다.
iptables는 IP 주소, 포트 번호, 프로토콜 유형, 패킷 콘텐츠 등 사용자환경에 따라 트래픽을 차단 및 허용할 수 있습니다.
iptables은 네트워크 보안을 강화하고 관리할 수 있는 표준 방화벽 도구로 자리 잡았으며, 많은 리눅스 시스템에서 사용하고 있습니다.
iptables는 네트워크 패킷을 조작하고 필터링할 수 있는 리눅스 커널 내의 프레임워크인 netfilter를 제어 및 관리하기 위한 도구입니다.
본 매뉴얼은 자주 사용하는 기능을 중심으로 iptables를 활용하는 예를 소개합니다. 테스트 환경은 다음과 같습니다.
테스트 환경
HW : 리얼서버, 가상서버 환경 OS : CentOS 6 - 64bit Kernel : 2.6.32 기반 참고사항 : centos 7 이상과 redhat (centos, fedora) 계열 이외 OS는 아래 환경과 경로나 스크립트 위치가 달라집니다. |
iptables 방화벽 개요
iptables의 기본 개념은 시스템에 오고 가는 트래픽 유형을 정의하여 규칙을 만드는 것입니다.
이러한 규칙은 특정 IP 주소의 트래픽을 차단하거나, 특정 포트로의 트래픽을 차단하거나, 특정 소스의 트래픽만 허용하는 데 사용할 수 있습니다.
또한, 내부 IP 주소를 외부 주소에 매핑하는 데 사용할 수 있는 NAT(네트워크 주소 변환)를 비롯한 다양한 고급 기능도 iptables에서 지원합니다. 기본적인 사용법을 알아보겠습니다.
1. 테이블(table)
iptables는 방화벽 규칙을 네트워크 트래픽을 처리하는 방법을 정의하는 체인 모음인 테이블로 구성합니다. iptables에는 세 가지 기본 제공 table이 있습니다
filter 테이블 미리 정의된 규칙 집합을 기반으로 패킷을 필터링하는 데 사용됩니다.
nat 테이블 내부 IP 주소를 외부 주소에 매핑하는 데 사용되는 NAT(네트워크 주소 변환)를 수행하는 데 사용됩니다.
mangle 테이블 킷 헤더를 수정하는 데 사용됩니다. 여기에는 5개의 기본 체인이 포함됩니다: PREROUTING, OUTPUT, INPUT, FORWARD, POSTROUTING입니다.
raw 테이블 패킷이 다른 테이블에서 처리되기 전에 패킷에 영향을 주는 규칙을 구성하는 데 사용됩니다. |
2. 체인 (chain)
iptables에서 체인은 네트워크 트래픽을 처리하는 규칙의 모음으로, 특정 순서로 평가되어 패킷의 처리 방법을 결정합니다.
패킷이 시스템에 도착하면 체인에 의해 처리되며, 일치하는 규칙이 발견될 때까지 순서대로 평가됩니다.
일치하는 규칙이 있을경우 규칙에 지정된 조치(예: 수락, 삭제 또는 거부)가 취해지고 패킷 처리가 계속되며, 일치하는 규칙이 없으면 체인의 기본 정책이 적용됩니다.
기본 정책은 패킷을 수락, 삭제 또는 거부하는 것입니다.
다음과 같은 여러 체인을 iptables에서 사용할 수 있습니다:
INPUT 체인: 로컬 시스템으로 향하는 수신 패킷을 필터링하는 데 사용됩니다. OUTPUT 체인: 로컬 시스템에서 출발하는 패킷을 필터링하는 데 사용됩니다. FORWARD 체인: 시스템을 통과하는 패킷을 필터링하는 데 사용됩니다. PREROUTING 체인: 패킷이 시스템에 도착할 때 패킷을 수정하는 데 사용됩니다. POSTROUTING 체인: 패킷이 시스템을 떠날 때 패킷을 수정하는 데 사용됩니다. NAT 체인: NAT 테이블에는 PREROUTING, POSTROUTING, OUTPUT 세 개의 체인이 포함됩니다. 이들 체인은 NAT(네트워크 주소 변환)를 수행하는 데 사용됩니다. Mangle 체인: 맹글 테이블에는 PREROUTING, OUTPUT, INPUT, FORWARD, POSTROUTING 5개의 체인이 포함됩니다: 이들 체인은 패킷 헤더를 수정하는 데 사용됩니다. |
3. 주요 옵션
iptables는 방화벽 정책을 구성하는 데 사용할 수 있는 다양한 옵션을 제공합니다. 이중 자주 사용하는 옵션은 다음과 같습니다. 이 정도 옵션만 알아도 서버에 대한 간단한 접근 정책 설정을 할 수 있습니다.
-p [프로토콜 번호] -s [출발지 IP] -d [목적지 IP] --sport [출발지 포트 번호] --dport [목적지 포트 번호] -j ACCEPT : 허용 -j DROP : 차단 -m [모듈이름] : iptables에서 확장 모듈을 사용할 때 사용 |
4. 실행 및 중지
iptables을 시작하거나 중지하려면 다음과 같은 명령을 사용할 수 있습니다.
시작 $ /etc/init.d/iptables start
중지 $ /etc/init.d/iptables stop
재시작 $ /etc/init.d/iptables restart
재로드 /etc/init.d/iptables reload |
또는, systemctl 명령어를 사용하여 systemd에서 iptables 서비스를 제어할 수도 있습니다.
시작 systemctl start iptables.service
중지 systemctl stop iptables.service
재시작 systemctl restart iptables.service
재로드 systemctl reload iptables.service |
5. 정책 설정
Iptables을 구성하는 가장 일반적인 방법 중 하나는 /etc/sysconfig/iptables 파일을 편집하는 것입니다. 이 파일은 iptables의 설정과 정책을 저장합니다. iptables 정책 파일 위치와 내용은 다음과 같습니다.
$ vi /etc/sysconfig/iptables
*filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT -A INPUT -p icmp -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT -A INPUT -j REJECT --reject-with icmp-host-prohibited -A FORWARD -j REJECT --reject-with icmp-host-prohibited COMMIT |
파일 편집은 위와 같이 iptables 명령으로 하나하나 정책을 추가하거나 다음과 같이 파일을 수정한 다음 iptables 재시작하는 방법 2가지가 있습니다. 만약 리눅스 서버에 네임서버가 운영 중이라면 아래와 같이 설정하면 됩니다.
$ vi /etc/sysconfig/iptables (파일 내용 추가)
*filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT -A INPUT -p icmp -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT -A INPUT -m state --state NEW -m udp -p udp --dport 53 -j ACCEPT (라인 추가) -A INPUT -j REJECT --reject-with icmp-host-prohibited -A FORWARD -j REJECT --reject-with icmp-host-prohibited COMMIT |
위와 같이 파일을 수정한 후 /etc/init.d/iptables restart 스크립트를 실행하여 변경 사항을 적용할 수 있습니다.
iptables는 정책이 순차적으로 적용되며 일반적으로 패킷이 위에서 아래로 지나가도록 구성됩니다.
위 예제에서 마지막 정책은 모든 패킷의 차단을 의미합니다.
-A INPUT -j REJECT --reject-with icmp-host-prohibited -A FORWARD -j REJECT --reject-with icmp-host-prohibited |
일반적으로는 위쪽에는 방화벽 허용 정책을 아래쪽에는 차단하는 정책을 배치시킵니다.
수정 후에는 방화벽을 재시작합니다.
$ /etc/init.d/iptables restart iptables: 방화벽 규칙 적용 중: [ OK ] |
방화벽 정책 파일을 잘못수정하거나 문법이 틀린경우 열번호와 함께 에러를 출력합니다.
$ /etc/init.d/iptables start iptables: 방화벽 규칙 적용 중: Bad argument `123123123123123' Error occurred at line: 26 Try `iptables-restore -h' or 'iptables-restore --help' for more information. [실패] |
위와 같이 26번째 라인 에러 발생시에는 그 앞뒤 정책들도 같이 확인하는 것이 좋습니다.
에러 메세지를 보면 틀린 부분과 라인 번호가 나와있습니다.
이를 참조해 수정하고 iptables를 다시 시작합니다.
방화벽 설정을 위해서는 서비스 포트 번호를 알아야 하는데 리눅스 서버에서는 아래 파일에서 확인 가능합니다.
$ cat /etc/services
...... http 80/tcp www www-http # WorldWideWeb HTTP ...... |
서버의 ssh 접근을 특정 아이피 (192.168.0.1) 에서만 접근 가능하도록 한다면 아래와 같은 정책을 만들수 있습니다.
-A INPUT -m state --state NEW -m tcp -p tcp -s 192.168.0.1 --dport 22 -j ACCEPT |
iptables 는 방화벽 정책을 적용하고 실제로 패킷이 차단하는지 다른서버나 외부에서 테스트를 해야 합니다.
실제로 문법은 틀린게 없지만 옵션 등의 문제로 인해 차단 정책을 하고 나서 외부에서 접근이 되는 경우도 종종 발생하기 때문입니다.
NOTE
방화벽 설정을 잘못 하는 경우 서버와의 연결이 끊어져서 접속이 안되는 경우가 발생합니다. IWINV 에서 제공하는 콘솔모드 기능을 이용하여 콘솔로 서버를 미리 띄워놓고 작업하면 장애시에 빠른 대처가 가능합니다. |
관련링크
• IWINV 방화벽 생성하기 (http://help.iwinv.kr/manual/read.html?idx=62)
• iptables 로 국가 아이피 차단하기 (http://help.iwinv.kr/manual/read.html?idx=97)