Project/Firewall2010. 7. 5. 22:42
Netfilter Framework를 이용해서 만든 방화벽이다.

Packet Header들을 분석해서 원하는 정보를 추출 후 정책에 알맞게 Filtering할 수 있게 하였는데,
여기서는 IP와 Port 차단만 구현하였다. 이외 시험적으로 시험해 본것은 UPD에서 Word Filtering이 있다.

Netfilter에서 Packet를 얻어 오면 sk_buff 구조체로 들어온다. 이 구조체 안에 NIC를 통해 들어온 Raw 상태의 Packet 데이터가 들어 있다.

Packet에서 Header의 구조



즉 Packet의 Pointer는 IP Header의 Pointer와 같고, TCP/UDP Header의 Pointer를 얻으려면

 struct tcphdr *tcph = (struct tcphdr*)(char*)iph + sizeof(struct iphdr));

와 같이 IP Header의 크기만큼 Pointer를 이동시켜 주어야 한다. TCP/UDP Header 다음에는 Application Layer에서 생성한 데이터를 가리키는 Pointer가 있다.

이번에 제작한 방화벽의 구조는 다음과 같다.

방화벽 구조 1


방화벽 구조 2


일반적인 방화벽처럼 외부 네트워크로부터 Host를 보호하기 위해 네트워크 중간에 위치하여 동작하며, 방화벽의 Rule를 정하기 위하여 외부 Control PC가 존재한다. 

Control PC는 Control Client를 통해서 Host내부의 Daemon과 정보를 주고 받고, Daemon은 실제 방화벽 모듈과 정보를 주고 받는 구조로 되어 있다.

Client 프로그램

Client 프로그램은 서버에 접속 후 서버에서 현재 Filtering하고 있는 IP와 Port의 목록을 얻어와 표시한다. 관리자는 차단을 원하는 IP와 Port를 추가 할 수있다. 삭제도 필요하지만 추가와 구현방법이 다를 것이 없기에 추가만 구현하였다.

실행 결과는 다음과 같다.

IP 차단 테스트

Port 차단 테스트



첫 번째 그림은 방화벽이 설치된 PC의 IP를 차단하였다. 즉 이 PC로 들어오는 모든 Packet은 차단된다. 테스트로 Ping Test를 하였는데, 차단 전에는 잘 되다가 차단 후에는 막히는 것을 확인 할 수 있다.

두 번째 그림은 HTTP Port인 80번 Port를 차단해 보았다. 웹 브라우저를 통해서 접속 테스트를 해 보니 차단되어 접속이 되지 않음을 확인 할 수 있었다.

이번 방화벽 제작 프로젝트는 제작 자체는 그렇게 어렵지 않았지만 기초 지식을 쌓는 데 많은 어려움이 있었다. Packet Capturing을 하기 위해 Netfilter Framework가 필요하다는 사실을 알기까지도 꽤나 많은 시간이 들었고, Module Compile방법, Device Driver의 이해등도 만만치 않은 작업이였다. 또한 socket buffer를 얻고 난 후에 각각의 Header를 알아내는 법을 알기까지도 꽤 오래 걸렸다. 

그리고 처음 하는 단체 프로젝트인데, 이점에서는 완전히 실패하였다. 도중에 인원들이 지쳐서 나가버리고, 팀 간에 불화도 생겨서 많이 안타까웠다. 결국 마지막에는 둘이서 하다가 마무리는 내가 하였는데, 이끌고 있던 내가 좀 더 잘했으면 더 좋은 결과를 낳았을것을 하는 생각이 자꾸만 남는다.


Posted by 머리