[보안] iptables 의 기본 계념과 사용법
IPTABLES 의 기본 계념과 사용법
—————————————–
Iptables사용법과 기본적인 firewall구성법에 대해서 알아보도록 하겠다.
Iptables에 대해 배워보기에 앞서서 여기서 테스트한 환경은 다음과 같다.
OS : RedHat Linux 7.1 (Kernel 2.4.x)
이제 Iptables를 사용하기 위한 기본적인 설정에 대해서 알아보자.
Iptables는 Kernel 2.4.x 기반의 리눅스 설치시에 기본으로 설치되어있고
/sbin 디렉토리 아래에 있다. 그리고 iptables와 ipchains는 동시에 사용할
수 없으므로 우선 ipchains의 모듈을 내려줘야 한다. 그래야 만이 iptables
사용이 가능하다.
이제 Iptables에 대해서 본격적으로 알아보도록 하자.
기본적으로 Iptables에는 세가지 chain이 있고 모든 패킷은 이 세가지 chain
중 하나를 통과하게 된다. 이 세가지 chain은 INPUT, OUTPUT, FORWARD chain
인데 우선 여러분의 컴퓨터로 들어가는 모든 패킷은 INPUT chain을 통과한다.
그리고 여러분의 컴퓨터에서 나가는 모든 패킷은 OUTPUT chain을 통과한다.
그리고 하나의 네트워크에서 다른 곳으로 보내는 모든 패킷은 FORWARD chain을
통과한다 . 이 세개의 각 chain 마다 각각 해당하는 rule 이 있고 이를 이용하
여 패킷을 선택적으로 제어할수 있는것이다.
Iptables가 작동하는 방식은 이들 각각의 INPUT, OUTPUT, FORWARD chain에 당신
이 어떠한 rule을 세우는 지에 따라 달라진다. 예를 들어 당신이 HTML 페이지를
요청하기 위해 www.yahoo.com에 패킷을 보낸다면 이 패킷은 우선 당신 컴퓨터의
OUTPUT chain을 통과하게 된다.
그러면 kernel에서 OUTPUT chain의 rule을 확인하고 rule과 match가 되는지 확인을
하게된다. rule중에서최초로 match되는 것에 의해 당신이보낸 패킷의 운명이 결정
되는 것이다. 만약 어떤 rule과도 match되지 않는다면 전체 chain의 정책이
ACCEPT냐 DROP이냐에 따라 패킷의 운명이결정될 것이다. 그러고 나서 Yahoo! 에서
응답하는 패킷은 당신의 INPUT chain을 통과하게 될 것이다.
IP 주소 막기
이제 기초적인 개념에 대해서 알아봤으니 실제로 사용해 보도록 하겠다.
Iptable을 사용할 때에는 기억해야 할 많은 옵션들이 있으므로 man 페이지
(man iptables)를 잘 활용하는 것이 중요하다. 이제 특정 IP를 조종하는 법에
대해서 알아보자. 우선 당신이 200.200.200.1 이라는 IP로부터 오는 모든 패킷을
막고 싶어한다고 가정하자. 우선 -s 옵션이 사용되는데 여기에서 source IP나
DNS name을 지칭할 수 있다.
그러므로 다음과 같이 함으로써 이 IP를 지칭할 수 있다.
./iptables -s 200.200.200.1
하지만 위처럼만 명령을 내리면 kernel은 위의 주소에서 오는 패킷을 어떻게
처리해야 할 지를 알 수가 없다. 그러므로 -j 옵션으로 그 패킷을 어떻게 처리
해야 하는지 결정해야 한다. 일반적으로 3가지 옵션이 있는데 ACCEPT, DENY,
DROP이다.
ACCEPT는 대충 예상할 수 있듯이 패킷을 허용하는 옵션이다.
DENY 옵션은 컴퓨터가 연결을 허용하지 않는다고 메시지를 돌려 보내는 옵션이다.
그리고 DROP 옵션은 패킷을 완전히 무시해 버린다. 만약 우리가 이IP에 대해
확실히 의심이 간다면 우리는 DENY 대신에 DROP을 사용해야 할 것이다.
그러므로 결과적으론 다음과같이 옵션을 주면 된다.
./iptables -s 200.200.200.1 -j DROP
하지만 이 명령만으로는 아직 컴퓨터가 명령을 이해할 수가 없다.
우리는 한가지를 더 추가해야 되는데 바로 어떤 chain의 rule로 적용시킬지
결정해야 하는 것이다. 여러분은 -A 옵션을 사용해서 이를 결정할 수 있다.
즉 아까 위에서 본 INPUT, OUTPUT, FORWARD 옵션 중에서 하나를 선택해야 하는
것이다. 이 옵션을 줌으로써 당신이 선택한 chain의 맨 아래부분에 새로운
rule이 추가될 것이다. 따라서 우리는 우리에게 들어오는 패킷을 차단하고
싶으므로 INPUT 옵션을 주면 되는 것이다. 그러므로 전체 명령은 다음과 같다.
./iptables -A INPUT -s 200.200.200.1 -j DROP
이 한 줄의 명령으로 200.200.200.1로부터 오는 모든 패킷을 무시할 수 있다.
옵션의 순서는 바뀌어도 상관이 없다. 즉 -j DROP이 -s 200.200.200.1 보다 앞에
가도 상관이 없다. 만약 그 반대로 200.200.200.1로 패킷이 못가도록 하려면
INPUT 대신에 OUTPUT을, -s 대신에 -d(destination) 옵션을 주면된다.
만약 우리가 해당 컴퓨터로부터 telnet 요청만 무시하고싶다면 어떻게 해야
하는가? 이것도 그다지 어렵지않다. 일단 큰 범주로 나누어 봤을 때 적어도
3가지의 프로토콜 – TCP, UDP, ICMP – 가 있다. 다른 대부분의서비스와 마찬
가지로 telnet은 TCP 프로토콜로 작동한다. -p 옵션으로 우리는 프로토콜을
결정할 수 있다. 하지만 TCP라고만 옵션을 줘서는 컴퓨터가 인식하지를 못한다.
telnet은 TCP프로토콜로 작동하는 특정 서비스에 불과하기 때문이다.
우선 우리가 프로토콜을 TCP로 설정한 다음에는 –destination-port 옵션으로
해당하는 port를 설정해 줘야한다.
우선 telnet의 포트번호는 23번이다. 포트번호 대신에 telnet이라 써도 상관없다.
여기서 source port 와 destination port를 혼동하면 안된다.
즉 클라이언트는 어떤 포트로도 작동할 수 있는 반면에 서버는 23번 포트로
작동하기 때문이다. 즉 특정 서비스를 차단하기 위해서는 -destination-port를
이용하면 되고, 그 반대는 -source-port를 이용하면 된다.
이제 이들 옵션을 합쳐서 아래와 같이 명령을 주면 된다.
iptables -A INPUT -s 200.200.200.1 -p tcp –destination-port telnet -j DROP
그리고 IP의 영역을 선택하고 싶다면 200.200.200.0/24 와 같이 설정하면 된다.
이것은 200.200.200.* 에 해당하는 모든 IP를 선택하는 것과 같다.
선택적인 차단
이제 좀더 심화된 내용에 대해서 알아보자.
우선 여러분의 컴퓨터가 local area network(LAN)에 있고,Internet에 접속
가능하다고 가정한다. 알다시피 LAN은 eth0으로 Internet 연결은 ppp0으로
구분할 수 있다. 이제 다시 다음과 같이 가정해 보자. 우리는 telnet 서비스를
LAN상의 컴퓨터에게는 서비스하고 보안상Internet상에서는 접근하지 못하도록
하고 싶다. 이것 역시 쉽게 구성할 수 있다. 우리는 input interface에 대해서는
-i 옵션을 output interface에 대해서는 -o 옵션을 사용할 수 있다.
즉 다음처럼 명령을 주면 된다.
iptables -A INPUT -p tcp –destination-port telnet -i ppp0 -j DROP
이렇게 함으로써 우리는 LAN상의 사용자는 telnet을 사용하고 그밖에 Internet
상의 사용자는 telnet 을 사용하지 못하도록 할 수 있다.
Rule 순서에 관하여
이제 다음 단계로 들어가기에 앞서서 rule을 조종하는 다른 방법에 대해서
간단히 알아보자. Iptables의 chain에서는 먼저 등록 된 rule이 효력을 발생
하기때문에 등록을 하는 순서가 중요하다. 모든 것을 거부하는 설정이 먼저오게
되면 그 이후에 포트를 열어주는 설정이 와도 효과가 없다.
그러므로 허용하는 정책이 먼저오고 나서 거부하는 정책이 와야한다.
-A 옵션을 줌으로써 우리는 새로운 규칙을 chain의 맨 아래에 추가하게 된다.
즉 chain상의 상위 rule이 먼저 작동하기 때문에, 만일 새로 추가하는 rule을
먼저 작동시키기 위해서는 -I 옵션을 줌으로써 새로운 rule을 원하는 위치에
놓을 수 있다. 예를 들어 INPUT chain의 가장 위에 어떤 rule을 놓고 싶다면
“-I INPUT 1”이라 명령하면 된다. 그리고 다른 위치로 놓고 싶다면 1을 다른
숫자로 바꿔주면 된다.
그리고 이미 위치된 rule을 다른 위치로 바꾸고 싶다면 -R 옵션을 주면 된다.
-I 옵션을 주는 것과 마찬가지로사용할 수 있는데 다만 -I옵션을 사용해서 1의
위치에 놓으면 다른 rule들이 밑으로 한칸씩 내려가는 반면-R옵션을 사용해서
1의 위치에 놓으면 그 위치의 rule은 삭제된다.
그리고 끝으로 rule을 삭제하고 싶다면 -D옵션과 숫자를 사용하면 되고, -L
옵션을 사용하면 작성된 모든 rule의 목록을 보여주고, -F 옵션을 주면 해당
chain의 모든 rule을 삭제한다. 그리고 만약 chain을 명시하지않았다면 모든
것을 flush할 것이다.
좀더 심화된 내용에 대해서 알아보자. 우선 패킷들은 특정 프로토콜을 사용한다.
그리고 프로토콜이 TCP라면 역시 특정 port를 사용한다.
그러므로 여러분 컴퓨터의 모든 포트를 막음으로써 보안을 할 수 있을 것이다.
하지만 당신이 다른 컴퓨터에 패킷을 보내면 그 컴퓨터는 당신에게 다시 응답을
해야한다. 그러므로 만약 당신에게 들어오는 모든 포트를 막아버린다면 당신에게
응답하는 패킷도 결국 못 들어오므로 connection을하는 의미가 없을 것이다.
하지만 다른 방법이 있다. 두 컴퓨터가 TCP connection으로 패킷을 주고 받는다면
그 connection은 우선 초기화가 되어야 한다.
이것은 바로 SYN packet이 담당한다. SYN packet은 단순히 다른 컴퓨터에게 주고
받을 준비가 되었다는것만 알려주는 초기화 기능만을 한다.
이제 서비스를 요청하는 컴퓨터는 우선적으로 SYN packet을 보낸다는것을 알게
되었다. 그러므로 들어오는 SYN packet만 막기만 하면 다른 컴퓨터가 당신 컴퓨터
의 서비스를이용하지 못하게 할 수 있고, 하지만 당신은 그들과 통신할 수 있는
것이다.
즉 이와 같이 하면 당신이 먼저 패킷을 보내서 요청이 들어오는 것이 아니면 모두
무시해 버리게 된다. 이 옵션을 사용하기 위해서는 선택한 프로토콜 뒤에 –syn
이라고 명령을 넣으면 된다. 이제 인터넷으로부터오는 모든 연결을 막기위해서는
다음과 같이 rule을 정하면 된다.
iptables -A INPUT -i ppp0 -p tcp –syn -j DROP
당신이 만약 웹 서비스를 운영하는 것이 아니라면 이것은 유용한 rule이 될
것이다.
만약 당신이 웹서비스를 위해 하나의 포트(예를들어 80번-HTTP)만 열어두고
싶다면 역시 한가지 방법이있다.
바로 “!” 마크를 사용하면 되는데 많은 프로그래밍 언어에서처럼 “!”은
“not”을 의미한다.
예를들어 80번 포트만 제외하고 모든 SYN packet들을 막고싶다면 다음과 같이
하면 된다.
iptables -A INPUT -i ppp0 -p tcp –syn –destination-port ! 80 -j DROP
다소 복잡한듯해도 간단한 rule이다.
Chain 정책
마지막으로 한가지 남은 것이 있다. 이것은 chain의 정책을 바꾸는 것으로
INPUT과 OUTPUT chain은 디폴트로 ACCEPT로 정해져 있고, FORWARD chain은
DENY로 정해져 있다.
만약 당신의 컴퓨터를 라우터로 사용하려면 당신은 FORWARD chain의 정책을
ACCEPT로 설정하고 싶을 것이다.
이럴때 어떻게 해야하는가? 이것은 매우 간단하다.
-P 옵션을 사용하면 된다. 즉 FORWARD chain을 ACCEPT로 정하기 위해선 다음
과 같이 명령을 내리면 된다.
iptables -P FORWARD ACCEPT
이번 시간에는 Iptables의 기초만을 알아보았다. 여기 있는 정보를 통해서
당신은 기본적인 firewall을 설정할수 있을 것이다.
하지만 아직 많은 것들이 남아있다. 더 많은 옵션에 대해서 알아보기 위해서
man 페이지를활용하기 바라고 Iptables에 관련된 심화된 문서들을 참고하기
바란다.
Reference Site
http://kldp.org/Translations/html/Packet_Filtering-KLDP/
Packet_Filtering-KLDP-7.html
http://linux.com/enhance/newsitem.phtml?sid=125&aid=12431
http://chongnux.klug.or.kr/board/read.php?table=tip1&no=326
http://linux.co.kr/tips/se.html?keyword=iptables