컴퓨터 공부/리눅스

[리눅스] iptables란

나정_ 2013. 6. 26. 15:38

iptables에 대하여 배워보자 !


요즘 필자는 Ubuntu 서버를 하나 설치해보면서 이것저것 해보고 싶은 것들을 건드려 보는 중인데 생각보다 재밌어서 이것저것 실험해보고 있다. 그러다 오늘 실험해본 iptable에 대하여 정리해보도록 하겟다. 


1. iptable 정의


iptables은 강력한 패킷필터링 툴 중 하나로 방화벽을 설정할 때 사용되는 패킷이다. 

여기서 잠깐 패킷필터링에 대하여 설명하고 넘어가면 패킷필터링은 지나가는 패킷의 해더를 보고 그 전체 패킷의 차단여부를 결정하는 것을 의미한다. (iptable 경우에는 헤더에서 그치지 않고 data의 내용까지 검토하는 string match 기능이 있다. )


* 패킷 : 헤더와 데이터를 묶어논 것을 패킷이라고 한다. 헤더에는 출발지 ip, 도착지 ip, checksum, 프로토콜 옵셋 등을 가지며 데이터에는 전송 데이터 정보가 들어간다


그렇다면 iptables이 패킷을 필터링하는 것일까? 


그렇지 않다. 


실제로 netfilter라는 커널에 탑제된 기능으로 패킷을 필터링하며 iptable은 netfilter에게 룰을 세워주는 것이다. 

간단하게 말하자면 iptable은 방화벽 룰을 구축해주는 패키지라고 할 수가 있다. 


2. iptables 설치 


모든 리눅스가 그렇듯 설치는 간단하다. 

아래와 같이 iptables를 install해주면 된다. 


sudo apt-get iptables



2. iptables 내부구성 


iptable 기본 chain은 아래와 같다. 


iptables -L 







input chain : 로컬 시스템을 목적지로 하는 패킷이 로컬 소켓과 통신할 수 있는지 여부를 결정하는 iptable 구성소 


지금 현재 룰을 정의 하지 않아 아무 것도 없지만 (policy Accept) 줄 밑에이는 내가 세운 룰의 정보를 볼 수 있다. 
기본적으로 기본 정책(policy)에 따라 패킷의 운명을 결정하게 된다.만약 내가 특정 아이피를 차단헀을 경우 아래와 같이 차단된 아이피 정보가 나열된다. 




3. iptables 읽는 방법  


참고 : https://help.ubuntu.com/community/IptablesHowTo


위 사이트를 참고하였으며 다른 타 사이트 및 서적을 보고 정리하였다.  

먼저 옵션을 설명하기 전에 자주 쓰이는 방화벽 설정 및 제거 구문에 대하여 보고 넘어가자 


예를 들어보자 


iptables -A INPUT -j DROP 


위 룰을 풀어서 해석하자면 

iptables : iptable에 

-A INPUT: 패킷에 들어오는 체인에 룰을 추가한다. 

-J : 패킷의 운명을 결정한다. 

DROP : 패킷을 버려라 ( 자동으로 패킷을 무시하고 chaind의 규칙을 무시해라   ) 


정리하자면 패킷에 들어오는 체인을 버리라는 룰을 iptables에 추가한것이다. 


아직 이해가 덜됬다면 한번 더 해보자 


iptables -D INPUT 1  == iptables -D INPUT -j DROP 


Iptables -D INPUT -j DROP 

iptables -D INPUT 1 


두개의 룰이 있다 


먼저 


Iptables -D INPUT -j DROP 

iptables : iptable에 

-D INPUT : 패킷의 룰을 제거해라 

-J : 패킷의 운명을 결정한다. 

DROP: 패킷을 버려라  


정리하자면 iptable에 있는 패킷을 버리라를 운명을 가진 룰을 제거해라라는 의미이다. 

두번째는 룰 순서로 제거하는 방식인데 -j DROP 대신에 룰을 넣엇던 순서를 입력하면 그 룰이 삭제된다. 


생각보다 간단한 것같다. 


이번엔 옵션값들에 대하여 설명해보자 


먼저 iptables -A INPUT -j DROP 에서 -A위치에 있는 옵션들을 정리해보자 


 옵션

설명 

 -A

룰을 추가한다. 

 -L

여러체인의 규칙나열을 나열한다. 

 -R

 패킷을 교환한다.  

  -D

 chain의 어떤 지점을 제거한다

 -N

새로운 체인을 만든다.( 직접체인을 만들었을 경우 ) 

 -X

 체인을 제거한다. ( 직접 체인을 만들었을 경우 )   


추가적으로 더있는데 잘 이해가 되지않아 일단 생략한다.. 


4. 자주 쓰이는 iptable 기능


ㄱ. 패킷 출처(input)제어 


패킷 출처(input) 를 제어할 때 사용하는 옵션은 -s이다 . 


iptables -A INPUT -s 192.168.10.10 -j DROP 


위와 같은 명령을 내렸다면 192.168.10.10으로 부터 온 패킷을 모두 버려지게된다. 


ㄴ. 패킷 목적지(output)제어


패킷 목적지(output) 를 제어할 때 사용하는 옵션은 -d이다 . 


iptables -A INPUT -d 192.168.10.10 -j DROP


위와 같은 명령을 내렸다면 192.168.10.10DD의 IP를 도착지로 가지고 가는 패킷을 모두 버려지게 된다. 


* -s,-d 모두 도메인으로도 제어가 가능하며 !(not)의 개념도 존재한다. 

ex) !192.168.10.10


ㄷ.프로토콜 제어 

프로토콜을 제어하는 옵션은 -p이며 옵션의 인자는 TCP, UDP,ICMP 등이 될 수 잇다.. 


iptables -a INPUT -p TCP -j ACCEPT 


위같은 명령으로 TCP 프로토콜을 쓰는 모든 패킷은 ACCEPT에의해 허락된다. 



ㄹ. 포트 제어 


포트를 제어하는 옵션은 --sport와 --dport이다. 

-sport : 패킷의 출발지 포트 

-dport : 패킷의 도착지 포트 


iptable -A INPUT -p TCP --dport 80 -j DROP 


위명령으로 TCP프로토콜의 80번 포트를 목적지로 하는 패킷을 버린다. 

만약 여러개로 지정하고 싶다면 80:8080과 같이 지정할 수 있다. 이말은 80부터 8080까지라는 의미이다. 


ㅁ. 인터페이스 지정 


인터페이스는 -i, -o로 지정할 수 있다. 

- i : input 인터페이스 

-o : output 인터페이스 


iptables -A INPUT -i eth0 -p TCP --dport 80 -j DROP


위명령으로 eth0으로 들어오고 TCP프로토콜의 80번 포트를 목적으로하는 모든 패킷을 버린다. 

eth0, eth1 등 2개 이상의 인터페이스가 인터넷과 연결되어있을 때 유용하다.

참고로 input chain은 -i 옵션만 output은 -o 옵션만 사용가능하다. 

추가적인 기능은 다음편에서 정리하도록 하겠다.