iptables 방화벽 설정
iptables 방화벽 설정
iptables은 리눅스 운영체제에서 네트워크 방화벽을 관리하기 위한 소프트웨어 패키지입니다.
iptables는 IP주소 , 포트번호 , 프로토콜 유형 , 패킷 컨텐츠 등 사용자 환경에 따라 트래픽을 차단 및 허용할 수 있습니다.
iptables은 네트워크 보안을 강화하고, 관리할 수 있는 표준 방화벽 도구로써 많은 Linux 시스템에서 활용하고 있습니다.
※ 네트워크 패킷을 조작 및 필터링 할 수 있는 리눅스 커널 내 프레임워크인 netfilter를 제어 및 관리하기 위한 도구입니다.
본 매뉴얼은 자주 사용하는 기능을 중심으로 iptables을 활용하는 내용을 소개 드리도록 하겠습니다.
테스트 환경
HW : 리얼서버, 가상서버 환경
참고사항 : Centos 7 이상과 redhat (centos, fedora) 계열 이외 OS는 아래 환경과 경로나 스크립트 위치가 달라집니다. |
iptables 방화벽 개요
iptables의 기본 개념은 시스템에 오고가는 트래픽 유형을 정의하여 규칙을 정합니다.
이러한 규칙은 특정 IP 주소의 트래픽 차단 , 특정포트 트래픽 차단 , 특정 소스 트래픽 허용 등 다양한 방법으로 활용할 수 있습니다.
또한, 내부 IP 주소를 외부 주소에 매핑하는 목적으로도 사용하며, NAT(Network Address Translation)을 비롯한 다양한 고급기능도 iptables에서 지원합니다.
하단에서는 기본적인 사용법을 안내하겠습니다.
1. 테이블(table)
iptables는 방화벽 규칙을 네트워크 트래픽을 처리하는 방법을 정의한 체인모음인 테이블로 구성되어 있습니다.
iptables에는 3개의 기본 table이 존재하며 내용은 아래와 같습니다.
filter 테이블 미리 정의된 규칙 집합을 기반으로 패킷을 필터링하는 데 사용됩니다. Nat 테이블 NAT 테이블은 내부 IP 주소를 외부 주소에 매핑하는 데 사용되는 NAT(네트워크 주소 변환)을 수행하는 데 사용됩니다. Mangle 테이블 Raw 테이블 Raw 테이블은 패킷이 다른 테이블에서 처리되기 전에 패킷에 영향을 주는 규칙을 구성하는 목적으로 사용합니다. |
2. 체인 (chain)
iptables에서 체인은 네트워크 트래픽을 처리하는 모음으로, 특정 순서로 평가되어 패킷의 처리방법을 결정합니다.
패킷이 시스템에 도착하면 체인에 의해 처리되며, 일치하는 규칙을 발견할 때까지 순서대로 평가합니다.
일치하는 규칙이 있을경우 해당 규칙에 지정된 조치(수락 , 삭제 , 거부)등 취해지며, 패킷처리가 진행됩니다.
그러나 일치하는 규칙이 없을 경우, 체인의 기본 정책이 적용됩니다.
※ 체인의 기본정책은 패킷을 수락 , 삭제 , 거부합니다.
INPUT 체인: 로컬 시스템으로 향하는 수신 패킷을 필터링하는 데 사용됩니다. OUTPUT 체인: 로컬 시스템에서 출발하는 패킷을 필터링하는 데 사용됩니다. FORWARD 체인: 시스템을 통과하는 패킷을 필터링하는 데 사용됩니다. PREROUTING 체인: 패킷이 시스템에 도착할 때 패킷을 수정하는 데 사용됩니다. POSTROUTING 체인: 패킷이 시스템을 떠날 때 패킷을 수정하는 데 사용됩니다. NAT 체인: NAT 테이블에는 PREROUTING, POSTROUTING, OUTPUT 세 개의 체인이 포함됩니다. 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 명령으로 하나하나 정책을 추가하거나 다음과 같이 파일 수정하시기 바랍니다.
Linux 서버 내 네임서버를 운영중일 경우 아래와 같이 설정을 추가하시기 바랍니다.
$ 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)