'넷필터'에 해당되는 글 1건

블로그 정리중 글옮김 (2009년 3월 26일 글)

 

1.Packet Filtering
Packet Filtering은 네트워크상의 특정 호스트나 라우터를 지나가는 패킷의 헤더를 보고 전체 패킷의 폐기나 사용에 관한 것을 결정하는 것을 말합니다. Packet Filtering은 패킷을 'DROP'시키거나, 'ACCEPT'시키거나 ‘DENY'할 것인가를 결정합니다. 여기에서 말하는 DROP, ACCEPT, DENY의 뜻은 다음과 같습니다.

DROP : 패킷에 대한 어떠한 정보도 되돌려 주지 않고 폐기 해버리는 것입니다.
DENY : DROP처럼 패킷을 폐기 하기는 하지만, 폐기된다는 것을 송신 측에 전달합니다.
ACCEPT : 위에서 설명한 DROP이나 DENY와는 다르게 패킷을 수용하는 것입니다.

리눅스에서는 패킷 필터링이 리눅스 커널 내부에 구성됩니다. 커널을 재구성할 때 netfilter에 관련된 옵션들을 설정해주면 패킷 필터링을 위한 환경이 마련됩니다. 우리가 사용하게 될 iptables는 리눅스 커널의 모듈로서 동작하게 됩니다.

2. Packet Filtering의 이유
패킷을 필터링 하는 이유는 여러 가지가 있을 수 있겠지만, 크게 그 이유를 정해본다면, 네트워크의 제어와 보안 그리고 감시가 그 이유가 될 수 있습니다. 여기서 말하는 제어,보안,감시에 대해서 좀 더 자세히 살펴보도록 하겠습니다.

먼저 네트워크 제어라는 것은, 내부 네트워크에서 다른 네트워크로 또는 외부 네트워크에서 내부 네트워크로 접속을 하고자 했을 때 어떤 형태의 접속은 가능하게 하고 또 다른 형태의 접속은 불가능하게 해야 될 때가 있습니다. 간단한 예를 들어 보면, 인터넷을 사용하다 보면 불필요한 광고나 유해한 것들이 우리들을 짜증나게 만들거나 때로는 시스템의 자원을 낭비하게 만들 때가 있습니다. 그런 경우에 특정 사이트나 주소에서 전송되어 오는 패킷을 거부하도록 패킷 필터링을 설정 해두면 더 이상 그런 광고들로부터의 스트레스는 받지 않아도 될 것 입니다. 이것이 네트워크 제어라고 볼 수 있습니다.

그리고 네트워크 보안이라는 것은, 말 그대로 네트워크 보안입니다. 커다란 네트워크에서 자신의 네트워크를 허용되지 않은 침입이나 공격으로부터 네트워크를 보호하거나, 자신의 네트워크에서 외부로 정보가 유출되는 것을 막는 것을 말합니다.  예를 들어 보면, DOS공격과 같은 특정 네트워크를  향한 공격을 패킷 필터링을 통하여 해결 할 수 있습니다. 물론 완벽한 보안은 불가능 하겠지만, 패킷 필터링을 함으로 해서 보안위협에서 조금이나마 안전해 질 수 있습니다.

네트워크 감시는 위에서 언급한 제어나 보안에 포함 됩니다. 네트워크의 설정이 잘못 되거나 잘못된 패킷이 전달 될 경우에는 패킷 필터링을 통해 그 네트워크를 감시하고 잘못된 패킷에 대한 정보를 알 수 있습니다. 예를 들어서, 잘못된 설정의 네트워크가 쏟아내는 정보들이 네트워크 자원을 독점하게 되거나 트랙픽을 증가시키게 되면 네트워크가 마비 될 수도 있습니다. 그러한 것을 미리 미리 살펴보고 감시를 통해서 이런 것들을 방지할 수 있습니다.

3. 리눅스에서 Packet Filtering 방법
리눅스는 커널버전 1.1부터 패킷 필터링을 포함하기 해서 커널 버전 2.2에서는 ipchains, 그리고 지금 많이 사용되고 있는 2.4버전에서는 iptables이 있습니다.

패킷 필터링을 위해서는 netfilter를 포함하고 있는 커널이 필요합니다. netfilter라는 것은 iptables와 같은 프로그램이 모듈로 작동할 수 있도록 해주는 것입니다.  netfilter는 2.3.15 이상의 리눅스 커널에 들어있으며 커널 설정에서 CONFIG_NETFILTER을 설정 해주어야 됩니다. 즉,netfilter 관련 항목을 설정해주면 됩니다. iptables라는 프로그램은 커널에게 어떤 패킷을 필터링할 것인지에 대해서 알려줍니다. 그러면 커널이 정해진 규칙에 따라서 패킷을 필터링 하게 됩니다.

4. iptables를 이용한 패킷 필터링 방법
iptables를 사용하는 커널은 'filter',''nat','mangle' 세 개의 테이블을 가지고 있습니다. 특별한 지정이 없이 iptables를 사용하면 filter 테이블을 기본적으로 사용하게 됩니다. 여기서 말하는 세 개의 테이블은 각각 다음과 같은 것을 담당합니다.

filter : 패킷 필터링 관련 테이블
nat : 목적지나 출발지 정보를 변경관련 테이블
mangle : 패킷의 특성을 변경하거나 지정하는 것에 관련된 테이블(TTL,TOS)

filter 테이블에는 필터링 때 사용되는 세 개의 체인 INPUT, OUTPUT, FORWARD 가 존재 합니다. 여기서 말하는 체인이라는 것은, 패킷의 이동경로를 말합니다. 이 체인에는 패킷을 필터링 하는 규칙들이 지정되게 되는데, 그 것을 룰(rule)이라고 합니다. 이 룰에 따라 패킷을 필터링 하게 됩니다.

리눅스의 iptables는 다른 사용에 관한 문서가 필요 없을 만큼의 자세한 메뉴얼 페이지를 제공합니다. man iptables 해보시면 자세한 매뉴얼을 보실 수 있습니다.

iptables는 모듈로 되어있을 것입니다. 모듈은 iptable_filter.o 입니다. 모듈은 처음 iptables를 실행할 때 자동으로 로드 되는 것입니다. 리눅스가 커널을 재설정할 수 있는 특징이 있듯이 iptables의 모듈도 커널에 포함 시킬 수 있습니다. lsmod 해서 모듈 구성정보를 보시면 iptables관련 모듈들이 적재되어 있는 것을 보실 수 있습니다.

iptables 명령이 실행되기 전에는 기본적으로 만들어져있는 체인에는 아무런 규칙도 없는 빈 체인입니다. 간혹 특정 배포판 같은 경우에는 기본적으로 방화벽 옵션을 설정해두는 경우가 있습니다. 그때는 사용자가 수정해서 사용할 수 있습니다.

5.필터링 규칙
iptables의 규칙(rule)은 패킷이 일치되어야 할 상태를 설정하고, 일치되었을 때 어떤 작업(j)을 할 것인가를 나타냅니다. 예를 들어서, 로컬 호스트 127.0.0.1로부터의 모든 ICMP 패킷을 DROP하기 위해서는 target을  ICMP로 하고 소스 IP는 127.0.0.1이 됩니다. 그리고 해야 할 작업은 DROP입니다.

127.0.0.1 은 'loopback' 인터페이스라고 하는 것인데, 실재 네트워크 접속이 전혀 없더라도 이 아이피는 가지고 있습니다. ICMP 패킷은 'ping' 프로그램을 이용해서 생성할 수 습니다. (ping은 ICMP의 echo-request를 보내고 그 응답을 받습니다.)

다음의 예제를 보면서 살펴보도록 하겠습니다.
root@slug>#ping -c 1 127.0.0.1
PING 127.0.0.1 (127.0.0.1): 56 data bytes
64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.1 ms

--- 127.0.0.1 ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.2/0.2/0.2 ms

root@slug>#iptables -A INPUT -s 127.0.0.1 -p icmp -j DROP
root@slug>#ping -c 1 127.0.0.1
PING 127.0.0.1 (127.0.0.1): 56 data bytes

--- 127.0.0.1 ping statistics ---
1 packets transmitted, 0 packets received, 100% packet loss
root@slug>#_


위의 예제를 보면, 처음으 ping은 성공해서 손실이 없었습니다. 그러나 iptables에서 icmp패킷을 DROP하도록 설정한후에는 ping이 100% 손실했다고 보여줍니다. 여기서 -c 옵션은 하나의 패킷만 만들어 보내는 것입니다.

위에서 사용된 iptables의 명령어의 뜻은 다음과 같습니다.
iptables -A INPUT -s 127.0.0.1 -p icmp -j DROP
-->“filter table의 INPUT체인의 제일 마지막에 새로운 규칙을 추가하라. 그 추가하는 규칙은 출발지의 아이피가 127.0.0.1이고 그 프로토콜은 icmp(ping이 사용하는 프로토콜)이고, 그 프로토콜을 통해서 오는 모든 패킷은 DROP(폐기하고 그 폐기 정보를 보내지 않는다.”

후에 이 규칙을 제거해야 될 필요가 있다면 두 가지 방법으로 그 규칙을 제거 할 수 있습니다. 규칙을 제거하는 첫 번째 방법은, 입력체인에 있는 규칙의 순서를 보고 그 순서의 규칙을 제거하는 방법이 있습니다. 예를 들면 다음과 같습니다.
root@slug># iptables -D INPUT 1
--> filter table의 INPUT체인의 첫 번째 규칙을 제거하라.

두 번째 방법은 규칙을 추가할 때 사용한 -A 옵션을 그냥 -D로 바꿔주면 됩니다. 자신이 설정했던 규칙이 몇 번째인지 알 수 없을 때 사용합니다. 예를 들면 다음과 같습니다.
root@slug># iptables -D INPUT -s 127.0.0.1 -p icmp -j DROP

6. 필터링 지정 
① 출발지와 목적지
출발지(-s, --source)와 목적지(-d, --destination) IP 주소를 지정하는데 4가지 방법이 있습니다. 첫 번째 방법은  'slug.skku.ac.kr' 이나 'localhost' 와 같이 도메인 네임을 이용하는 것입니다. 두 번째 방법은 '127.0.0.1' 과 같이 IP 주소를 이용하는 것입니다. 세 번째와 네 번째 방법은 IP 주소의 네트워크를 지정하는 것으로 '192.168.1.2/24' 또는 '192.168.1.2/255.255.255.0'같은 형태입니다. 이 두가지 표현 방법들은 모두 192.168.1.0부터 192.168.1.255 사이의 모든 IP 주소를 지정하는 것입니다. '/' 다음의 숫자는 IP 주소의 어떤 부분까지가 의미 있는가를 나타내는 것입니다.

root@slug>#iptables -A INPUT -s 0/0 -j DROP
--> 0/0에서 오는 모든 패킷들을 DROP하라. 0/0은 모든 네트워크가 됩니다.

② 프로토콜의 지정
iptables에서는 특정 프로토콜을 '-p' 옵션을 사용하여 지정할 수 있습니다.

③ 인터페이스 장치 지정
인터페이스 장치는 두 가지가 있습니다. 그 둘은 ‘-i’와 ‘-o’가 있는데,'-i'('--in-interface')는 들어오는 인터페이스 장치를 말하는 것이고, '-o'('--out-interface')는 나가는 인터페이스 장치를 말합니다. 인터페이스 장치의 예로는 eth0과 같은 네트워크 인터페이스 카드 디바이스가 되겠습니다.

참고>인터페이스 장치 이름이 '+'로 끝나는 경우도 있는데, 이것은 지정한 이름으로 시작하는 모든 인터페이스 장치를 모두 지정할 때 사용됩니다.

⑤ 타겟 지정 
필터에 일치 하는 패킷을 어떻게 처리 할 것인지에 대해서 지정하는 것을 타겟 지정이라고 합니다. 타겟의 예로는 DROP, DENY, ACCEPT, LOG 등등이 있습니다.

7. 요약
iptables의 기본적인 사용법은 다음과 같습니다.
iptables [-t 테이블] [명령어] [매칭옵션]
테이블은 filter, nat, mangle 세 개가 있으며, 명령어에는 -F, -A, -D, -I, -R, -N, -X 등 여러 가지가 있습니다. 각 명령어의 의미는 맨페이지를 참고하시면 됩니다. 위의 명령어중 자주 사용되는 멸령어는 -F (Flush : 체인을 비움), -A(Append : 체인에 룰 추가), -D(Delete : 체인의 룰 삭제) 등이 있습니다. 매칭 옵션은 위에서 언급 했던 것 처럼 일일이 언급하기 어려울 정도로 많이 있습니다. 지정된 매칭 옵션에 따라 해당 명령어를 지정 테이블에 실행 한다고 생각 하시면 됩니다.

예를 들어서 인터넷 공유에 사용되는 마스쿼레이딩 같은 경우는 다음과 같습니다.
#!/bin/sh
echo "1" > /proc/sys/net/ipv4/ip_forward 
/sbin/iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE 
/sbin/iptables -A INPUT -i eth0 -j ACCEPT 
/sbin/iptables -A OUTPUT -o eth0 -j ACCEPT


위의 예제에서 보면 제일 첫 라인은 쉘스크립트를 작성할 때 사용되는 것과 같은 일반적인 것입니다. 두 번째 라인의 에코문은 커널 레벨에서 아이피 포워딩을 해줄수 있도록 하기 위해서 그 셋팅을 ‘1’ 로 해주는 것입니다. 아이피 포워딩이 되지 않으면 내부의 사설 네트워크에 있는 호스트들은 외부로 접속할 수가 없습니다. 세 번째 라인의 iptables문은 "nat테이블에 포스트라우팅체인에 룰을 추가하는데, 그 룰은 외부로 나가는 인터페이스는 eth0에 MAQUERADE를 하게 하라.“ 라는 규칙을 적용하고 있습니다. 마스쿼레이딩은 인터넷 공유시에 많이 사용되는 방법입니다. 네 번째 라인과 다섯 번째 라인은 없어도 무방하지만, 이해를 돕기 위해서 추가하였습니다. 네 번째 라인은 ‘filter 테이블의 INPUT체인에 룰을 추가하는데, 그 룰은 들어오는 인터페이스 eth0에게 모든 패킷을 ACCEPT하게 하라.”라는 규칙을 적용하고 있습니다. 마찬가지로 다섯 번째 라인에서는 ’ filter 테이블의 OUTPUT체인에 룰을 추가하는데, 그 룰은 나가는 인터페이스인 eth0의 모든 패킷들을 ACCEPT하라.“라는 규칙을 적용하고 있습니다.

위의 예제만 이해하신다면 다른 필터링 규칙을 적용하실 수 있을 것입니다. 

블로그 이미지

커뉴

이 세상에서 꿈 이상으로 확실한 것을, 인간은 가지고 있는 것일까?

,