1. 패킷필터링이란? (역할과 목적)


패킷 필터링이란 지나가는 패킷의 Header를 살펴보고 그 전체 패킷의 운명을 결정하는 소프트웨어의 일부이다. 이것은 패킷을 ‘DROP(즉, 마치 전혀 전달되지도 않았던 것처럼 패킷을 거부)’하던가, ‘ACCEPT(즉, 패킷이 지나가도록 내버려둠)’를 하던가 또는 다른 더욱 복잡한 무엇을 할 것인가를 결정하는 것이다. 주요 사용 목적은 패킷의 제어와 보안이다. 패킷을 제어함으로써 자신이 원하는 것만을 외부 네트워크에 공개할 수 있고 또 자신이 허용하는 것만을 내부 네트워크 사용자에게 전해줄 수 있다. 이렇게 함으로써 허가되지 않은 정보가 외부로 누출되는 것을 막을 수 있으며, 외부에서 내부로 크래킹을 시도하는 것을 막을 수 있게 된다.


2. 사용하기 위해서 준비해야 할 것들


패킷 필터링을 하기 위해서 준배해야 할 것은 리눅스 커널(2.4.x)와 iptables이다. 다음의 사이트에서 소스를 얻을 수 있다.

리눅스 커널(linux kernel) ftp://ftp.kernel.org, ftp://ftp.kr.kerenl.org

iptables : http://www.netfilter.org, http://netfilter.samba.org

일단 소스를 확보하면 해야할 일은 2가지이다. 하나는 바로 커널 컴파일, 다른하나는 iptables 설치이다. 커널 컴파일과 관련된 사항은 Kernel Compile Guide를 참고하여 주기를 바란다. iptables의 설치와 관련된 상세한 설명은 소스 파일과 함께 제공되는 INSTALL 문서를 참고하길 바란다. 간략하게 요약하자면 다음과 같은 명령를 실행시킴으로써 iptables를 설치할 수 있다.


[root@ulug iptables-1.2.5]# make pending-patches

[root@ulug iptables-1.2.5]# make

[root@ulug iptables-1.2.5]# make install


'KERNEL_DIR'은 현재의 커널 소스가 있는 위치를 가리키는 것으로 일반적으로 커널은 '/usr/src/linux'란 디렉토리에 존재한다. Makefile에 default값으로 '/usr/src/linux'란 값이 주어져 있기 때문에 별도로 KERNEL_DIR을 설정해 줄 필요가 없다.

‘make pending-patches'는 커널에 미쳐 적용되어 있지 않은 최신 패치를 적용하는 것으로 커널별로 적용되는 범위가 다르며, 이미 패치된 커널일 경우에는 ’Already applied'라고 표시된다. 설치할 iptables보다 최근에 나온 커널이 아니라면 패치를 하는 것이 좋으며, 권장사항이다. ‘y'는 적용, ’t'는 적용이 정상적으로 되었는지를 테스트, ‘f'는 강제로 적용, ’q'는 종료를 뜻한다. ‘make'와 ’make install'은 소스를 컴파일하고 binary로 실행가능하게 생성된 파일을 해당 디렉토리에 설치한다. 기본 디렉토리는 /usr/local이며, Makefile을 수정하거나 make시 'BINDIR', 'LIBDIR', 'MANDIR'과 같이 환경변수를 설정해줌으로써 변경가능하다. 최근 Windows 서버를 공격하는 Nimda와 같은 악성 바이러스들이 극성이며, 이러한 바이러스는 Windows 서버에게만 피해를 입히는 것이 아니라 Linux 서버에도 불필요한 LOG 파일을 남김으로써 피해(?)를 주고 있다. 이러한 피해의 해결책으로 자주 거론되는 것이 바로 iptables의 확장 기능들 중에 하나인 string match filtering으로 이것은 일반적인 설치와 달리 별도의 패치를 적용시켜 주어야 한다. 시험적인 기능들을 패치하는 방법은 아래와 같으며, 'pending-patches'와 마찬가지로 적용시켜주면 된다. 이때 자신에게 필요한 패치만을 적용하는 것이 좋으며, 모두를 적용하는 것은 Netfilter측에서도 권하지 않고 있다.


[root@ulug iptables-1.2.5]# make patch-o-matic


3. 패킷필터링의 원리(구조)


iptables의 패킷 필터링의 원리는 이전 버전의 ipchains와는 약간 다른 구조를 가지고 있다. 모든 체인들이 소문자에서 대문자로 변경되었고, INPUT 체인의 경우 그 위치가 모든 체인들이 앞에서 존재하던 구조에서 routing이후로 구조를 변경하였다. 따라서 ipchains를 사용하던 사용자는 정책을 세울때 이러한 점을 고려해서 작성해야 할 것이다. NAT와 관련된 사항은 관련문서(리눅스 2.4 NAT HOWTO)를 참조하기 바라며, 여기서는 패킷 필터링에 대해서만 언급한다.iptables는 INPUT, OUTPUT, FORWARD라는 3개의 내장 체인을 가지고 있으며, 이 체인이라는 것은 규칙의 점검표이다. 각 규칙은 ‘패킷의 헤더를 비교하여 이렇게 되어있으면 이곳에서 무엇을 하라’라는 형태로 되어 있다. 각 규칙에 대해서 패킷을 비교하고 그에 해당하지 않는 패킷은 체인의 기본 정책을 따르게 된다. (일반적인 기본 체인의 정책은 ACCEPT이다.)


iptables에서 패킷이 순회하는 과정은 다음과 같다.

1. 패킷의 checksum을 점검한다.

2. 목적지가 자신이라면 ‘INPUT' 체인으로 이동하게 되고, 이 패킷을 기다리고 있는 프로세스에게 전달된다.

3. 만약 목적지가 자신의 것이 아니라면 2가지 행동을 하게 된다. FORWARD가 허용이 된다면 FORWARD 체인으로 이동하게 되고, 허용되어 있지 않다면 DROP을 하게 된다. 그리고 허용된 패킷의 경우 FORWARD 정책에 따라 그 운명이 결정된다.

4. 내부 프로세서에 의해서 바깥으로 나가는 패킷들은 OUTPUT 체인에 보내지며 규칙과 일치해야만 외부로 나갈 수 있다.


4. 일반적인 사용법


ㄱ. COMMANDS

-A(--append) : 지정된 체인의 끝에 하나 또는 그 이상의 규칙을 첨가

-D(--delete) : 규칙 내용과 일치하는 특정 체인에서 하나 또는 그 이상의 규칙을 삭제

-R(--replace) : 선택된 체인에서 규칙을 교체

-I(--insert) : 지정된 체인의 시작에 하나 또는 그 이상의 정책을 삽입

-L(--list) : 선택된 체인에서 모든 정책의 목록을 출력

-F(--flush) : 지정한 체인 내의 규칙들을 삭제

-Z(--zero) : 모든 체인의 byte와 packet 카운터를 0으로 초기화

-N(--new-chain) : 새로운 사용자 정의 체인을 만든다.

-X(--delete-chain) : 지정한 사용자 정의 체인을 삭제한다.

-P(--policy) : 지정된 체인의 정책을 세운다.

-E(--rename-chain) : 체인의 이름을 변경한다.

-h : 도움말을 출력 (아주 유용하다)


ㄴ. Rule specification parameters

-p [!]proto(col) protocol : 점검할 패킷 또는 정책에 대한 프로토콜 정의

ex) tcp, udp, icmp, all

-s(--source) [!] address[/mask] : 근원지 정의

-d(--destination) [!] address[/mask] : 목적지 정의

-j(--jump) target : 지정된 target으로 이동

-i(--in-interface) [!] name[+] : 패킷을 받는 인터페이스(eth0, ppp0)의 이름('+'는 와일드 카드)

-o(--out-interface) [!] name[+] : 패킷이 나가는 인터페이스의 이름 [!] -f(--fragment) : 두 번째 이후의 패킷에 대한 규칙을 설정

-c(--set-counters) PKTS BYTES : 규칙의 패킷과 byte를 초기화


ㄷ. OTHER OPTIONS

-v(--verbose) : 상세 정보를 출력

-n(--numeric) : 호스트 이름이나 포트 이름 대신 숫자로 출력

-x(--exact) : 패킷과 바이트 카운터의 값을 단위(K,M,G)로 보여주지 않고 전체 숫자로 출력

--line-numbers : 규칙을 출력시 각 정책의 시작 부분에 라인 넘버를 추가

--modeprobe=<command> : 체인에 규칙을 삽입할 때, 필요한 모듈을 올릴 수 있음


ㄹ. MATCH 확장

a. TCP : ‘--protocol tcp‘로 지정되면 적용된다.

--sport(--source-port) [!] [port[:port]] : 패킷이 들어 오는 tcp 포트 또는 포트 범위를 설정

--dport(--destination-port) [!] [port[:port]] : 패킷이 나가는 tcp 포트 또는 포트 범위를 설정

--tcp-flags [!] mask comp : mask에서 지정한 TCP flag가 있을 때 comp와 대응시킨다.

※참고 : 유효한 TCP flag : SYN,ASK,FIN,RST,URG,PSH,ALL,NONE

[!] --syn : --tcp-flags SYN,RST,ACK SYN의 약어

--tcp-option [!] number : TCP 옵션과 일치할 경우 패킷을 검사한다.


b. UDP

: '--protocol udp'로 지정되면 적용된다.

--sport(--source-port) [!] [port[:port]] : 근원지의 포트 또는 포트 범위를 지정

--dport(--destination-port) [!] [port[:port]] : 목적지의 포트 또는 포트 범위를 지정


c. ICMP

: ‘--protocol icmp'로 지정되면 적용된다.

--icmp-type [!] typename : 지정된 ICMP 형태를 허용한다.


d. mac

: 근원지 MAC 주소를 검사하며, PREROUTING, FORWARD 또는 INPUT체인에서만 유효하다.

--mac-source [!] address : 콜론(:)으로 구분된 16진수의 이더넷 주소를 지정


e. limit

: 적용 검사의 속도를 제한하는데 사용되며, 이 확장을 사용하는 규칙은 limit에 적용된 숫자만큼만 검사하게 된다.

--limit rate : 초당 평균 최대 적용 검사수(rate)를 지정하며, 시간 단위를 지정할 수 있다. (/second,/minute,/hour,/day, default : 3/hour)

--limit-burst number : 일치하는 패킷의 최대 수 (default는 5)


f. multiport

: 근원지와 목적지의 포트를 무더기로 설정할 수 있다. 최대 15개의 포트까지 설정 가능하며, tcp, udp 연결시에만 사용 가능하다.

--source-port [port[,port]] : 근원지 포트들을 설정

--destination-port [port[,port]] : 목적지 포트들을 설정

--port [port[,port]] : 근원지와 목적지 포트가 동일하게 설정하거나 한가지만 설정


g. owner

: 지역 프로세스에 의해서 발생한 패킷의 생성자(유저)의 다양한 특징들을 적용

--uid-owner userid : 지정된 사용자에 의해서 발생한 프로세스에서 생성된 패킷인지를 검사

--gid-owner groupid : 지정된 그룹에 의해서 발생한 프로세스에 의해서 생성된 패킷인지를 검사

--pid-owner processid : 지정한 프로세스에 의해서 발생한 프로세스에 의해서 생성된 패킷인지를 검사

--sid-owner sessionid : 지정한 세션 그룹에 의해서 발생한 프로세스에 의해서 생성된 패킷인지를 검사


h. state

: ‘ip_conntrack' 모듈의 접속 추적 분석(connection-tracking analysis)을 해석한다.

--state state : 설정 가능한 state 값은 NEW(새로운 접속을 만드는 패킷), ESTABLISHED(접속과 관련되어 있는 패킷),RELATED(FTP 송신과 ICMP와 같이 이미 성립한 접속과 연관되어 새로운 접속을 시작하는 패킷)가 존재한다.


ㅁ. TARGET 확장

a. LOG : 일치하는 패킷의 커널 로그를 제공

--log-level level : 레벨 숫자나 이름을 적음 (자세한 사항은 syslog(5)의 man 페이지를 참고)

--log-prefix prefix : 로그 시작 부분에 prefix의 내용을 첨가하게 된다. 29자까지 가능하다.

--log-tcp-sequence : TCP sequence 넘버를 로그에 기록한다. 만약 사용자들이 로그를 읽을 수 있을 경우 보안의 위협을 받게 된다.

--log-tcp-options : TCP 패킷 헤더의 option들을 로그에 남긴다.

--log-ip-options : IP 패킷 헤더의 option들을 로그에 남긴다.


b. REJECT : ‘DROP'과 동일한 작용을 하며, 상대편 호스트에 'port unreachable'이란 에러 메시지를 ICMP로 보내게 된다.

--reject-with type : 응답 패킷에 대한 변경을 할 수 있다. icmp-netunreachable, icmp-port-unreachable, icmp-

proto-unreachable, icmp-net-prpohibited 또는 icmp-host-prohibited, echo-reply, tcp-reset과 같은 값을 설정할 수 있다.



'IT > CISCO' 카테고리의 다른 글

Linux에서 router 설치 및 운영 방법  (0) 2017.02.15
리눅스  (0) 2017.02.14
네트워크 기초와 패킷 필터링  (0) 2017.02.12
RIP (Routing Information Protocol)  (0) 2017.02.11
QoS(Quality of Service)  (0) 2017.02.11

+ Recent posts