iptables 방화벽 설정
리눅스에서는 'iptables' 라고 하는 방화벽을 제공하고 있으며 서버로 들어오는 패킷이나 서버에서 외부로 나가는 패킷들을 필터링 하기 위해서 사용합니다.
간단하말하면 IP 또는 PORT 를 설정하여 접근을 허용하거나 거부하는 등의 작업을 수행한다고 보면 됩니다.
서버를 운영할때 가장 기본이 되는 보안정책이기 때문에 사용자는 반드시 iptables 보안 설정을 하여 시스템 접근 보호를 해야 합니다.
∗ 리눅스 시스템에서 커널에 적재된 netfilter 라고 하는 곳에서 실제로 필터링을 담당하고 있으며 iptables 는 netfilter 를 제어 및 관리하기 위한 도구입니다.
아래는 netfilter 공식 홈페이지입니다.
본 문서에서 iptables 에 대한 모든 설명은 다 하긴 어렵지만 자주 사용하는 기능과 예제를 통해 간단히 알아보도록 하겠습니다.
테스트 환경
HW : 리얼서버, 가상서버 환경 OS : CentOS 6 - 64bit Kernel : 2.6.32 기반 참고사항 : centos 7 이상과 redhat (centos, fedora) 계열 이외 OS는 아래 환경과 경로나 스크립트 위치가 달라집니다. |
iptables 방화벽 개요
테이블 (table)
: 각 테이블 마다 기능이 다르고 사용자의 용도에 따라 알맞은 테이블을 선택하면 됩니다.
filter 패킷을 필터링 할때 사용됨
nat 패킷의 방향이나 주소를 변경
mangle 패킷의 상태를 변경
raw 패킷이 커널에 의해 처리되기 전에 필터링 |
∗ 기본적으로 서버에 대한 접근제한은 filter 테이블에서 이뤄집니다. ( 본 문서는 filter 테이블을 기준으로 설명합니다)
체인 (chain)
INPUT : 외부에서 서버로 들어오는 연결에 대한 필터링 OUTPUT : 서버에서 외부로 나가는 연결에 대한 필터링 FORWARD : 외부에서 들어온 연결이 다시 외부로 향하는 연결에 대한 필터링 |
∗ 위 체인은 filter 테이블에 포함되어 있으며 필요에 따라 별도의 체인을 생성 할 수 있습니다. (본 문서는 INPUT 체인 기준으로 설명합니다)
그리고 몇가지 문법들로 구성되는데 자주 사용되는것들은 아래와 같습니다
-p [프로토콜 번호] -s [출발지 아이피] -d [목적지 아이피] --sport [출발지 포트번호] --dport [목적지 포트번호] -j ACCEPT : 허용 -j DROP : 차단 -m [모듈이름] : iptables에서 확장모듈을 사용할 때 사용 |
∗ 위 옵션들만 알고 있으면 서버에 대한 간단한 접근 정책 설정은 무난히 진행 할 수 있습니다.
방화벽 실행 및 중지 스크립트
실행 $ /etc/init.d/iptables start
중지 $ /etc/init.d/iptables stop
재시작 $ /etc/init.d/iptables restart |
∗ 시작, 재시작은 아래 파일 경로 (/etc/sysconfig/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 |
∗ 파일 수정후 iptables 재시작 스크립트 (/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 ...... |
ex) 서버의 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)